Web Service 的 Client 和 Server 端 之间的通信 分为下面4步骤:
1、client 向 server 发送一个get请求,希望得到 web service 的 wsdl 文件。
2、server 传给 client wsdl 文件。
3、根据wsdl文件,client向server发送调用请求(soap)。至于传送soap请求 的 方式,可以是http ftp 等等
4、server 运算结束后,回传 soap response 给 client。
为了查看soap的请求和响应,可以在server端加入log拦截器,输出 请求响应。做法如下:
在MainServer.java中,加入
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorldImpl.class);
factory.setAddress("http://localhost:8080/HelloWorld");
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
Server server = factory.create();
server.start();
其他不变,启动server,运行client代码,在server端的console可以看到:
----------------------------
ID: 1
Address: /HelloWorld
Encoding: UTF-8
Content-Type: text/xml; charset=UTF-8
Headers :
{
Content-Length=[193],
Host=[localhost:8080],
User-Agent=[Apache CXF 2.2.3],
connection=[keep-alive],
SOAPAction=[""],
Pragma=[no-cache],
Content-Type=[text/xml;
charset=UTF-8],
content-type=[text/xml; charset=UTF-8],
Cache-Control=[no-cache], Accept=[*/*]
}
Payload :
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:sayHello xmlns:ns2="http://cxf.webservice.test/">
<arg0>CY</arg0>
</ns2:sayHello>
</soap:Body>
</soap:Envelope>
--------------------------------------
sayHello is called.
2009-8-20 20:40:18 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose
信息: Outbound Message
---------------------------
ID: 1
Encoding: UTF-8
Content-Type: text/xml
Headers : {}
Payload :
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:sayHelloResponse xmlns:ns2="http://cxf.webservice.test/">
<return>Hello CY !</return>
</ns2:sayHelloResponse>
</soap:Body>
</soap:Envelope>
--------------------------------------
从上面的输出,我们可以清楚的看到 soap协议是怎样包装信息进行传递的。soap中的各种标签显然从开始得到的wsdl文件中拿到。
JAX-WS 和 JAXB
Java API XML for Web Services
这里面定义了 和 web service 相关的 annotation的使用
Java API XML for Binding
这里面定义了 java对象 和 xml 之间的转换。有很多的转换规则 和 设定。