Webservice
一例子:发布一个webservice服务1.1 服务源码
一接口
@WebService
publicinterface PersonService {
public String add(inta,intb);
}
二实现类
@WebService(endpointInterface="xiao.it.java.PersonService")
publicclass PersonServiceIm implements PersonService {
@Override
public String add(inta, intb) {
System.out.println(a+":"+b);
returna+b+"";
}
}
三发布服务
publicstaticvoid main(String[] args) {
//Endpoint发布服务
//参数解释
//1.address - 服务地址
//2.implementor - 实现类
Endpoint.publish("http://127.0.0.1:12345/cal", new PersonServiceIm());
}
1.2 服务地址
如上图所示,把源码中你发布的服务地址,在浏览器中输入,就可以得到一个服务的wsdl地址,点击这个地址,就可以看到wsdl文件。
二 wsdl文件
通过访问服务给的wsdl路径,我们可以看到如上所示的wsdl信息,如上图所示,从下往上看,总体可以分解为以下几部分。
2.1 service
<service name="PersonServiceImService">
<port name="PersonServiceImPort" binding="tns:PersonServiceImPortBinding">
<soap:address location="http://127.0.0.1:12345/cal"/>
</port>
</service
如上图所示,指定了我们的服务,服务地址 name指定了我们的服务实现类,也就是我们的服务提供类,location指定了我们的服务地址
2.2 binding
<binding name="PersonServiceImPortBinding" type="tns:PersonService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="add">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
binding 指定了服务绑定的借口类型,type指定了接口
Operation 指定了服务提供的方法类型,也就是方法名
Input:指定了我们的输入参数的类型定义
Output: 指定了我们的输出参数的类型定义
2.3 portType
<portType name="PersonService">
<operation name="add">
<input wsam:Action=http://java.it.xiao/PersonService/addRequest message="tns:add"/>
<output wsam:Action="http://java.it.xiao/PersonService/addResponse" message="tns:addResponse"/>
</operation>
</portType>
portType 指定了接口
operation 方法签名
Message 指定了参数
2.4 Message
<message name="add">
<part name="parameters" element="tns:add"/>
</message>
<message name="addResponse">
<part name="parameters" element="tns:addResponse"/>
</message
指定了要传递的参数类型式
2.5 type
<types>
<xsd:schema>
<xsd:import namespace="http://java.it.xiao/" schemaLocation="http://127.0.0.1:12345/cal?xsd=1"/>
</xsd:schema>
</types
定义了参数类型的schema文件的地址http://127.0.0.1:12345/cal?xsd=1
三Schema文件
有对接口与参数的类型,参数名的原始描述。我们考本schema的地址到浏览器中进行访问
如上图所示是schema文件的描述,上面定时了tns:add的参数类型
从参数类型我们可以看出add方法接受两个参数arg0,arg1他们是int类型的
也可看到返回是string类型的,整个过程是通过sop协议来完成的。
四 SOAP报文
4.1 Soap报文拦截工具
如上图所示我们使用tcpmon工具监听TCP请求。我们发现我们拦截到的客户端请求参数的数据格式如下所示。
4.2 请求报文
<?xml version="1.0" ?>
<S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:addxmlns:ns2="http://java.it.xiao/">
<arg0>15</arg0>
<arg1>23</arg1>
</ns2:add>
</S:Body>
</S:Envelope
4.3 响应报文
<?xmlversion="1.0" ?>
<S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:addResponsexmlns:ns2="http://java.it.xiao/">
<return>38</return>
</ns2:addResponse>
</S:Body>
</S:Envelope>
如上所示我们是通过soap约定的方式完成了数据的传递。
4.4 指定schema参数
@WebService
publicinterface PersonService {
@WebResult(name="addResult")
public String add(@WebParam(name="num1") inta,@WebParam(name="num2") intb);
}
我们可以改变webService的接口参数此时生成的schema文档也发生了改变
<!--
Published by JAX-WS RI athttp://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01.
-->
<xs:schema xmlns:tns="http://java.it.xiao/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://java.it.xiao/">
<xs:element name="add" type="tns:add"/>
<xs:element name="addResponse" type="tns:addResponse"/>
<xs:complexType name="add">
<xs:sequence>
<xs:element name="num1" type="xs:int"/>
<xs:element name="num2" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="addResponse">
<xs:sequence>
<xs:element name="addResult" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
此时我们再发送数据的时候
<?xml version="1.0" ?>
<S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:addxmlns:ns2="http://java.it.xiao/">
<num1>15</num1>
<num2>23</num2>
</ns2:add>
</S:Body>
</S:Envelope>
<?xml version="1.0" ?>
<S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:addResponsexmlns:ns2="http://java.it.xiao/">
<addResult>38</addResult>
</ns2:addResponse>
</S:Body>
</S:Envelope>
我们发现如上所示的数据格式,soap数据随接口的改变而改变。
4.5 对象参数schema
@WebService
publicinterface PersonService {
@WebResult(name="addResult")
public String add(@WebParam(name="num1") inta,@WebParam(name="num2") intb);
@WebResult(name="dogs")
public Dog haha(@WebParam(name="name") String name,@WebParam(name="dog") Dog dog);
}
我们会得到不一样的schema文件
<!--
Published byJAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01.
-->
<xs:schema xmlns:tns="http://java.it.xiao/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://java.it.xiao/">
<xs:element name="add" type="tns:add"/>
<xs:element name="addResponse" type="tns:addResponse"/>
<xs:element name="haha" type="tns:haha"/>
<xs:element name="hahaResponse" type="tns:hahaResponse"/>
<xs:complexType name="add">
<xs:sequence>
<xs:element name="num1" type="xs:int"/>
<xs:element name="num2" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="addResponse">
<xs:sequence>
<xs:element name="addResult" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="haha">
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element name="dog" type="tns:dog" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="dog">
<xs:sequence>
<xs:element name="age" type="xs:string" minOccurs="0"/>
<xs:element name="name" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="hahaResponse">
<xs:sequence>
<xs:element name="dogs" type="tns:dog" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
如上所示我们可以看到对象类型返回值类型dogs参数类型是一个tns:dog类型的,此时我们可以看到上面
<xs:complexType name="dog">
<xs:sequence>
<xs:element name="age" type="xs:string" minOccurs="0"/>
<xs:element name="name" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
这个片段对返回类型进行了定义。