我与我的同事讨论了在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?
我试着理解异步响应与Jersey一起工作的方式.我阅读了Jersey文档的第10章(https://jersey.java.net/documentation/latest/async.html),但它对我的问题没有帮助.此处关于stackoverflow的研究也没有得到令人满意的答案(我能理解).
我要做的是类似于这篇文章中的一个问题(使用http状态202进行异步操作).我想使用HTML表单文档将大文件上传到服务器.在将请求发送到服务器之后,Web服务应立即响应状态202和URI,其中在请求完成后可以找到该文件.
阅读帖子后,似乎有可能,但遗憾的是没有提示如何在给定的情况下实现这样的行为.
我写了一个小的Web服务来测试功能:
@Path("/test/async/")
public class TestAsyncResponse {
@GET
@Path("get")
public Response asyncGet(@Suspended final AsyncResponse response) {
new Thread(new Runnable() {
@Override
public void run() {
DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
System.out.println("#### thread started: "
+ df.format(new Date()) + " ####");
String result = veryExpensiveOperation();
System.out.println("#### thread finished: "
+ df.format(new Date()) + " ####");
response.resume(result);
}
private String veryExpensiveOperation() {
try {
Thread.sleep(10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
return "Woke up!"; …Run Code Online (Sandbox Code Playgroud) 我正在处理一个 REST API 并有这个问题,当一个请求被安排进行进一步处理时,我们应该返回 202,当请求没有响应正文时,我们应该返回 204。当请求将被进一步处理时我们应该怎么做,但也没有响应体?
对于我正在创建的 RESTful API,我需要有一些获取资源的功能,但如果它不存在,则创建它然后返回它。我不认为这应该是 GET 请求的默认行为。我可以在给 GET 请求的某个参数上启用此功能,但这似乎有点脏。
主要的一点是我只想为此做一个请求,因为这些请求将通过可能具有缓慢互联网连接的移动设备完成,所以我想尽可能地限制需要完成的请求。
我不确定这是否适合 RESTful 世界,但如果它不适合,它会让我失望,因为这意味着我必须对 REST 的想法进行一些修改。
有谁知道这样做的 RESTful 方式,或者不与 REST 理念冲突的漂亮方式?
我有一个预计需要几个小时才能完成的请求,但我无法弄清楚整个流程。我知道这已经被讨论过多次,包括这里,但我发现没有任何东西能回答下面的问题(令人信服)。
我知道的:
POST /mysomethings202 Accepted带有Location标头的标头,标头将包含一个完整的 url,可以在其中找到状态(例如https://api.example.com/statuses/somestatusuuid)。200 OK包含类似内容的响应正文的响应{ statusId: someid, status: somestatusstring, description: somestatusdescriptionstring }为了让事情变得简单和集中,我忽略了如何为这些请求进行授权。
我的问题:
一旦原始请求的资源准备好(假设这意味着 status="complete"),我该怎么办。
我能想到的最好的是以下之一:
状态响应还将包括(一旦 status="complete")一个额外的键,例如myresourceId: someuuid客户端可以执行GET /mysomethings/someuuid
状态响应(一旦资源准备好)将包含一个带有资源完整 url 的 Location 标头(例如https://api.example.com/mysomethings/someuuid)
以上两者的组合,以便我同时拥有资源的 url 和它的 id
一些额外的想法:
IMO 在状态请求中返回资源本身是不合适的,因为请求的是状态而不是实际资源。
我也不喜欢在某些地方建议的想法,在资源准备好之前返回 202 作为状态,然后返回 201 Created 因为状态代码应该传达请求的状态,而不是资源的状态(绝对不是当前请求仅请求其状态的另一个资源)。
这一切听起来对吗?欢迎任何和所有评论。
我需要帮助为具有进度条的应用程序创建RESTful设计.
想象一个应用程序,其中一个资源需要很长时间(1分钟)来响应HTTP GET(在我的情况下,我正在扫描网络中的设备).我希望客户端显示一个进度条,指示GET操作需要多长时间,但为了使其正常工作,服务器需要为它们提供操作的时间估计.
鉴于操作缓慢:
HTTP GET /devices
什么是RESTful方式为它提供时间估计?我不认为我可以使用:
HTTP HEAD /devices
因为HEAD应该返回与GET减去身体相同的值(我认为)意味着我必须运行我试图避免的同样长的操作.有任何想法吗?
rest ×5
api ×2
asynchronous ×1
http ×1
http-headers ×1
java ×1
jersey ×1
progress-bar ×1
return-value ×1
rfc ×1