📄 17. webservice note.txt
字号:
八、 SOAP Header
1) header是envelope中可选的元素,假如出现的话,这个元素必须是SOAP envelope中第一个出现的子元素;
2) 所有header元素的子元素称为header条款;
3) header也能装载认证数据,数字签名,编码信息以及传输设置;
4) header也能装载客户端或项目-指定控制以及协议的扩展;header的定义并不取决于body。
1.可选的,用于扩展SOAP消息,例如:
调用的上下文 目前的应用模式基本上停留在远程过程/对象的调用上,
基于多次协调调用或者遵循上下文的调用模式尚很少使用,这其实是受简单的SOAP消息的制约
安全认证 保存用户标识及密码信息或者其他鉴定证书
事务控制 利用SOAP Header条目进行事务控制
其他高级语义功能
2.SOAP Header由一些Header条目组成
<env:Header xmlns:env="http://www.w3.org/2001/06/soap-envelope" >
<auth:authentication xmlns:auth="http://example.org/authentication"
env:role="authentication:signin_service" env:mustUnderstand="1" relay="" >
<auth:userID>testuserid</auth:userID>
<auth:password>[encodedPassword]</auth:password>
<auth:redirection>http://example.com/service/</auth:redirection>
</auth:authentication>
</env:Header>
3.role属性:(next|none|ultimateReceiver)
指定这个条目必须被哪种角色处理
4.mustUnderstand:(true|false)
处理节点必须被处理,如果处理节点理解不了,必须返回一个SOAP Fault. (此时relay无意义)
5.relay:(true|false)
处理节点理解的条目,将会保留,并转发给下一个SOAP节点处理
九、 SOAP Body
必须的,包含传递给最终的节点的实际信息
1) SOAP body元素提供了一种机制用以交换信息;
2) body元素是SOAP envelope元素的下一级元素;
3) 假如存在header元素,body元素应该紧跟header元素之后。否则它应该紧跟envelope元素之后。
4) 所有body元素的下一级子元素称为body的条目,这些条目各自独立;
5) 在大多数简单的情况下,基本SOAP消息的body组成:
一个消息名称;
一个服务实例的引用;
6) 在Apache SOAP中,一个服务实例为它的URN所标识。这个引用编码为名域空间的属性。
7) 一至多个参数里装载着值和可选的类型引用;
8) 典型的body元素使用包括用相应的参数调用RPC、返回结果及错误报告;
9) 消息可以包括几乎任何XML结构,除了DTD及处理说明。
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
十、 SOAP Fault
可选的,元素用于存留 SOAP 消息的错误和状态信息。必须出现在SOAP Body中
<soap:Body xmlns:m="http://www.example.org/stock">
<soap:Fault>
<faultcode>MustUnderstand</faultcode>
<faultstring>
一个或多个必须的soap头未被理解
</faultstring>
</soap:Fault
</soap:Body>
<faultcode> 供识别故障的代码
<faultstring> 可供人阅读的有关故障的说明
<faultactor> 有关是谁引发故障的信息
<detail> 存留涉及 Body 元素的应用程序专用错误信息
faultcode的值:
VersionMismatch: SOAP Envelope 元素的无效命名空间被发现
MustUnderstand: Header 元素的一个直接子元素(带有设置为 "1" 的 mustUnderstand 属性)无法被理解。
Client: 消息被不正确地构成,或包含了不正确的信息。
Server: 服务器有问题,因此无法处理进行下去。
十一、SOAP HTTP Binding
HTTP + XML = SOAP
SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。
HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。
1. SOAP请求
POST /soapsamples/servlet/rpcrouter HTTP/1.0
Host: localhost
Content-Type:
text/xml:charset=utf-8
Content-Length: 460
SOAPAction: "" IBM
1) SOAP请求表明getQuote方法从以下地址调用:http://localhost/soapsamples/servlet/rpcrouter
2) SOAP协议并没有指定如何处理请求,服务提供者可运行一个CGI脚本,调用servlet或执行其它产生对应响应的处理;
3) 响应包含于一个XML文档格式的表单内,该表单包含了处理的结果,在我们这个范例中是IBM的股价;
2. SOAP响应
HTTP/1.1 200 OK
Server: IBM HTTP SERVER/1.3.19 Apache/1.3.20 (Win32)
Content-Length: 479
Connection: close
Content-Type: text/xml; charset = utf-8
Content-Language: en 108.53
1) 结果所位于的元素名称在请求方法名后加后缀“Response”,
例请求方法名为:getQuote, 响应方法名为:getQuoteResponse。
3. Http响应状态
1) 1XX——information
2) 2XX——success
3) 3XX——redirection
4) 4XX——client error
5) 5XX——sever error
part3. Web Service关键技术 --- WSDL
-----------------------------------------------------
1. What is WSDL(Web Service Description Language) ——Web服务描述语言
WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。
一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码
1) WSDL是以XML为基础的接口定义语言,它提供了一种分类和描述Web service的方式;
描述Web服务 和说明如何与Web服务通信的XML语言
2) WSDL定义了 Web service的接口,包括:
a. 操作方式(单向、通知、请求-响应);
b. 定义了Web service的消息;
c. 数据类型(XML schema);
Web service访问协议(SOAP over HTTP);
Web service联系的终点(Web service URL);
符合要求的服务端应用程序必须支持这些接口,客户端用户能从这份文档中得知如何访问一个服务。
2. WSDL文档结构
<definitions>
<types> definition of types........ </types>
<message> definition of a message.... </message>
<portType> definition of a port....... </portType> //代表interface:接口
<binding> definition of a binding.... </binding>
<service> service of a binding.... </service>
</definitions>
总体上可以分为两大部分:
1)抽象定义
定义要交换的数据格式(数据类型/参数/返回值/方法声明)
types 定义数据类型,使用XML Schema作为类型系统
messages 定义要交换的数据,数据类型是types中定义的数据类型。对应方法的参数
包括若干个part,每个part 都对应types中定义一个元素。对应方法的一个参数
porttype(接口) 包含若干 operation;定义一个服务,对应Java的接口
包含一些operation,operation对应Java的方法
operation 都包含一个input 和 output 消息(messages中定义)
2)具体描述
定义要采用的互操作协议(soap)、传输协议(http,ftp,smtp 等)、声明服务的访问地址
binding 针对 porttype 定义协议绑定和数据格式的细节:
首先是定义消息风格(style) 和 传输协议(transport)
然后是对操作的输入输出的 消息编码方式(use)
service 包含若干 port
port 定义了一个通信端点,代表 binding(不同协议)到 address 的映射
使用XFire开发Web Service
XFire是一个开源的Web Service框架
operation的四种类型:
单向: 端点接收请求消息
请求/应答: 端点接收请求消息,然后返回一个响应消息
通知: 断点发送一个消息
要求/响应: 端点发送请求消息,然后接收一个响应消息
SOAP的两种消息风格
style=[document|rpc]
document: 客户端使用 XML 模式调用约定。优点:更松散的客户端和服务器端耦合性,跨平台互操作性更好
分两种: bared(裸露); wrapped,模拟rpc(包装的)
rpc: 客户端使用远程过程调用约定。 优点:对开发人员更加简单.
binding的传输协议
transport="http://schemas.xmlsoap.org/soap/http"
transport="http://schemas.xmlsoap.org/soap/smtp"
binding中消息的编码方式
user=[literal|encoded]
literal: 使用types定义的数据类型
encoded: 使用soap定义好的数据类型,不能使用自定义数据类型
可能的style/user组合
1. style="rpc" and use="encoded"
2. style="rpc" and use="literal"
3. style="document" and use="encoded"
4. style="document" and use="literal"
其中WS-I组织只支持(user=literal)格式;(user=encoded不被支持)
WS-I(Web Services Interoperability Organization) Web服务协同组织
尽量使用第4种: style="document" and use="literal"
part4. Web Service关键技术 --- UDDI
-----------------------------------------------------
一、 What is UDDI (Universal Description Discovery and Integration)
1) 即统一描述、发现和集成协议。
2) UDDI提供了一种发布和查找Web服务的方式,使贸易伙伴彼此发现对方和查询对方。
3) UDDI提供了一个全球的、平台无关的、开放式框架,使得商业应用能:
相互查找;
定义它们通过Web交互的方式;
在一个全球注册场所共享信息;
4) 在Web上存在三种开放的UDDI注册场所, 由IBM、Microsoft 和HP发起;
5) 注册是免费的,在任一注册处注册的内容被其它注册处所复制;
6) 在UDDI商业注册处提供的信息由三部分组成:
“白皮书”:(白页 White pages)包括地址、联系以及标识符、产品信息;
“黄皮书”:(黄页 Yellow pages)包括基于标准分类学的各产业分类;
“绿皮书”:(绿页 Green pages)所提供的service的详细信息;
7) Web service provider 和 requester 使用SOAP API和UDDI注册处交流;
预想的结构:发布者--注册服务--使用者
不是必须的,公共的注册服务目前还没有被广泛接受
UDDI的数据结构
1. businessEntity. 白页信息,公司的信息
2. businessService.黄页信息,Web服务的分类信息
3. bindingTemplate. 绿页信息,Web服务的技术信息,包括如何调用Web服务的信息
4. tModels. 调用细节信息,包含WSDL文档的引用。
XFire动态客户端
-----------------------------------------------------
第一步:引入 XFire相关的类库
Core Libraries
JAXB Libraries
HTTP Client Libraries
第二步:
Client client = new Client(new URL("WSDL文档URL")); //创建一个动态客户端
Object[] results = client.invoke("test", new Object[] { "Juliet" }); //调用方法
System.out.println( results[0]);
XFire动态客户端2
Service srvcModel = new ObjectServiceFactory().create(MathService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
// HelloWorld 服务名称
String helloWorldURL = "http://localhost:8081/Hello/services/HelloWorld";
IHelloWorld srvc = (IHelloWorld) factory.create(srvcModel, helloWorldURL);
System.out.println("结果 :" + srvc.example("tarena"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -