它是通过REST OK POST后返回的内容?它是通过REST OK POST后返回的内容?(Is

2019-05-13 01:28发布

我使用的Restlet和我创建了一个资源。 我处理POST通过重写acceptRepresentation方法。

客户端应该给我一些数据,然后我保存它DB,设置响应201(SUCCESS_CREATED),我需要一些数据返回给客户端,但返回类型acceptRepresentationvoid

就我而言,我需要返回一些识别器,使客户端可以访问该资源。

举例来说,如果我有一个资源与URL /resource和客户端发送POST请求我在DB添加一个新行,并将其地址应该是/resource/{id} 我需要发送{id}

难道我做错了什么? 是否REST原则允许POST后返回的东西? 如果是的话,我怎么能做到这一点,如果没有什么是处理这种情况的方法是什么?

Answer 1:

REST只是说,你应该遵循统一的接口。 换句话说,它说你应该做的POST是应该做具体根据HTTP规范 。 下面是从规范是相关的报价,

如果资源已经被原始服务器上创建,响应应该是201(创建)和包含其描述了请求的状态,指的是新的资源的实体,和一个Location头部(见14.30)。

正如你可以从这个看,你有两个地方,你可以指示到新创建的资源驻留在客户端。 Location头应该有一个指向新资源的URL,你可以用细节也返回的实体。

我不知道是什么压倒一切的acceptRepresentation()和重写后(),但之间的区别这个例子显示了如何返回从POST的响应。



Answer 2:

我会放弃在响应主体发送任何数据。 只需设置地点:新创建的资源的(全)URL。

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

  1. 张贴的东西来创建它
  2. 有足够的响应知道两件事情:
    1. 这创造发生(201)
    2. 在哪里可以找到新的东西(Location头)

还有什么是多余的。



Answer 3:

两个不同的问题:

没有休息应用模式支持返回的POST数据?

我不认为REST明确禁止,但首选的治疗方法是达雷尔的回答阐述。

是否Restlet框架允许在后返回数据?

是的,即使它返回void,在延伸资源类,你必须通过GETRESPONSE()方法完全访问Response对象对象。 所以,你可以调用的GetResponse()。setEntity()与任何你想要的数据。



Answer 4:

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

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

要么:

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

这要看你平时做的。 如果他们没想到的数据,他们应该忽略它,但要妥善处理任何客户端应该可以。



Answer 5:

如果您回应201创建了一个实体机构,而不是一个位置重定向,那么它是一个好主意,包括一个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>


文章来源: Is it ok by REST to return content after POST?