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

RESTful alternative to 3xx responses for JavaScript based clients

本文关键字:RESTful 方案 3xx JavaScript 客户端 基于 响应      更新时间:2023-09-26

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

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

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

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

  1. HTTP 200 OK,后面有包含URI的实体。我不喜欢创建只携带URI的整个实体。我宁愿通过HTTP头

  2. 来实现这一点
  3. HTTP 204没有包含给定URI的Location头的Content响应。但在这里我不确定它是否"REST兼容"。是否可以将HTTP 204 No Content与主要用于重定向(以及HTTP 3xx响应)的位置标头相结合,或者当创建新资源时?

还是有更好的解决方案?

如果我理解正确的话,你有一个过程,比如说5个步骤。在第5步之后,有一些准备好的结果,您想要指向您的客户端,不是通过HTTP-3xx,而是以更干净的方式。

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

{
  ...
  "links": [
      ...
      "result": { "href": "/calculation/1234" }
      ...
  ]
}

您的客户端可以接受这个答案并将其转换为一个简单的链接/按钮。

这符合HATEOAS (Hypermedia As The Engine Of Application State),表明当前状态提供了引用的不同位置下的结果。

假设您有一个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,
    …
}