我与我的同事讨论了在202 Accepted响应中使用Location头的一个很好的概念.
故事从这里开始分析PHP header()函数的行为.有趣的摘录:
第二个特例是"Location:"标题.它不仅这个头发送回浏览器,但是除非201或3xx状态代码已经被设置也返回重定向(302)状态代码到浏览器.
它们未在此默认行为中包含202状态代码.看起来他们并不期望202响应有一个位置,事实上:
header("HTTP/1.1 202");
header("Location: http://example.com");
Run Code Online (Sandbox Code Playgroud)
将客户端重定向到位置URL.当然,也可以改变与header()函数的第三个参数,但一下就吸引了我的注意力被这种行为:为什么他们了解,默认202预计不会举行Location头?
然后我查看RFC,寻找202状态的官方含义.有趣的摘录:
返回此响应的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计.
它没有明确地引用位置标头,就像之前(在相同的RFC文档中)201响应一样.这可能是PHP人员理解202响应不应该保持Location头的原因.指针会被解释为Location头还是PHP家伙做出了错误的假设?如果标准允许Location头有202响应:不应该像201响应定义更明确的官方文档?
最后,我回顾了最新的RFC版本,并发现编辑方面的一些变化:
与此响应发送表示应该描述请求的当前状态和(或嵌入)点状态监视器,一个当所述请求将被兑现的估计提供给用户.
同样,没有明确的假设指向 Location头.
简而言之,经过上述修订后:我是否使用带有202响应的Location标头符合RFC?
我有一个我已经构建的RESTFul服务器API.它的某些部分不控制资源,我无法将相关的URL + HTTP方法映射到服务器上执行的操作.
例如,我可以备份服务器上的每个资源POST /backup,但我不确定这是否是最合适的映射.单个资源怎么样?我应该使用:POST /backup/id或通过将id声明为我发送的变量来指定它:POST /backup <id>
请给我一些关于如何最恰当地构建这个的提示,以便我的API易于掌握.
如果质量问题不好,我会提前道歉.我仍然开始学习REST API的概念.我正在尝试实现可扩展的REST API以进行数据处理.这是我到目前为止所能想到的.
考虑一些可以使用GET调用检索的数字数据:
GET http://my.api/data/123/
Run Code Online (Sandbox Code Playgroud)
用户可以应用一系列算术运算,例如add和multiply.一种非RESTful的方法是:
GET http://my.api/data/123?add=10&multiply=5
Run Code Online (Sandbox Code Playgroud)
Assupmtions:
我目前有2种RESTful方式可供选择:
如果我们考虑add和作为这里multiply的数据的子资源.在这种情况下,我们可以使用:
GET http://my.api/data/123/add/10/
Run Code Online (Sandbox Code Playgroud)
鉴于原始数据永远不会改变,这将是安全和幂等的.但是,我们需要链接多个操作.我们可以这样做吗?
GET http://my.api/data/123/add/10/multiply/5/
Run Code Online (Sandbox Code Playgroud)
在哪里multiply创建一个子资源,add/10/它本身就是一个子资源data/123
优点:
缺点:
在这种情况下,用户创建原始数据的可编辑版本:
POST http://my.api/data/123/
Run Code Online (Sandbox Code Playgroud)
将返回
201 Created
Location: http://my.api/data/123/edit/{uniqueid}
Run Code Online (Sandbox Code Playgroud)
用户可以使用PATCH此可编辑数据
PATCH http://my.api/data/123/edit/{uniqueid}
{add:10, multiply:5}
Run Code Online (Sandbox Code Playgroud)
最后,GET编辑数据
GET http://my.api/data/123/edit/{uniqueid}
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
是否有更清晰,更语义的方式来实现RESTful数据处理?
如果你想知道这背后的现实问题是什么,我正在处理数字信号处理.
举个简单的例子,您可以考虑将可视过滤器应用于图像.在此示例之后,RESTful Web服务可以执行以下操作:
GET …Run Code Online (Sandbox Code Playgroud) 我是这个游戏的新手,所以我可能会误解事物.实际上,如果有人告诉我,我误解了事情,那将是一种恩惠.也许这个人会体贴到足以向我展示正确的道路.但...
REST适用于Web服务(http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services)的" 指南 "或" 最佳实践 "之一是,您应该在拨打电话时使用正确的HTTP方法(我误解了它?)REST API的.
但是看看Web上的许多API实现,我看到100%的调用实际上是GET调用,根据它们的URI,它将被API解释为HTTP动词或方法之一.
因此,例如,查看Twitter(https://dev.twitter.com/rest/public)的REST API文档,其原则上只定义了两个动词/方法(GET和POST),实际上已发送所有调用作为GET,并且基于GET调用中的URI,由API解释并采取行动.
例:
GET状态/查找:https://api.twitter.com/1.1/statuses/lookup.json
POST状态/更新(PUT?):https://api.twitter.com/1.1/statuses/update.json
在这两种情况下,调用本身都是使用GET进行的,URI的最后一部分将其定义为真正的GET或POST.
总之,要成为真正的REST,不应该为Web服务的REST API的客户端实现使用正确的HTTP谓词/方法吗?
我错过了什么?