93

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

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

就我而言,我需要返回一些标识符,以便客户端可以访问该资源。

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

难道我做错了什么?REST 原则是否允许在 POST 之后返回某些内容?如果是,我该怎么做,如果不是,处理这种情况的方法是什么?

4

5 回答 5

98

REST 只是说你应该遵守统一的接口。换句话说,它说你应该按照HTTP 规范做 POST 应该做的事情。这是该规范中相关的引用,

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

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

我不确定重写 acceptRepresentation() 和重写 post() 之间有什么区别,但这个例子展示了如何从 POST 返回响应。

于 2009-12-02T00:23:18.290 回答
16

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

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

  1. 发布一个东西来创建它
  2. 回答足够了解两件事:
    1. 创造发生了(201)
    2. 在哪里可以找到新事物(位置标头)

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

于 2009-12-06T23:51:35.113 回答
10

两个不同的问题:

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

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

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

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

于 2009-12-02T01:11:38.893 回答
6

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

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

或者:

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

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

于 2009-12-02T00:19:04.517 回答
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>
于 2009-12-02T10:32:53.420 回答