我正在开发一个RESTful API,其中http://server/thingyapi/thingyblob/1234返回与thingy#1234相关联的文件(也称为"blob")以进行下载.但可能是请求是在服务器中不存在文件的情况下进行的,但绝大多数情况下都会在以后提供.服务器中有一个批处理过程,可以为所有东西生成所有blob.Thingy 1234已经存在,其数据(blob除外)已经可用.服务器还没有生成东西1234的blob.
我不想要回归404; 那是不存在的东西.这是一个存在的东西,但它的blob尚未生成.有点像YouTube视频的"处理".我认为重定向代码也不合适; 没有"其他"网址可供尝试.
在这种情况下返回的HTTP状态代码是什么?
language-agnostic rest http http-status-codes batch-processing
我有一组资源,其表示被懒惰地创建.构建这些表示的计算可能需要几毫秒到几个小时,具体取决于服务器负载,特定资源和月亮的相位.
收到的第一个GET请求开始在服务器上进行计算.如果计算在几秒钟内完成,则返回计算的表示.否则,返回202"已接受"状态代码,客户端必须轮询资源,直到最终表示可用.
出现这种情况的原因如下:如果结果在几秒钟内可用,则需要尽快检索; 否则,当它变得可用时并不重要.
由于内存有限和请求量很大,NIO和长轮询都不是一个选项(即我无法保持足够的连接打开,甚至我甚至无法将所有请求都放在内存中;一次"几秒钟"已经过去了,我坚持多余的要求).同样,客户端限制使得它们无法处理完成回调.最后,请注意我对创建一个POST的"工厂"资源不感兴趣,因为额外的往返意味着我们的分段实时约束超出了预期(此外,它是额外的复杂性;此外,这是一种资源,受益于缓存).
我想在返回202"接受"状态代码以响应GET请求方面存在一些争议,因为我在实践中从未见过它,并且它最直观的用法是回应不安全的方法,但我从来没有发现任何特别令人沮丧的事情.而且,我不保持安全和幂等性吗?
那么,人们对这种方法有何看法?
编辑:我应该提到这是一个所谓的商业网络API - 不适用于浏览器.
我有一个REST端点接受POST请求以将代码标记为已兑换.代码只能在特定日期之间兑换.
如果有人试图提前兑换代码,我应该如何回应?
我怀疑HTTP 403,故宫,是正确的选择,但随后的W3C规定" 的要求不应该被重复 ",而在这种情况下,我会期待被反复要求,只是在以后的日子.
我的端点看起来像这样:GET:/ v1/resourcebeingcreated/status
是否有一个首选的HTTP状态代码返回(如果此资源的加载/创建正在进行但尚未完成,则返回200以及一个解释"正在进行中"的响应主体)?
如果不是,是在标题或响应正文中返回"进行中"状态的最佳方法吗?
我想知道如何在REST API中做出响应.
有效示例:
http://blah.com/api/v1/dosomething/123
Run Code Online (Sandbox Code Playgroud)
以上是有效请求,目前我的HTTP状态为200,带有JSON响应
{
"dosomething": {
"status": "OK",
"results": "123"
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果传递的参数无效(我期待一个整数字符串),我是否返回HTTP响应200并在JSON响应中传回错误状态,或者我应该传递类似HTTP的内容400响应(错误请求)并在JSON响应中列出请求的错误/问题?
错误示例:
http://blah.com/api/v1/dosomething/123a
Run Code Online (Sandbox Code Playgroud)
JSON响应:
{
"dosomething": {
"status": "ERROR",
"errors": [
"Value passed: |123a| must be a integer."
]
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题再一次是我应该在请求传递200或400 HTTP状态,其中传递的参数不是我所期望的?或者,当请求有效时,这应该始终是200响应吗?
什么是最佳做法?