REST如何使用SOAP作为协议?

JavaLearner:

在阅读了很多有关Web服务的文章之后,我知道REST可以使用SOAP作为协议。但是我没有得到,以REST架构风格,SOAP如何以及在哪里适合?

罗曼·沃特纳:

REST是一种体系结构样式,如果正确应用,则可以使客户端与服务器解耦,这与Web浏览器类似,Web浏览器没有特别耦合到任何特定的Web服务器,但耦合到它们交换的媒体类型。另一方面,SOAP是一种协议,该协议在W3C建议中详细描述了预期的语法及其语义,该协议通常被称为将客户端与实现耦合在一起,因为合同通常预先生成为实际针对实际客户端进行编译并与之交互的存根类。 。如果服务接口由于某些原因而发生更改,则较早的实现将肯定会中断。

尽管REST本身不是协议本身(它没有定义要交换的消息的语法或顺序),但是它仍然需要根据协议标准概述的规则使用其他协议。多数情况下,REST API都会将其自身限制为HTTP。根据Roy Fielding的说法,遵循RESTful准则的应用程序不应依赖于单个通信协议,而应支持多个通信协议。这可以是HTTP,SMTP,(S)FTP和其他协议,例如SOAP。

REST施加的主要限制之一是,API必须是超文本驱动的,并支持客户与服务进行交互的冒险。这通常与向客户端提供进一步的URI进行交互,从而允许客户端采取进一步的操作来遵循某个目标。URI的形式不是重要的部分(是否包含动词或与RESTful客户端无关),因为客户端不应该分析URI本身,因此不应该推论某些语义,而应使用伴随的关系名称。如果实际URI由于任何原因而更改,则RESTful客户端仍将能够通过利用关系名称与API本身进行交互,而不必解释URI本身。

除此之外,服务器和客户端可以同意的媒体类型概述了客户端可以采取的进一步操作的知识。媒体类型包含一组处理指令,这些指令告诉接收者如何解释接收到的数据。

REST API响应因此可以包含到客户端可以调用的SOAP端点的链接。内容协商可以告诉客户端需要媒体类型application/soap+xml,这可以为客户端提供线索,表明SOAP 1.2服务位于URI位置。由于SOAP服务通常是通过普通方式HTTP POST调用的,因此服务方法本身的调用并不是真正的问题,这是客户端如何知道要发送的内容以及如何对其进行实际格式化的方式。

尽管SOAP客户端通常是根据存根类编译的,这些存根类实现了通过WSDL取消的特定合同,但是可以通过解释WSDL合同并将必要的信息混合在一起来动态调用服务本身,从而将格式正确的SOAP消息发送给各自的端点。我在这里看到的问题是,虽然可以在URI中轻松定义SOAP服务端点和调用方法,但是通过在该URI ?wsdl的末尾附加a并不一定可以使用合同描述(WSDL),并且因此需要以其他方式指定WSDL合同。

无论是HTML还是在JSON HAL定义链接指示客户端使用某些WSDL合约生成一个适当的消息内容propper属性。不知道profiles是否可以实际填补这个位置。我还不知道目前还有其他媒体类型或协议。因此,这将需要某种隐式(或Fielding称其为“带外”)信息集成到客户端本身,如果某人以不同的方式发布SOAP服务或其合同,则增加了失败的可能性进一步查找该WSDL。

总而言之,尽管REST通常应该能够与SOAP配合使用,但仍需要完成某些工作以支持客户端动态组合向服务IMO发出有效请求所需的必需信息。当提供这种支持时,我看不到通过RESTful客户端发送SOAP消息的主要问题。但是,我还没有看到任何实际的尝试从(真实的)RESTful API调用SOAP的尝试(尽管实际上它们还很稀疏)。通常两者是分开的。尽管已经尝试描述类似于SOAP的REST服务(提示:WADL),但这种方法除了RESTful以外,什么都没有。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用通用协议作为委托?

Swift协议可选函数中如何使用枚举作为参数

使用通用协议作为接口

使用协议以typealias作为属性

如何使用URI作为REST资源?

如何使用 firestore 作为 REST API 的后端

Salesforce SOAP SessionId作为REST令牌

如何使用basicHttpBinding(SOAP,而不是REST)启用Wcf帮助页面

如何在REST App上使用SOAP Web服务

如何同时使用 SOAP WCF 服务和 REST API

如何使用Memcache协议

使用通用协议作为变量类型

如何正确创建使用 HTTPS 而不是 HTTP 作为协议的 WSO2 ESB API?

如何对其他枚举作为关联值的枚举使用可编码协议(嵌套枚举)

如何使用 Swift 协议功能作为 Android 接口侦听器实现?

使用OAuth作为协议并使用OpenAM作为SP进行联合

如何将文件作为SOAP请求传递给Mule SOAP客户端以使用服务

如何使用带有PHP代码的REST API取消Paypal计费协议

如何使用应用服务方法作为 REST API 端点?

如何使用RabbitMQ消息作为“ Rest Api”来查找实体?

javamail 如何使用特定的协议?

如何使用reactJS作为前端和django rest框架作为后端来显示大量数据

如何确定Web服务是REST还是SOAP?

如何在协议的可选方法中将枚举作为参数传递

如何将通用协议作为函数参数传递

如何使用 wso2 将远程 SOAP wsdl 发布到 REST API

如何使用Rest-assured从具有多个名称空间的SOAP XML响应中提取值?

如何在java中使用REST/SOAP获取联邦快递的跟踪细节?

使用协议缓冲区作为通用数据对象?