1.什么是soap
2.为什么使用它
3.SOAP 消息结构
4.SOAP HTTP 协议
5.SOAP 实例:请求与响应
6.java发布服务实例
相关知识
1.Web Service
也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。
2.XML(Extensible Markup Language)
扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
3.Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
4.WSDL:(Web Services Description Language)
WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。它描述了怎么样连接到提供者,标准化了操作的输入输出参数的表示,以及服务的协议绑定和消息在线传输的方法,使得不同客户端自动理解如何与web服务交互。
5.UDDI:统一描述、发现和集成
文档UDDI用于与注册表通信的协议,是一个全球性的公共在线目录,为企业通过了统一的方式来描述他们的服务、查找其它公司的服务,以及详细的了解如何与实现服务的软件连接和交互。目的是只要符合UDDI技术标准的网上注册服务,那么任何一个客户程序都能够访问的到。UDDI注册表是web服务的一个实例,它的表项可以用基于soap的接口来发布和查询。
什么是soap
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
或者更简单地说:SOAP 是用于访问网络服务的协议。
SOAP 指简易对象访问协议
SOAP 是一种用于发送消息的格式
SOAP 被设计用来通过因特网进行通信
SOAP 独立于平台和语言
SOAP 很简单并可扩展
SOAP 允许绕过防火墙
为什么使用soap
使程序间进行因特网通信
远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。
通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。
一句话总结就是:SOAP 是用于访问网络服务的协议。可以跨平台、跨语言,安全,兼容,把成熟的基于HTTP的WEB技术与xml的灵活性和可扩展性组合在了一起,使存在的应用能被更广泛的用户所使用
SOAP 消息结构
SOAP 请求是一个HTTP POST请求,请求的content-type必须用text/xml
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
1.必需的 Envelope 元素,把此 XML 文档标识为一条 SOAP 消息的顶级元素
2.可选的 Header 元素,包含头部信息<为了在松散环境下和通信双发尚未达成一致情况下为SOAP消息增加特性的通用机制 ,一般为了身份验证>
3.必需的 Body 元素,包含所有的调用和响应信息的一个容器
4.可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
xmlns是XML NameSpace的缩写,表示xml命名空间
Envelope和body元素是以soap为前缀的
其中,qqCheckOnline 元素也定义了命名空间,但是并没有设置命名空间前缀,这种设置方式,会把当前元素及所有子元素都归属于该命名空间。
fault元素
SOAP HTTP 协议
HTTP 在 TCP/IP 之上进行通信。在建立连接之后,客户机可向服务器发送 HTTP 请求消息:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
随后服务器会处理此请求,然后向客户机发送一个 HTTP 响应。此响应包含了可指示请求状态的状态代码:
200 OK
Content-Type: text/plain
Content-Length: 200
SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。
RPC + HTTP + XML = SOAP
RPC作为一致性的调用途径,XML作为数据传输格式,HTTP作为底层通信协议
HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。
SOAP 实例:请求与响应
在下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中:http://www.example.org/stock
SOAP 请求:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
SOAP 响应:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
Java发布服务实例
一.发布服务
package com.skd.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
//必须要加注释
@WebService
public class Hello {
public String sayHello(String name){
return "hello " + name;
}
public static void main(String[] args) {
//服务的地址
String address = "http://localhost:8080/hello";
Hello implementor = new Hello();
//发布服务,第一个参数是服务的地址,第二个参数是发布出去服务的方法
Endpoint.publish(address, implementor);
}
}
二.使用eclipse插件访问soap服务
利用JDK注释控制WSDL文件
代码如下:
package com.skd.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(targetNamespace="http://com.wpx",serviceName="WPXService")
public class Hello {
//提供一个合法的web方法
@WebMethod(operationName="myMethod")
@WebResult(name="myRet")
public String sayHello(
@WebParam(name="name")
String name){
return "hello " + name;
}
//排除当前方法
@WebMethod(exclude=true)
public String sayHi(String name){
return "hi " + name;
}
public static void main(String[] args) {
String address = "http://localhost:8080/hello";//服务的发布地址
Hello implementor = new Hello();//提供服务的实例
Endpoint.publish(address, implementor);//发布服务
}
}
发布成功后,我们查看一下WSDL文件的变化: