2009-10-26 40 views
25

比方说,我们有一个服务来添加一个新的酒店:如何在RESTful POST中返回生成的ID?

> POST /hotel 
> <hotel> 
> <a>aaa</a> 
> <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
> </hotel> 

然后我们有一个GET:

> GET /hotel 

< HTTP/1.1 200 OK 
< <hotel> 
< <a>aaa</a> 
< <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
< </hotel> 

的问题是什么我们返回初始POST创造?我们想要返回一个“引用”到新资源的ID(在服务器上生成),但我们不想返回所有酒店数据,因为在我们的情况下,其中一个数据字段是一个大约300K的平面文件。

所以你应该刚刚返回:

< HTTP/1.1 200 OK 
< <hotel> 
< <id>123</id> 
< </hotel> 

还是应该返回完整的对象:

< HTTP/1.1 200 OK 
< <hotel> 
< <id>123</id> 
< <a>aaa</a> 
< <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
< </hotel> 

我对宁静的最佳实践感兴趣。

注意:这个相关的post会谈到更多关于返回的内容,而不是关于如何返回它。

回答

40

返回状态码201 - 创建,并将URL放在位置标题中。你根本不需要返回一个身体。

+2

回答要了解如何设置位置标题: http://www.java-forums.org/blogs/spring-framework/544-restful-post-method-spring.html – db42 2012-07-26 06:01:00

12

REST全部是关于URL的资源。

最好的RESTful实践是返回用于访问刚刚创建的资源的URL。

我不会返回整个文档。除非协议出于某种原因(例如,服务器可能会更改客户端提交的数据并且客户端想确认它是否正常),这对协议很重要。如果不重要,客户端已经知道数据。

如果您只返回ID,客户端将不知道如何处理它。但是,返回一个URL将允许客户端继续与服务器进行REST交互(可能是通过获取服务描述文档)。这并不是说你不能将URL和URL一起返回。但是,因为它是一个网络系统,所以URL是你可以知道的最重要的信息。此外,ID很可能是您在后端需要的内容,而不是客户应该担心的事情。

编辑:
至于你是否应该用XML包装返回的URL,它真的取决于你的协议。如果您认为将来可能要返回其他数据,那么XML将更加谨慎。拥有一个命名的文件格式可以让你更好地版本化你的服务(通过改变文档类型头文件)。但是你可以返回URL。

+1

你只会将它作为“/ hotel/123”返回?你会用XML包装吗? – 2009-10-26 14:16:37

+0

根据“编辑” – 2009-10-26 14:43:54

10

返回位置标题的一个优点响应的实际实体主体是客户端可以在服务器的单次往返中接收结果表示。例如,AtomPub这样做。