WebServicer的JAVA客户端代码生成方式总结
二、Ws的调用方式有三种,http post、http get、soap post。本人建议使用http post,他访问远程ws接口的速度比使用soap post要快些。象使用axis框架实现soap post方式来说,简单的接口还好,对于使用了大量代理类及带有soaphead的ws,且还要在本地生成一大堆JAVA类来和服务端对应。特别如下这种情况,axis好像无法实现。
Soaphead如下
<soapHead>
<appId>0039434454</appId>
<pwd>67677</pwd>
</soapHead>
象这种只能根据org.apache.axis.client.Call.addHead(ElementSoapHead)来增加报头。但这个报头没有根元素,无法创建一个这种Element。
下面就如何书写客户端代码详细讲解下。
1.通过发送http post请求来调用ws。
SOAPUI是个不错的工具,他可以根据wsdl文件生成测试例子。另外重要的是,它可以生成wsdl对应的请求报文和响应报文。这样我们在调用别人写的ws时,不管多复杂的ws都可以简单的调用。首先按照SOAPUI显示的请求报文格式拼装我们的请求报文,使用java.net.HttpURLConnection对象来发送http post请求。然后使用输出流、输出流获得响应报文,再用Element解析报文得到要取的数据。示例代码如下:
JAVA类SoapInvoke:
package test;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class SoapInvoke {
public static void main(String[] args) {
try {
soapSpecialConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void soapSpecialConnection() throws Exception
{
//拼装soap请求报文
StringBuilder sb = new StringBuilder();
StringBuilder soapHeader = new StringBuilder();
soapHeader.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:test=\"http://test/\">");
soapHeader.append("<soapenv:Header>");
soapHeader.append("<spId>zhouyun</spId>");
soapHeader.append("<spPassword>123</spPassword>");
soapHeader.append("</soapenv:Header>");
soapHeader.append("<soapenv:Body>");
soapHeader.append("<test:sayHelloMiss>");
soapHeader.append("<arg0>");
soapHeader.append("<name>zhouyun</name>");
soapHeader.append("</arg0>");
soapHeader.append("</test:sayHelloMiss>");
soapHeader.append("</soapenv:Body>");
soapHeader.append("</soapenv:Envelope>");
//设置soap请求报文的相关属性
String url="http://localhost:8080/CXFServer/SayHelloService";
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setDefaultUseCaches(false);
conn.setRequestProperty("Host", "localhost:8080");
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(soapHeader.length()));
conn.setRequestProperty("SOAPAction", "");
conn.setRequestMethod("POST");
//定义输出流
OutputStream output = conn.getOutputStream();
if (null != soapHeader) {
byte[] b = soapHeader.toString().getBytes("utf-8");
//发送soap请求报文
output.write(b, 0, b.length);
}
output.flush();
output.close();
//定义输入流,获取soap响应报文
InputStream input = conn.getInputStream();
int c = -1;
//sb为返回的soap响应报文字符串
while (-1 != (c = input.read())) {
sb.append((char)c);
}
input.close();
}
}
2.通过axis来调用ws。
对于使用了复杂代理类的ws,我们在调用时可以使用AXIS、CXF、xfire架包来自动生成ws客户端JAVA代码。下面以axis为例,来展示。
服务器端主要JAVA代码
package test;
import javax.jws.WebService;
@WebService
public class SayHelloImpl implements SayHelloService {
public wsResult sayHelloMr(String name) {
wsResult retObj = new wsResult();
retObj.setResultVal("Hello,mr " + name);
return retObj;
}
public wsResult sayHelloMiss(InputClass input) {
wsResult retObj = new wsResult();
retObj.setResultVal("Hello,Miss " + input.getName());
return retObj;
}
}
客户端:
1)新建wsdltojava.bat文件,放到C盘,文件内容如下:
set Axis_Lib=E:\axis-bin-1_4\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://localhost:8080/CXFServer/SayHelloService?wsdl
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -u %Axis_Servlet%
其中Axis_Lib为本地axis架包的路径;Axis_Servlet为本地ws的URL,这里也可以设置为此ws服务器对应的wsdl文件的路径。
2)在DOS里,执行wsdltojava.bat。在C盘根目录下就会生成JAVA客户端的代码了
3)新建一个java类Invoke,代码如下:
package test;
public class invoke {
public static void main(String[] args) throws Exception {
getResult();
}
public static void getResult() {
try {
SayHelloImplServiceLocator svc = new SayHelloImplServiceLocator();
SayHelloService stub = svc.getSayHelloImplPort();
//调用
//WsResult wsResult = stub.sayHelloMr("zhouyun");
InputClass inputClass=new InputClass();
inputClass.setName("zhouyun");
WsResult wsResult = stub.sayHelloMiss(inputClass);
System.out.println("结果是:" + wsResult.getResultVal());
} catch (Exception e) {
System.out.println(e);
}
}
}
Ps:
1.通过命令生成的java客户端代码里SayHelloImplServiceLocator类是调用ws的入口。
2.执行此类,Myelipse控制台会输出Hello,Miss zhouyun,代表调用成功。
3.象JAX、xfire架包生成的客户端代码不能实现代理类输入、输出,只可以实现简单数据类型输入、输出,象String、Map、AaaryList等等。只有axis可以实现代理类的输入、输出。
相关推荐
结合spring使用CXF 2.5 * 做服务端和客户端开发
NULL 博文链接:https://javastudyeye.iteye.com/blog/1297557
产教融合实训基地与实践中心建设逻辑图-可编辑版
产教融合实训基地与实践中心建设逻辑图-可编辑版
idea2025-free.zip
idea2025-free.zip
sop基于灵敏度分析的有源配电网智能软开关优化配置升级1(Matlab代码实现)
内容概要:本文提出了一种基于灵敏度分析的有源配电网智能软开关(SOP)优化配置方法,旨在应对高比例分布式电源接入带来的电压波动与网络损耗加剧等问题。研究以IEEE33节点系统为算例,通过改进的灵敏度分析模型量化各节点对电压和功率流动的影响程度,进而构建SOP选址与定容的优化模型,实现降低网损、改善电压分布及提升系统运行灵活性的目标。全文详细阐述了灵敏度指标的数学推导、目标函数与约束条件的建模过程,并基于Matlab实现了完整的仿真求解流程,具备良好的工程实用性与学术参考价值。; 适合人群:电力系统及其自动化、电气工程等相关专业的硕士博士研究生、科研机构研究人员,以及从事智能配电网规划、运行与优化的工程技术人员。; 使用场景及目标:①研究分布式电源大规模接入背景下配电网的主动调控与优化策略;②指导智能软开关在实际配电网中的科学选址与容量配置;③为相关科研课题提供可复现的仿真案例,支撑学术论文撰写与算法验证。; 阅读建议:建议读者结合提供的Matlab代码与IEEE33节点标准模型进行动手实践,重点理解灵敏度指标的物理意义及其在优化模型中的应用逻辑,关注求解过程中的约束设置与算法收敛性,并可进一步拓展至SOP与储能联合配置、多时间尺度优化等复杂场景进行二次开发与研究。
Ubuntu安装Latex
关于Ubuntu安装Latex的详细记录和排错指南


Web 开发
