我正在使用RESTlet,我已经创建了一个资源。我通过覆盖acceptRepresentation
方法来处理POST。
客户端应该向我发送一些数据,然后将其存储到DB,将响应设置为201(SUCCESS_CREATED),我需要将一些数据返回给客户端,但返回类型acceptRepresentation
为{{1} }。
在我的情况下,我需要返回一些识别器,以便客户端可以访问该资源。
例如,如果我有一个URL void
的资源,并且客户端发送POST请求,我在DB中添加一个新行,其地址应为/resource
。我需要发送/resource/{id}
。
我做错了吗? REST原则是否允许在POST后返回一些内容?如果是的话,我怎么能这样做,如果没有办法处理这种情况呢?
答案 0 :(得分:86)
REST只是说你应该遵循统一的界面。换句话说,它表示你应该根据HTTP spec执行POST应该做的事情。以下是相关规范的引用,
如果已在该资源上创建了资源 原始服务器,响应应该 是201(创建)并包含一个实体 它描述了。的状态 请求并指新的 资源和Location标头 (见第14.30节)。
从中可以看出,您可以在两个位置向客户端指示新创建的资源所在的位置。 Location标头应该有一个指向新资源的URL,您也可以返回一个包含详细信息的实体。
我不确定重写acceptRepresentation()和覆盖post()之间的区别,但this示例显示了如何从POST返回响应。
答案 1 :(得分:13)
我放弃了在回复正文中发送任何内容。只需将Location:设置为新创建资源的(完整)URL即可。
您的描述表明这正是您的语义:
其他任何事情都是多余的。
答案 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>