从MSDN杂志https://msdn.microsoft.com/en-us/magazine/dd315413.aspx和https://msdn.microsoft.com/en-us/magazine/dd942839.aspx我了解
当使用HTTP请求RESTful终结点提供数据时,使用的HTTP动词为GET。
使用REST意味着您可以利用HTTP缓存和其他功能(如条件GET)来帮助扩展服务。其中许多技术无法与SOAP一起使用,因为SOAP仅通过HTTP使用POST。
从Wikipedia页面http://en.wikipedia.org/wiki/Representational_state_transfer
RESTful系统通常但并非总是通过超文本传输协议与网络浏览器用来检索网页并将数据发送到远程服务器的HTTP动词(GET,POST,PUT,DELETE等)进行通信。[
但是使用HTTP POST从资源获取数据是否违反REST体系结构?换句话说,基于SOAP的Web服务是否可以是RESTful?
RESTful和基于SOAP的Web服务之间还有其他区别吗?
我将其发布为答案,因为评论还不够。这是我想为您总结的。
首先,我们将从以下两个参考开始:
http://spf13.com/post/soap-vs-rest
http://blog.smartbear.com/apis/understanding-soap-and-rest-basics/
最后,我想通过说以下内容来开始这篇文章:
SOAP和REST都旨在解决以下问题:两个不同的应用程序,程序或设备如何以一种可扩展且易于理解的方式相互交换和共享数据?
按照设计 的RESTful(重表象小号大老牛逼转让(BOT))服务使用HTTP
和HTTP
动词(GET
,POST
,PUT
,DELETE
)来表示的意图。这些动词非常清楚地向用户指示使用它们时会发生什么。服务器可以使用它们做出先发制人的决定。也就是说,它可以在准备好采取行动之前就做出决定。
考虑到这一点,您必须从用户插入服务帐户访问少量数据。一个GET endpoint/users/account/id
请求或一个POST endpoint/users/account
包含主体的请求中哪个更简单id
?根据REST的定义,该POST
请求违反了REST所暗示的基本协议。即:服务器应该在数据到达之前知道用户的意图。这是REST试图保证的基本基础。
这个事实(从根本上来说)不要求允许RESTful通信指示客户端开始发送数据之前客户端的意图。这允许服务器在消息到达之前很长时间接受和拒绝消息,从而减少了处理负载。
REST的另一个方面(尤其是与Twitter,Facebook和Google API结合使用):RESTful服务的重点和任务在于HTTP
,可以利用HTTP
响应头。也就是说,HTTP 403 Forbidden
如果不允许客户端访问,他们可能会以一条消息作为响应。基于SOAP的服务可能不会。结果消息必须表明这样的结果。
RESTful服务倾向于将HTTP verbs
(或动作)与名词(或实体/对象)相关联。一般而言,复数和单数表示更多关于动作的信息。即GET RootEndpoint/Employees
,期望返回所有雇员(或至少一个符合特定条件的大集团。)而GET RootEndpoint/Employee/12
期望仅返回一名雇员。(通常是ID为12的员工。)
基于REST的服务做一个直接的关联之间HTTP verb
(GET
,POST
,PUT
,DELETE
)和行动。这是两者之间联系的目的:没有什么特别的需要添加到消息正文中以指示用户打算做什么的消息。(我将继续强调这一点。)
REST是专为HTTP
。这是非常擅长的工作。
一般而言,要过滤REST
服务请求,您将包括多个URL段,每个段都指示跟随其后的参数。
我将以Spotify API为例https://developer.spotify.com/web-api/get-playlist/
:
取得播放清单
获取Spotify用户拥有的播放列表。
终点
GET https://api.spotify.com/v1/users/{user_id}/playlists/{playlist_id}
请求参数
+---------------------------------------------------+ | Path parameter | Value | +---------------------------------------------------+ | user_id | The user's Spotify user ID. | | playlist_id | The Spotify ID for the playlist. | +---------------------------------------------------+
在这种API端点,您可以指定你正在寻找一个users
有对象user_id
的{user_id}
,以及playlists
对象(即内users
与对象)playlist_id
的{playlist_id}
。
某些RESTful服务允许在参数上使用组合标志。
以Stack Exchange API为例。您可以使用分号将多个问题或答案分开,这样基本上可以过滤出这些问题或答案。
如果我们分析此端点(/ questions / {ids} / answers),您将看到它指定:
获取ID中标识的一组问题的答案。
如果您有一组有趣的问题,并且希望一次获得所有答案,或者要轮询新答案或更新答案(与sort = activity结合使用),则此方法最有用。
{ids}
最多可以包含100个以分号分隔的ID,以便以编程方式查找question_id
问题对象上的ID 。此方法接受的排序对答案对象的以下字段进行操作:
这也是API的一个很好的例子,它允许其他GET
请求进一步过滤/排序结果。
用法示例: https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow
现在,如果对/ answers / {ids}端点执行相同的操作,则可以提出以下类似的建议:https://api.stackexchange.com/2.2/answers/30582379;30581997;30581789;30581628?order=desc&sort=activity&site=stackoverflow
。这为我们拉出了四个指定的答案。
例如,我们甚至可以与SE API结合使用,并包含过滤器以限制返回的字段:https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow&filter=!)V)P2Uyugvm
。(有关该filter
参数的说明,请参见/2.2/filters的链接。)
输入SOAP(š imple ö bject甲CCESS P rotocol),这是前身REST。SOAP通过来回发送消息解决了这个问题。他们使用XML
(尽管您可以不使用SOAP来构建基于SOAP的服务,就像不使用即可构建RESTful服务一样JSON
)来交换消息,从而使服务器无法初步指示要做什么。
基于SOAP的服务以与传输介质无关的方式解决了此问题。服务器和客户端不需要使用HTTP
,甚至根本不需要TCP
。他们只需要使用相同或兼容的传输介质。实际上,您可以将现代公司环境视为基于SOAP的服务。当您需要新的耗材时,您可以向办公室经理提出请购单,然后由他来回答。收到初始申请后,您的经理不知道是否允许。他们必须阅读其余申请,以确定该请求是有效请求还是无效请求。
SOAP是围绕RPCs
(远程过程调用)而设计的,许多防火墙阻止了它们。因此,结果,SOAP被修改为可以工作HTTP
。它旨在集成多种不同的技术。
因为SOAP是围绕信息设计的,它是一个多详细的服务更多。通常,在SOAP服务中表示复合动作比较容易。也就是说,如果您基于许多标准(而不只是一个标准)进行请求,则SOAP往往具有更好的接口。objects
基于SOAP的服务使用RPC中的其他字段进行过滤。这些字段的组合方式取决于提供商。
我将从全球天气API中获取一个示例:http : //www.webservicex.net/globalweather.asmx ? op= GetWeather:
获取天气
获取全球所有主要城市的天气报告。
测试
要使用HTTP POST协议测试操作,请点击“调用”按钮。
+---------------------------------------------------+ | Parameter | Value | +---------------------------------------------------+ | CityName: | | | CountryName: | | +---------------------------------------------------+
例如,如果指定“ Blanding”和“ United States”,您将看到生成的XML如下所示:
<?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <GetWeather xmlns="http://www.webserviceX.NET"> <CityName>Blanding</CityName> <CountryName>United States</CountryName> </GetWeather> </soap12:Body> </soap12:Envelope>
这将作为对的基于POST的调用提交(用于HTTP SOAP请求)http://www.webservicex.net/globalweather.asmx/GetWeather
。
回到原始问题:
这是您最初提出的问题,根据我提供的信息,我相信它有理由认为它不能。这两项服务是互斥的。 REST旨在通过交换headers
指示意图和message bodies
指示目的来解决该问题。SOAP打算通过交换messages
表示意图和目的来解决该问题。
使用HTTP POST从资源中获取数据是否违反REST体系结构?是的。在REST风格的服务架构的设计使用术语POST
来表示一个特定的动作。每个HTTP verb
在REST代表什么行动做打算。
正如我在对最初问题的评论中所说:
您可以
HTTP POST
用来获取数据,但是它不是RESTful服务,因为HTTP verb
毫无意义。RESTful服务是RESTful的,因为动词表示操作。
这部分内容主要供将来的读者使用。
两种协议都有优点和缺点,您应该根据问题的要求选择使用哪种协议。指导您如何完成此任务超出了本问答的范围。就是说,要考虑三件事:了解您的项目,了解您的需求,并且最重要的是,为您的听众正确地记录它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句