HTTP状态的兼容性

时间:2009-09-05 21:26:23

标签: rest http-status-codes

我目前正在实施一个RESTful API(没什么大不了的,只是为了我正在开发的博客引擎)我还有一些关于HTTP状态兼容性的问题。

要创建新的博客文章,我必须执行POST请求,如果一切正常,则创建帖子,然后以与请求相对应的格式返回。

我在维基百科上阅读了this page关于200 OK状态

的信息
  

在POST请求中,响应将包含描述或包含操作结果的实体

好。但是有201 Created状态:

  

请求已完成,并导致创建新资源。

所以我的问题是:当一个POST请求成功并创建了一个新的博客文章时,我发回这两个http状态代码,或者一次只允许一个?

我没有从RFC获得此信息,我以为我没有完全阅读。

我认为一次只允许一个HTTP状态,但我应该使用哪个?

编辑(新问题):如果操作正在编辑现有博文,该怎么办?我对URI有一个PUT请求,这次我还要发回200 OK然后再发送一个Location:标头?因为这个位置与PUT请求的URI完全相同,除了它应该是GET请求之外,还可以吗?

2 个答案:

答案 0 :(得分:6)

所有2xx状态都是成功的。但是,在POST创建资源的情况下,您可能应该将201和一个位置一起返回到资源。来自规范:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2

  

请求已经完成并且已经完成   导致了一种新的资源   创建。新创建的资源   可以通过URI引用   在实体中返回   响应,具有最具体的URI   对于位置给出的资源   标题字段。应该回应   包括一个包含列表的实体   资源特征和   用户或的位置   用户代理可以选择最多的一个   适当。实体格式是   由媒体类型指定   Content-Type标头字段。该   原始服务器必须创建资源   在返回201状态代码之前。   如果行动无法进行   立刻,服务器应该回应   取而代之的是202(已接受)响应。

换句话说,你应该回复:

201 Created
Location: http://www.example.com/path/to/resource

然后,浏览器将知道这是要引用的资源,并且请求同时成功。您无需担心多重身份。

答案 1 :(得分:0)

[我意识到这个答案对于原始提问者来说有点迟了,但是其他可能在未来偶然发现问题的人可能会感兴趣]

除了AlBlue所说的:

  

换句话说,你应该回复:

201 Created
Location: http://www.example.com/path/to/resource

您也可以返回新创建的实体,只要您还设置Content-Location标题:

POST /make-new-resource

然后

HTTP/1.1 201 Created
Location: http://www.example.com/path/to/resource
Content-Location: http://www.example.com/path/to/resource

[representation of new resource]

如果您不包含Content-Location标头,则任何响应正文都将被解释为新创建资源的资源表示(而不是单个代表)的超文本列表。