相关疑难解决方法(0)

在HTTP 202中使用Location头是否符合RFC标准?

我与我的同事讨论了在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?

http rfc http-status-codes http-headers

19
推荐指数
3
解决办法
4344
查看次数

Jersey:异步请求后立即响应

我试着理解异步响应与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)

java rest multithreading asynchronous jersey

8
推荐指数
1
解决办法
3684
查看次数

REST API 202 与 204

我正在处理一个 REST API 并有这个问题,当一个请求被安排进行进一步处理时,我们应该返回 202,当请求没有响应正文时,我们应该返回 204。当请求将被进一步处理时我们应该怎么做,但也没有响应体?

api rest return-value

6
推荐指数
1
解决办法
7624
查看次数

获取资源的 RESTful 方式,但如果尚不存在则创建它

对于我正在创建的 RESTful API,我需要有一些获取资源的功能,但如果它不存在,则创建它然后返回它。我不认为这应该是 GET 请求的默认行为。我可以在给 GET 请求的某个参数上启用此功能,但这似乎有点脏。

主要的一点是我只想为此做一个请求,因为这些请求将通过可能具有缓慢互联网连接的移动设备完成,所以我想尽可能地限制需要完成的请求。

我不确定这是否适合 RESTful 世界,但如果它不适合,它会让我失望,因为这意味着我必须对 REST 的想法进行一些修改。

有谁知道这样做的 RESTful 方式,或者不与 REST 理念冲突的漂亮方式?

api rest restful-architecture

6
推荐指数
1
解决办法
3620
查看次数

带有状态轮询的异步 ReST(以及如何最终接收完成的结果)

我有一个预计需要几个小时才能完成的请求,但我无法弄清楚整个流程。我知道这已经被讨论过多次,包括这里,但我发现没有任何东西能回答下面的问题(令人信服)。

我知道的:

  1. 我会做一个 POST /mysomethings
  2. 响应将是一个202 Accepted带有Location标头的标头,标头将包含一个完整的 url,可以在其中找到状态(例如https://api.example.com/statuses/somestatusuuid)。
  3. 然后,客户端可以轮询状态 url 并获得200 OK包含类似内容的响应正文的响应{ statusId: someid, status: somestatusstring, description: somestatusdescriptionstring }

为了让事情变得简单和集中,我忽略了如何为这些请求进行授权。

我的问题:

一旦原始请求的资源准备好(假设这意味着 status="complete"),我该怎么办。

我能想到的最好的是以下之一:

  1. 状态响应还将包括(一旦 status="complete")一个额外的键,例如myresourceId: someuuid客户端可以执行GET /mysomethings/someuuid

  2. 状态响应(一旦资源准备好)将包含一个带有资源完整 url 的 Location 标头(例如https://api.example.com/mysomethings/someuuid

  3. 以上两者的组合,以便我同时拥有资源的 url 和它的 id

一些额外的想法:

  • IMO 在状态请求中返回资源本身是不合适的,因为请求的是状态而不是实际资源。

  • 我也不喜欢在某些地方建议的想法,在资源准备好之前返回 202 作为状态,然后返回 201 Created 因为状态代码应该传达请求的状态,而不是资源的状态(绝对不是当前请求仅请求其状态的另一个资源)。

这一切听起来对吗?欢迎任何和所有评论。

rest

6
推荐指数
1
解决办法
2018
查看次数

REST:缓慢操作的响应式UI?

我需要帮助为具有进度条的应用程序创建RESTful设计.

想象一个应用程序,其中一个资源需要很长时间(1分钟)来响应HTTP GET(在我的情况下,我正在扫描网络中的设备).我希望客户端显示一个进度条,指示GET操作需要多长时间,但为了使其正常工作,服务器需要为它们提供操作的时间估计.

鉴于操作缓慢:

HTTP GET /devices

什么是RESTful方式为它提供时间估计?我不认为我可以使用:

HTTP HEAD /devices

因为HEAD应该返回与GET减去身体相同的值(我认为)意味着我必须运行我试图避免的同样长的操作.有任何想法吗?

rest progress-bar

4
推荐指数
1
解决办法
2743
查看次数