JAX-WS支持SOAP1.1,SOAP1.2和HTTP。在之前所写的所有文章中,从没有涉及到跟协议相关的内容。但是JAX-WS默认使用的是SOAP1.1协议。所以之前的所有例子,均是在使用SOAP1.1.
我们也可以使用SOAP1.2,SOAP1.2跟SOAP1.1相比
SOAP1.2建立在XML infoset上,SOAP1.1建立在XML1.0.
SOAP1.2不再需要SOAPAction http heander
SOAP1.2的http contentType为application/soap+xml, 而SOAP1.1使用text/xml.
官网上列出了9点,比较抽象,暂时还用不到。http://www.w3.org/2003/06/soap11-soap12.html
如果使用HTTP内容协议,JAXWS就变成了restful service。
声明内容协议绑定的方式有2种,且优先级由低到高为:
在SEI实现类上使用@BindingType
在sun-jaxws.xml中声明binding
下面,使用官方提供的例子,演示一遍开启soap1.2协议的webservice。
服务器端
SEI实现类
package com.mycompany;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class AddNumbers {
@WebMethod(operationName="add")
public int addNumbers(int number1, int number2) {
return number1 + number2;
}
}
sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
<endpoint
name='soap'
implementation='com.mycompany.AddNumbers'
port='{http://mycompany.com/}soap'
binding="http://www.w3.org/2003/05/soap/bindings/HTTP/"
url-pattern='/soap'/>
</endpoints>
不需要运行wsgen命令,直接打包成math.war,部署到tomcat。
客户端
首先运行wsimport,产生客户端。由于wsgen默认是产生soap1.1的service,忽略soap1.2,需要添加命令参数 -extension 才可以产生soap1.2的service。
然后使用App中的main函数调用生成的客户端。
public class App {
public static void main( String[] args ) throws IOException {
AddNumbers math = new AddNumbersService().getSoap();
math.add(1, 2);
}
}
监听网络查看消息
发出请求
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:add xmlns:ns2="http://mycompany.com/">
<arg0>1</arg0>
<arg1>2</arg1>
</ns2:add>
</S:Body>
</S:Envelope>
返回应答
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Header/>
<S:Body>
<ns2:addResponse xmlns:ns2="http://mycompany.com/">
<return>3</return>
</ns2:addResponse>
</S:Body>
</S:Envelope>
从上面可以看出,SOAP消息实体包在namespace
http://www.w3.org/2003/05/soap-envelope
之中,这表明使用的是soap1.2.