一、Webservice可以使用的框架很多。AXIS、CXF 、JAX、XFIRE,这些框架都可以根据wsdl文件生成ws的效劳器和客户端代码。
二、Ws的调用方式有三种,    post、    get、soap post。本人建议使用    post,他访问远程ws接口的速度比使用soap post要快些。象使用axis框架实现soap post方式来说,简单的接口还好,对于使用了大量代理类及带有soaphead的ws,且还要在本地生成一大堆JAVA类来和效劳端对应。特别如下这种情况,axis好似无法实现。
Soaphead如下
<soapHead>
<appId>0039434454</appId>
<pwd>67677</pwd>
</soapHead>
象这种只能根据.addHead(ElementSoapHead)来增加报头。但这个报头没有根元素,无法创立一个这种Element。
下面就如何书写客户端代码详细讲解下。
1.通过发送post恳求来调用ws。
SOAPUI是个不错的工具,他可以根据wsdl文件生成测试例子。另外重要的是,它可以生成wsdl对应的恳求报文和响应报文。这样我们在调用别人写的ws时,不管多复杂的ws都可以简单的调用。首先按照SOAPUI显示的恳求报文格式拼装我们的恳求报文,使用对象来发送    post恳求。然后使用输出流、输出流获得响应报文,再用Element解析报文得到要取的数据。例如代码如下:
JAVA类SoapInvoke:
package test;
import
import java.io.OutputStream;
import
import
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();
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="    ://localhost:8080/CXFServer/SayHelloService";
URL u = new URL(url);
URLConnection conn = (    URLConnection) 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 = OutputStream();
if (null != soapHeader) {
byte[] b = String().getBytes("utf-8");
/
/发送soap恳求报文
output.write(b, 0, b.length);
}
output.flush();
output.close();
//定义输入流,获取soap响应报文
InputStream input = InputStream();
int c = -1;
//sb为返回的soap响应报文字符串
while (-1 != (c = ad())) {
sb.append((char)c);如何生成webservice客户端
}
input.close();
}
}
2.通过axis来调用ws。
对于使用了复杂代理类的ws,我们在调用时可以使用AXIS、CXF、xfire架包来自动生成ws客户端JA V A代码。下面以axis为例,来展示。
效劳器端主要JAV A代码
package test;
@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 " + Name());
return retObj;
}
}
客户端:
1)新建wsdltojava.bat文件,放到C盘,文件内容如下:
set Axis_Lib=E:\axis-bin-1_4\axis-1_4\lib
set Axis_Servlet= ://localhost:8080/CXFServer/SayHelloService?wsdl
其中Axis_Lib为本地axis架包的途径;Axis_Servlet为本地ws的URL,这里也可以设置为
此ws效劳器对应的wsdl文件的途径。
2)在DOS里,执行wsdltojava.bat。在C盘根目录下就会生成JA V A客户端的代码了
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 = SayHelloImplPort();
//调用
//WsResult wsResult = stub.sayHelloMr("zhouyun");
InputClass inputClass=new InputClass();
inputClass.setName("zhouyun");
WsResult wsResult = stub.sayHelloMiss(inputClass);
System.out.println("结果是:" + ResultVal());
} catch (Exception e) {
System.out.println(e);
}
}
}
Ps:1.通过命令生成的java客户端代码里SayHelloImplServiceLocator类是调用ws的入口。
2.执行此类,Myelipse控制台会输出Hello,Miss zhouyun,代表调用成功。
JAX、xfire架包生成的客户端代码不能实现代理类输入、输出,只可以实现简单数据类型输入、输出,象String、Map、AaaryList等等。只有axis可以实现代理类的输入、输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。