是否可以通过REST在POST后返回内容?

时间:2009-12-02 00:15:55

标签: java rest restlet

我正在使用RESTlet,我已经创建了一个资源。我通过覆盖acceptRepresentation方法来处理POST。

客户端应该向我发送一些数据,然后将其存储到DB,将响应设置为201(SUCCESS_CREATED),我需要将一些数据返回给客户端,但返回类型acceptRepresentation为{{1} }。

在我的情况下,我需要返回一些识别器,以便客户端可以访问该资源。

例如,如果我有一个URL void的资源,并且客户端发送POST请求,我在DB中添加一个新行,其地址应为/resource。我需要发送/resource/{id}

我做错了吗? REST原则是否允许在POST后返回一些内容?如果是的话,我怎么能这样做,如果没有办法处理这种情况呢?

5 个答案:

答案 0 :(得分:86)

REST只是说你应该遵循统一的界面。换句话说,它表示你应该根据HTTP spec执行POST应该做的事情。以下是相关规范的引用,

  

如果已在该资源上创建了资源   原始服务器,响应应该   是201(创建)并包含一个实体   它描述了。的状态   请求并指新的   资源和Location标头   (见第14.30节)。

从中可以看出,您可以在两个位置向客户端指示新创建的资源所在的位置。 Location标头应该有一个指向新资源的URL,您也可以返回一个包含详细信息的实体。

我不确定重写acceptRepresentation()和覆盖post()之间的区别,但this示例显示了如何从POST返回响应。

答案 1 :(得分:13)

我放弃了在回复正文中发送任何内容。只需将Location:设置为新创建资源的(完整)URL即可。

您的描述表明这正是您的语义:

  1. POST一个东西来创建它
  2. 回应足够了解两件事:
    1. 创作发生(201)
    2. 在哪里找到新的东西(位置标题)
  3. 其他任何事情都是多余的。

答案 2 :(得分:10)

两个不同的问题:

REST应用程序模式是否支持在POST中返回数据?

我不认为REST明确禁止它,但在Darrel的答案中详细说明了首选治疗方法。

RESTlet框架是否允许在POST中返回数据?

是的,即使它返回void,在扩展Resource的类中,您也可以通过getResponse()方法完全访问Response对象对象。因此,您可以使用您想要的任何数据调用getResponse()。setEntity()。

答案 3 :(得分:6)

以任何请求的格式输出它。那可能是:

<success>
    <id>5483</id>
</success>

或者:

{ "type": "success", "id": 5483 }

这取决于你通常做什么。如果他们不期望数据,他们应该忽略它,但任何想要正确处理数据的客户都应该能够。

答案 4 :(得分:1)

如果您使用实体正文而不是位置重定向回复201 Created,那么最好包含指向响应中表示的资源的Content-Location标头。

这将避免潜在的混淆 - 客户可以(合理地)假设响应实体实际上代表“创建者”的新状态,而不是创建的资源。

> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>