Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于JavaScript的客户端的3xx响应的RESTful替代方案_Javascript_Rest_Http - Fatal编程技术网

基于JavaScript的客户端的3xx响应的RESTful替代方案

基于JavaScript的客户端的3xx响应的RESTful替代方案,javascript,rest,http,Javascript,Rest,Http,我们的REST服务需要指出客户端需要采取进一步的操作来完成请求(通常,对请求的响应可以在另一个URI下找到) 通常,这是通过HTTP 3xx响应实现的。但是,对于基于JavaScript的客户端,重定向是在响应到达JavaScript代码之前由浏览器本身执行的 基本上,我需要一种RESTful方式来通知客户端(JavaScript代码),响应可以在另一个URI下找到,并让客户端自己处理这样的响应 我正在考虑两种解决方案: HTTP 200对包含URI的实体没有问题。我不喜欢创建一个只包含URI的

我们的REST服务需要指出客户端需要采取进一步的操作来完成请求(通常,对请求的响应可以在另一个URI下找到)

通常,这是通过HTTP 3xx响应实现的。但是,对于基于JavaScript的客户端,重定向是在响应到达JavaScript代码之前由浏览器本身执行的

基本上,我需要一种RESTful方式来通知客户端(JavaScript代码),响应可以在另一个URI下找到,并让客户端自己处理这样的响应

我正在考虑两种解决方案:

  • HTTP 200对包含URI的实体没有问题。我不喜欢创建一个只包含URI的整个实体。我宁愿通过HTTP头来实现这一点

  • HTTP 204没有包含给定URI的位置标头的内容响应。但在这里,我不确定它是否“符合REST”。将HTTP 204 No内容与主要用于重定向(以及HTTP 3xx响应)或创建新资源时使用的位置标头结合起来可以吗


  • 或者有更好的解决方案吗?

    假设您有一个json响应格式,您可以接受一个请求参数,如
    noredirect
    ,该参数在出现时将http响应代码设置为200,并在返回的对象中设置真实的响应代码

    GET /some/resource
    200 OK
    {
        status: 200,
        …
    }
    
    GET /some/unknown/resource
    404 Not Found
    {
        status: 404,
        …
    }
    
    GET /some/unknown/resource?noredirect
    200 OK
    {
        status: 404,
        …
    }
    

    如果我理解正确,你有一个过程,比如说5个步骤。在第5步之后,准备好了一些结果,您希望将这些结果指向您的客户机,而不是通过HTTP-3xx,而是以更简洁的方式

    我建议您在
    JSON
    -响应中使用
    link
    属性:

    {
      ...
      "links": [
          ...
          "result": { "href": "/calculation/1234" }
          ...
      ]
    }
    
    你的客户可以把这个答案转换成一个简单的链接/按钮


    这与
    HATEOAS
    (作为应用程序状态引擎的超媒体)一致,表明当前状态在引用的不同位置下提供结果

    请你详细说明一下,也许可以举一个简单的例子。那会有帮助的。一般来说,如果您有一个“结果”,为什么不将其包含在客户已采取的行动的答案中?如果您的过程还没有完成,您的响应应该包括一个
    链接:
    属性,其中定义了更多的URL。基本上您是对的。请求启动某种处理,作为响应,我需要通知客户机有关URI以检索结果。所以你建议返回HTTP 200 OK和响应体中的链接,对吗?是的。那是我的建议。这是一种透明的方式来引导整个过程。在每一步之后,您可以包括指向上一步以及下一步的链接。每个答案都提供了应用程序的当前状态。这很有意义,我喜欢links集合。实际上,它和我们现在拥有的非常接近,然而,我们返回了一个稍微不同的实体。关键是我希望避免返回任何正文并模拟HTTP 3xx响应。但这可能是唯一有意义的方法。实现这一点的唯一方法是:您可以在客户端中设置
    location.href
    。但这不是很安静;)