REST能够在POST之后返回内容吗?
我正在使用RESTlet,并创build了一个资源。 我通过重写acceptRepresentation方法来处理POST。
客户端应该向我发送一些数据,然后我将它存储到数据库,设置响应201(SUCCESS_CREATED),我需要返回一些数据到客户端,但返回typesacceptRepresentation是无效的。
在我的情况下,我需要返回一些标识符,以便客户端可以访问该资源。
例如,如果我有一个资源与URL /资源和客户端发送POST请求我添加新的行在数据库中,其地址应该是/资源/ {id}。 我需要发送{id}。
难道我做错了什么? REST原则是否允许POST后返回一些东西? 如果是的话,我该怎么做,如果没有办法处理这种情况呢?
REST只是说你应该遵循统一的界面。 换句话说,它说你应该按照HTTP规范来做POST应该做的事情。 这是来自该规范的引用是相关的,
如果源服务器上已经创build了一个资源,那么响应应该是201(创build),并且包含一个描述请求状态的实体,并引用新资源和一个位置标题(见14.30节)。
正如你所看到的,你有两个地方可以向客户端指出新创build的资源所在的位置。 位置标题应该有一个指向新资源的URL,你也可以返回一个实体。
我不知道重写acceptRepresentation()和重写post()之间有什么区别,但是这个例子展示了如何从POST返回一个响应。
我会放弃任何东西在响应的身体。 只需将位置设置为新build资源的(完整)url。
你的描述表明,这正是你的语义:
- 张贴一个东西来创build它
- 回答足够的知道两件事情:
- 那创造发生了(201)
- 在哪里可以find新的东西(位置标题)
其他任何东西都是多余的。
两个不同的问题:
REST应用程序模式是否支持在POST中返回数据?
我不认为REST明确地禁止它,但是Darrel的答案中列出了首选的处理方法。
RESTlet框架是否允许在POST中返回数据?
是的,即使它返回void,在扩展Resource的类中,也可以通过getResponse()方法完全访问Response对象。 所以你可以用你想要的任何数据调用getResponse()。setEntity()。
以任何要求的格式输出。 这可能是:
<success> <id>5483</id> </success>
要么:
{ "type": "success", "id": 5483 }
这取决于你通常做什么。 如果他们不期望数据,他们应该忽略它,但任何想要正确处理它的客户端应该能够。
如果您使用实体主体创build而不是位置redirect,那么最好包含一个Content-Location标头,指向响应中表示的资源。
这将避免潜在的混淆 – 客户可以(有理由)假定响应实体实际上代表“创build者”的新状态,而不是创build的资源。
> 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>