REST可以在POST后返回内容吗?

2022-08-31 10:51:26

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

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

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

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

我做错了什么吗?REST 原则是否允许在 POST 后返回某些内容?如果是,我该怎么做,如果没有,有什么办法来处理这种情况?


答案 1

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

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

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

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


答案 2

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

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

  1. 发布一个东西来创建它
  2. 回复时要知道两件事:
    1. 创造发生了(201)
    2. 在哪里可以找到新事物(位置标题)

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