use*_*678 12 c# rest wcf soap web-services
来自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.
来自维基百科页面http://en.wikipedia.org/wiki/Representational_state_transfer
RESTful系统通常(但不总是)通过超文本传输协议与Web浏览器使用的相同HTTP动词(GET,POST,PUT,DELETE等)进行通信,以检索网页并将数据发送到远程服务器.
但是,使用HTTP POST从资源获取数据会违反REST架构吗?换句话说,基于SOAP的Web服务可以是RESTful吗?
RESTful和基于SOAP的Web服务之间是否还有其他差异?
410*_*one 26
我发布这个作为答案,因为评论是不够的.以下是我想要总结的内容.
首先,我们将从这两个引用开始:
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用户拥有的播放列表.
端点
Run Code Online (Sandbox Code Playgroud)GET https://api.spotify.com/v1/users/{user_id}/playlists/{playlist_id}请求参数
Run Code Online (Sandbox Code Playgroud)+---------------------------------------------------+ | 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的服务,类似于能够构建一个RESTful服务JSON)来交换消息,从而服务器没有初始指示做什么.
基于SOAP的服务以与传输介质无关的方式解决此问题.服务器和客户端不需要使用HTTP,甚至根本不需要TCP.他们只需要使用相同或兼容的传输介质.实际上,您可以将现代企业环境视为基于SOAP的服务.当您需要获得新的供应品时,您需要向您的办公室经理提出申请,然后他们会回复一条消息.收到初始请购单后,您的经理不知道是否允许.他们必须阅读申请的其余部分,以确定它是有效请求还是无效.
SOAP是围绕RPCs(远程过程调用)设计的,许多防火墙阻止了这些.因此,SOAP被修改为可以解决问题HTTP.它旨在整合各种不同的技术.
因为SOAP是围绕信息设计的,它是一个很多更详细的服务.通常更容易在SOAP服务中表示复合操作.也就是说,如果您基于许多标准(而不是仅仅一个)请求SOAP,那么SOAP往往具有更好的接口.objects
基于SOAP的服务使用RPC中的其他字段进行过滤.这些字段的组合方式取决于提供者.
我将以Global Weather API为例:http://www.webservicex.net/globalweather.asmx?op = GetWeather:
的GetWeather
获取世界各主要城市的天气报告.
测试
要使用HTTP POST协议测试操作,请单击"调用"按钮.
Run Code Online (Sandbox Code Playgroud)+---------------------------------------------------+ | Parameter | Value | +---------------------------------------------------+ | CityName: | | | CountryName: | | +---------------------------------------------------+
例如,如果指定"Blanding"和"United States",您将看到生成的XML如下所示:
Run Code Online (Sandbox Code Playgroud)<?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,因为动词表示动作.
这部分主要面向未来的读者.
这两种协议都有优点和缺点,您应根据问题的要求选择使用的协议.指导您如何实现这一点超出了这个问题和答案的范围.也就是说,有三件事需要考虑:了解您的项目,了解您的要求,最重要的是,正确地为您的受众记录.
| 归档时间: |
|
| 查看次数: |
28962 次 |
| 最近记录: |