我使用的Restlet和我创建了一个资源。 我处理POST通过重写acceptRepresentation
方法。
客户端应该给我一些数据,然后我保存它DB,设置响应201(SUCCESS_CREATED),我需要一些数据返回给客户端,但返回类型acceptRepresentation
为void
。
就我而言,我需要返回一些识别器,使客户端可以访问该资源。
举例来说,如果我有一个资源与URL /resource
和客户端发送POST请求我在DB添加一个新行,并将其地址应该是/resource/{id}
我需要发送{id}
难道我做错了什么? 是否REST原则允许POST后返回的东西? 如果是的话,我怎么能做到这一点,如果没有什么是处理这种情况的方法是什么?
REST只是说,你应该遵循统一的接口。 换句话说,它说你应该做的POST是应该做具体根据HTTP规范 。 下面是从规范是相关的报价,
如果资源已经被原始服务器上创建,响应应该是201(创建)和包含其描述了请求的状态,指的是新的资源的实体,和一个Location头部(见14.30)。
正如你可以从这个看,你有两个地方,你可以指示到新创建的资源驻留在客户端。 Location头应该有一个指向新资源的URL,你可以用细节也返回的实体。
我不知道是什么压倒一切的acceptRepresentation()和重写后(),但之间的区别这个例子显示了如何返回从POST的响应。
我会放弃在响应主体发送任何数据。 只需设置地点:新创建的资源的(全)URL。
你的描述表明,这正是语义你:
- 张贴的东西来创建它
- 有足够的响应知道两件事情:
- 这创造发生(201)
- 在哪里可以找到新的东西(Location头)
还有什么是多余的。
两个不同的问题:
没有休息应用模式支持返回的POST数据?
我不认为REST明确禁止,但首选的治疗方法是达雷尔的回答阐述。
是否Restlet框架允许在后返回数据?
是的,即使它返回void,在延伸资源类,你必须通过GETRESPONSE()方法完全访问Response对象对象。 所以,你可以调用的GetResponse()。setEntity()与任何你想要的数据。
输出它的任何格式要求。 这可能是:
<success>
<id>5483</id>
</success>
要么:
{ "type": "success", "id": 5483 }
这要看你平时做的。 如果他们没想到的数据,他们应该忽略它,但要妥善处理任何客户端应该可以。
如果您回应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>