WebServicer的JAVA客户端代码生成方式总结
一、Webservice可以使用的框架很多。AXIS、CXF 、JAX、XFIRE,这些框架都可以根据wsdl文件生成ws的服务器和客户端代码。
二、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响应报文字符串