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

del*_*boy 82 java rest restlet

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

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

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

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

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

Dar*_*ler 89

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

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

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

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

  • @ del-boy:请参阅Thom关于如何在acceptRepresentation()中设置响应体的答案. (2认同)

小智 15

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

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

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

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

  • POST 可以执行创建一个或多个资源的逻辑。处理的结果可能是客户所需要的。因此,在响应中返回它可以避免对 API 进行一次或多次 GET 调用。POST 方法创建/更改的数据对于客户端来说可能不是(通常也不是)多余的。 (3认同)

小智 10

两个不同的问题:

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

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

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

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


Sam*_*war 6

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

<success>
    <id>5483</id>
</success>
Run Code Online (Sandbox Code Playgroud)

要么:

{ "type": "success", "id": 5483 }
Run Code Online (Sandbox Code Playgroud)

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