1.7
简单对象访问协议
(SOAP)
OAP
是Web
服务消息传输的技术标准。SOAP
是基于XML
的协议,由三个部分组成:
1、
信封,描述消息是什么以及如何处理;
2、
一组编码规则,用于表示由应用程序定义的数据类型的实例;
3、
有关远程过程调用及响应表示的约定;
SOAP
可以与其他多种协议结合使用,但这里只描述了如何结合使用SOAP
和HTTP
。图1.4.1
展示了SOAP
请求的整体结构。
图1.7.1 SOAP
HTTP
请求整体结构
1.7.1
HTTP
协议层
按照
SOAP
规范定义
SOAP
请求需要增加一个
HTTP
协议头
SOAPAction
,用于表示该请求为
SOAP
协议请求,它的值是目标网络端点的
URI
,但是没有对该
URI
的格式、
URI
特性和可解析性做任何限制,当客户通过
HTTP
发送
SOAP
请求时必须使用在
HTTP
头中使用这个头,如果这个头的值为空字符串,那么表明该请求的
URI
和
HTTP
的一致。
1.7.2
SOAP
信封
XML
标签Envelope
是SOAP
协议不可缺少的部分,也是SOAP
协议的根标签,
还需要根据名字空间指定SOAP
的版本。如图1.4.1
示例那样指定SOAP
的版为1.2
,所有用的名字空间为:
http://www.w3.org/2003/05/SOAP-envelope
1.7.3
SOAP
协议头
SOAP
协议头在
SOAP
消息中是可选的。如果需要头,必须是
SOAP
封装元素的第一个直接子元素。
SOAP
头可以包含多个条目,每个都是
SOAP
头元素的直接子元素。所有
SOAP
头的直接子元素都必须指定名字空间。
SOAP
协议头可以用来设置扩展信息,例如
SOAP
协议头可以用于安全认证,可以将用户的角色信息加入
SOAP
头中,
Web
服务可以根据
SOAP
协议头中用户的角色信息来判断是否处理该请求,如清单
1.4.3
在
Head
中指定了用户的角色。
清单
1.4.1 Head
示例
<SOAP-ENV:Envelope
xmlns: SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
< SOAP-ENV:Header>
<lovo:auth xmlns:lovo="http://www.lovoinfo.com">
<lovo:user-role>root</lovo:user-role>
</lovo:auth>
</ SOAP-ENV:Header>
<SOAP-ENV:Body>
……
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
1.7.4
SOAP
协议体
发送
SOAP
消息时,都是有目的性的。需要告诉接收者执行某种操作,或尝试向服务器传递相关信息。此信息称为“有效负载”。有效负载位于
SOAP
的
Body
标记中。它还具有自己的命名空间,在本例中其命名空间与一个网上书店系统对应,在此情况下,可以完全随意地选择命名空间。只需要与
SOAP
命名空间相异即可(请参见清单
1.4.2
)。
清单
1.4.2 SOAP
有效负载
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope">
<env:Header>
...
</env:Header>
<env:Body>
<store:addBook xmlns:store="http://www.lovoinfo.com/book">
<store:category>计算机</store:category>
<store:subcategory>Java</store:subcategory>
<store:author></store:author>
<store:bookName>Thinking in Java</store:bookName>
</store:addBook>
</env:Body>
</env:Envelope>
在此例中,有效负载很简单,其中包含将书添加到网上书店系统的操作请求。如何设计有效负载的选择过程将涉及到
SOAP
的样式和编码。
1.7.5
SOAP
错误响应
上一节中只说明了正常情况下的
SOAP
消息
BODY
中的有效负载,但是系统出现错误和异常是难免的,
SOAP
需要制定专门的机制来处理这些异常,例如客户端发送了一个的
SOAP
请求缺少了必须的内容,服务器端需要通过一个特殊的
SOAP
应答来告诉客户端发生了错误,
SOAP
协议使用一个
Fault
元素作为
Boby
的第一个子元素,
Fault
则相应的包含了出错的具体信息,下面清单
1.4.3
就是一个
SOAP
协议的错误响应。
清单
1.4.3 SOAP
协议的错误响应
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope">
<env:Header>
...
</env:Header>
<env:Body>
<env:Fault>
<faultcode>Client</faultcode>
<faultstring>incorrect information</faultstring>
<faultactor>Undefine</faultactor>
<detail>
The request message was contained incorrect information
</detail>
</env:Fault>
</env:Body>
</env:Envelope>
Fault
元素可以有如下的子元素:
子元素
|
描述
|
<faultcode>
|
供识别故障的代码
|
<faultstring>
|
可供人阅读的有关故障的说明
|
<faultactor>
|
有关是谁引发故障的信息
|
<detail>
|
保存涉及
Body
元素的应用程序专用错误信息
|
1.7.6
SOAP
样式
在介绍
WSDL
部分将更深入地了解此主题的内容,但在创建应用程序时,您将需要确定要发送和接收的实际有效负载的结构。为此,需要了解一下编程样式和编码。
简单来说,有两种不同的主流
Web
服务编程样式。第一种是
RPC
样式,在此样式中,基本思路是在向服务器发送命令调用方法(如“添加新书”),往往用
Body
元素的第一子元素表示方法名,并将该命令的参数(如要添加的新书和应该添加到的类别)作为整个方法的子元素包含在其中,如清单
1.4.2
中所示。
RPC
样式的替代方法将数据直接作为
SOAP
体的内容处理(请参见清单
1.4.4
)。
清单
1.4.4
文档样式的
SOAP
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope">
<env:Header>
...
</env:Header>
<env:Body>
<newBook>
<category>计算机</ category>
<subcategory>Java</subcategory>
<author></author>
<bookName>Thinking in Java</bookName>
</newBook>
</env:Body>
</env:Envelope>
在这种情况下,消息本身并不包含有关数据所提交到的进程的信息,此工作由路由软件进行。例如,所有对特定
URL
或端点的调用都可能指向特定的操作。
1.7.7
SOAP
消息交互模式
发送消息的方式有很多选择,可以发送请求并等待响应,发送请求但不等待响应,发送请求并在到达最终的目的地前通过多个中间层。但就实质而言,只有两个选择:
-
请求/
响应
:在请求/
响应模式种,以 SOAP
消息的形式发送请求,然后直接等待发送回响应。请求可以为同步的,也可以是异步的。
-
单向消息传递
:发送请求但并不等待响应。可以在仅传递信息时或并不关心接收者对此如何响应时使用此方法。
现
在,请注意并没有使用术语“
客户机”
和“
服务器”
。之所以这样,是因为这些消息交换模式几乎可以用于创建与上面提到的方法类似的任意数量的不同备选方法。例如,可以发送一条请求,然后依靠接收者对其进行处理,并在将来完成应完成的工作时发送一条消息。为此,将使用多个单向消息的组合,因此谈“
客户机”
和“
服务器”
并不合理,因为每个消息都有其接收方和发送方,所谓的客户机和服务器的位置会发生对换。
1.8
WEB
服务描述语言
(WSDL)
Web
服务的目的是为了解决企业级应用中的异构系统之间的通信问题,要实现通信首先明确通信的消息是什么,格式如何,然后需要对消息中所包含数据的类型进行说明,接着需要说明具体提供服务的接,最后是说明接口所包含操作与消息的关系。作为异构系统的说明书,
WSDL
需要能够被多种技术平台和语言读懂,所以采用了
XML
作为
WSDL
格式。图
1.8.1
展示了
WSDL
的基本结构。
图
1.8.1WSDL
基本结构
清单
1.5.1
展示了
WSDL
文档的基本结构
1.8.1
数据类型
这里要定义
XML
的数据类型,毫无疑问将使用
XSD
来进行定义。例如网上书店有一个
Web
服务提供给出版社用于添加新书,这个
Web
服务采用
RPC
样式,那么这个服务的
WSDL
数据类型定义部分如清单
1.5.2
。
清单
1.5.2
网上书店添加新书的数据定义
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns1="http://www.lovolinfo.com/bookstore"
targetNamespace="http://www.lovolinfo.com/bookstore/xsd">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lovolinfo.com/bookstore/xsd"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<xs:element type="ns1:AddNewBook" name="AddNewBook" />
<xs:complexType name="AddNewBook">
<xs:sequence>
<xs:element type="xs:string" name="category" />
<xs:element type="xs:string" name="subcategory" />
<xs:element type="xs:string" name="author" />
<xs:element type="xs:string" name="bookName" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
</wsdl:definitions>
从代码的起始处开始,请注意有两个命名空间部分。第一个位于
schema
元素本身中。此处定义了两个命名空间。第一个命名空间是
XML Schema
命名空间,使用前缀
xs:
。第二个命名空间是
targetNamespace
,定义模式创建的定义所属的命名空间。也就是说,当第二个版本创建名为
AddNewBook
的
complexType
时,该定义属于命名空间
http://www.lovolinfo.com/bookstore/xsd
。不过,为了引用该命名空间,需要创建另一个别名。可以在以
ns1:
为前缀的
definitions
元素上看到此别名。后面两个属性
elementFormDefault
和
attributeFormDefault
表示元素和属性是否应该有命名空间前缀。
在
XML
中,经常有必要为各种元素和属性指定“命名空间”。这样就能方便地对具有相同名称但用途不同(来源也可能不同)的元素进行区分。
XML
通过
URI
引用命名空间。例如,
XML
模式命名空间为
http://www.w3.org/2001/XMLSchema
。不过,为了方便起见,还为其分配了一个别名(或前缀)。例如,此处的模式命名空间的前缀为
xs:
。请记住,别名只是一个别名而已,重要的是
URI
。因此,属于
ns1:
命名空间的元素或属性也是模式的
targetNamespace
的一部分。
1.8.2
定义消息
定义好了数据类型,接下来就是定义消息,我们将在清单
1.5.2
的基础上增加上有关消息的定义,如清单
1.5.3
为增加新书服务定义了请求消息和应答消息,相应的也增加了应答消息的数据类型定义。
清单
1.5.3
定义消息
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns1=" http://www.lovolinfo.com/bookstore"
targetNamespace="http://www.lovolinfo.com/bookstore/xsd">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lovolinfo.com/bookstore/xsd"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<xs:element type="ns1:AddNewBook" name="AddNewBook" />
<xs:complexType name="AddNewBook">
<xs:sequence>
<xs:element type="xs:string" name="category" />
<xs:element type="xs:string" name="subcategory" />
<xs:element type="xs:string" name="author" />
<xs:element type="xs:string" name="bookName" />
</xs:sequence>
</xs:complexType>
<xs:element type="ns1:AddNewBookResult" name="AddNewBookResult" />
<xs:complexType name="AddNewBookResult">
<xs:sequence>
<xs:element type="xs:string" name="result" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="AddNewBookRequestMessage">
<wsdl:part name="part1" element="ns1:AddNewBook"/>
</wsdl:message>
<wsdl:message name="AddNewBookResponseMessage">
<wsdl:part name="part1" element="ns1:AddNewBookResult"/>
</wsdl:message>
</wsdl:definitions>
每个消息都具有一个
name
,以便稍后对其进行引用。在每个消息内,您可以定义一个或多个
part
。请注意,
WSDL 2.0
仅允许每个消
€
息包含一个
part
,因此此处严格遵循了此约定。
每个
part
都有一个
name
,而由
element
的名称组成该
part
。元素名称将反过来引用在数据类型中定义的类型。请注意,元素的名称以
ns1:
为前缀,即与模式的
targetNamespace
匹配的命名空间前缀。也就是说,当创建
AddNewBookResponse
的定义时,该定义进入了
http://www.lovolinfo.com/bookstore/xsd
名字空间中,由于前缀
ns1:
也引用此命名空间,因此现在可以使用该前缀引用此命名空间。
1.8.3
接口定义
仅仅有数据类型和消息还能完成对服务的定义,需要描述
Web
服务提供那些操作(方法)来处理这些消息。而
WSDL
的接口定义部分就是用于描述
Web
服务所提供操作(方法)。如清单
1.5.4
增加了对网上书店增加新书服务提供的操作进行了定义。
清单
1.5.4
接口定义
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns1=" http://www.lovolinfo.com/bookstore"
targetNamespace="http://www.lovolinfo.com/bookstore/xsd">
<wsdl:types>
... ...
</wsdl:types>
<wsdl:message name="AddNewBookRequestMessage">
<wsdl:part name="part1" element="ns1:AddNewBook"/>
</wsdl:message>
<wsdl:message name="AddNewBookResponseMessage">
<wsdl:part name="part1" element="ns1:AddNewBookResult"/>
</wsdl:message>
<wsdl:portType name="NewBookPortType">
<wsdl:operation name="AddNewBook">
<wsdl:input message="tns:AddNewBookRequestMessage" />
<wsdl:output message="tns:AddNewBookResponseMessage" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
这里描述了新书服务的一个增加新书的操作,这是一个请求
/
应答型的操作,如果去掉
<wsdl:output
message="tns:AddNewBookResponseMessage" />
则成了一个单路的操作。
1.8.4
定义绑定
我们已经定义了消息以及服务提供的操作,但是还是没有明确每个操作的具体实现,采用什么样的服务样式以及使用何种协议。清单
1.5.5
展示将新书服务中的增加新书操作与
SOAP
协议绑定在一起并定义了将采用文档的服务方式而不是
RPC
的方式。
清单
1.5.5
定义绑定
<wsdl:binding name="NewBookServiceBinding"
type="tns:NewBookPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<wsdl:operation name="AddNewBook">
<soap:operation soapAction="AddNewBook" style="document"/>
<wsdl:input>
<soap:body use="literal"
namespace="http://www.lovoinfo.com/book"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"
namespace="http://www.lovoinfo.com/book" />
</wsdl:output>
</wsdl:operation>
</soap:binding>
</wsdl:binding>
首先,请注意绑定
type
引用
已经创建的
NewBookPortType
。其次,请注意添加了
soap:
命名空间。此
binding
用于
HTTP
上的
SOAP
消息,如
soap:binding
元素中所示。请注意
transport
属性。对于共享其在
portType
中的名称的每个操作,
现在都要添加一个
soap:operation
元素。此元素执行两个操作。根据此元素的说明,第一个操作实际上是
SOAP
操作。第二个操作用于指定
soapAction
,此为在实际
SOAP
消息前发送的
HTTP
协议头。服务器可以使用此协议头来将请求路由到相应的操作。请注意,
soapAction
始终有一定的问题,虽然在
WSDL 1.1
是可选的,但已经完全从
WSDL 2.0
中删除了。每个操作还定义
input
和
output
消息(或者,使用仅输入的消息时,只定义
input
消息),但现在
还将添加特定的
SOAP
信息。此元素还为有效负载的内容定义命名空间。
特别需要说明的是
operation
标记的
style
属性和
body
标记的
use,
这两个属性决定着这个
WEB
服务所使用的样式和编码规则。正如上文所提到的那样,
SOAP
有两种使用样式一种为
RPC
另一种为文档模式,这里的
style
就是来指出该操作上所有绑定的
SOAP
是属于那种使用样式。而
use
属性是用来指定
SOAP body
中有效载荷的编码,其取值有两个:
-
Literal,
表明
SOAP body
中的内容是没有编码的,仅仅是一个
xml
文档而已;
-
Encode
:表明
SOAP bocy
中的内容是有一定编码规则的。
style
和
use
取不同的值,就可以组合出多种的
SOAP
协议样式和编码,因为具体的样式和编码都是开发框架和
Web
服务运行环境来决定的,对于
Web
服务的开发和使用者来说做到有所了解就可以了
1.8.5
服务定义
最后,还需要对整个
Web
服务进行说明。服务定义包含了定义服务的
URL
采用具体的那个绑定,清单
1.5.6
是增加新书服务的定义。
清单
1.5.6
增加新书服务定义
<wsdl:service name="NewBookService">
<wsdl:port name="NewBookPort" binding="tns:NewBookServiceBinding">
<soap:address location="http://www.lovoinfo.com/bookstore" />
</wsdl:port>
</wsdl:service>
服务可以具有多个端点,每个端点都由其自己对应的
port
元素进行定义。
port
元素与特定绑定对应,包括有关如何访问此绑定的信息。在本例中,指定可以通过
SOAP
在以下位置访问该端口:
http://www.lovoinfo.com/bookstore
。
至此,我们已经对
Web
服务的两个重要规范有了一定的了解,接下来,我们将采用契约优先的方式通过
spring-ws
框架构建一个
WEB
服务以加深对
WEB
服务的理解。
- 大小: 52.1 KB
- 大小: 14.5 KB
- 大小: 35 KB
分享到:
相关推荐
大华无插件播放项目111
内容概要:本文详细介绍了Oracle 19c数据库的备份恢复和导入导出操作。首先概述了基本命令,然后分别讲述了三种工作方式(交互式、命令行、参数文件)和三种模式(表、用户、全库)。接着介绍了高级选项,如分割成多个文件、增量导出/导入、以SYSDBA进行导出/导入、表空间传输等。最后讨论了优化技巧,包括加快导出和导入速度的方法。还解决了一些常见问题,如字符集问题和版本问题。 适用人群:Oracle数据库管理员和相关技术人员。 使用场景及目标:适合在日常数据库管理和维护中进行数据备份、恢复、导入和导出操作,提高数据安全性和管理效率。 其他说明:文章内容丰富,涉及多种实用技巧,适用于不同场景下的具体操作,有助于提升工作效率。
基于Python Flask开发的旅游酒店大数据可视化项目,可以直接运行。 操作步骤: 1. 解压缩项目文件 2. 使用 pycharm打开项目 3. 运行项目中的app.py文件 注意:需要确保项目的Flask Python相关的环境已经搭建完成。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告,个人高分设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的学生和需要项目实战练习的学习者。 基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告基于stm32和openmv的电赛校赛自动泊车题目源码+文档设计报告个人高分设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的学生和需要项目实战练习的学习者。 个人高分设计项目、经导师指导并认可通过的高分设
棉花检测20-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar棉-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括406张图像。 以可可格式注释棉花。 将以下预处理应用于每个图像: 没有应用图像增强技术。
项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!
windwos环境下python 3.11系列64位安装包,仅推荐个人学习、开发、娱乐或者测试环境下使用。
使用精品酒销售管理系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有:主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的收藏管理、订单管理等。 前台首页可以实现商品信息、新闻资讯、我的、跳转到后台、购物车等。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
Video_2024-12-18_000023.wmv
ppt最終版asasaadd
计算机图形学期末考试
springboot-基于SpringBootVue的家具商城系统设计与实现.zip
PenTablet_5.2.4-5.zip
考虑了企业管理者的实际工作环境和需求,最终将人力资源系统划分为5个部分,即登录模块、组织发展模块、员工团队模块、合同管理模块、党建管理模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
QT音乐播放器MP3 可点击播放可上一首下一首可调节音量 可暂停可上传音乐
椅子检测6-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar对象检测实验室-V1 2023-08-21 2:28 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括997张图像。 对象以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: *将盐和胡椒噪声应用于10%的像素
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
Altas PF拧紧枪 OP协议,开发协议