我正在使用RESTlet,我已经创建了一个资源。我通过重写acceptRepresentation
方法来处理POST。
客户端应该向我发送一些数据,然后将其存储到DB,将响应设置为201(SUCCESS_CREATED),我需要将一些数据返回给客户端,但返回类型为acceptRepresentation
的是void
。
在我的情况下,我需要返回一些标识符,以便客户端可以访问该资源。
例如,如果我有一个URL为/resource
的资源,并且客户端发送POST请求,我在DB中添加一个新行,其地址应为/resource/{id}
。我需要发送{id}
。
难道我做错了什么? REST原则是否允许在POST后返回一些内容?如果是的话,我怎么能这样做,如果没有办法处理这种情况呢?
我放弃了回复中的任何内容。只需将Location:设置为新创建的资源的(完整)URL即可。
您的描述表明这正是您的语义:
其他任何事情都是多余的。
两个不同的问题:
REST应用程序模式是否支持在POST中返回数据?
我不认为REST明确禁止它,但在Darrel的答案中详细说明了首选治疗方法。
RESTlet框架是否允许在POST中返回数据?
是的,即使它返回void,在扩展Resource的类中,您也可以通过getResponse()方法完全访问Response对象对象。因此,您可以使用您想要的任何数据调用getResponse()。setEntity()。
以任何请求的格式输出它。那可能是:
<success>
<id>5483</id>
</success>
要么:
{ "type": "success", "id": 5483 }
这取决于你通常做什么。如果他们不期望数据,他们应该忽略它,但任何想要正确处理数据的客户都应该能够。
如果您使用实体主体而不是位置重定向来回复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>