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

问题描述 投票:79回答:5

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

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

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

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

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

java rest restlet
5个回答
87
投票

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

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节)。

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

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


14
投票

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

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

  1. POST一个东西来创建它
  2. 回答足够了解两件事: 创造发生了(201) 在哪里找到新的东西(Location头)

其他任何事情都是多余的。


10
投票

两个不同的问题:

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

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

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

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


6
投票

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

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

要么:

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

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


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>
© www.soinside.com 2019 - 2024. All rights reserved.