我目前正在实施一个RESTful API(没什么大不了的,只是为了我正在开发的博客引擎)我还有一些关于HTTP状态兼容性的问题。
要创建新的博客文章,我必须执行POST请求,如果一切正常,则创建帖子,然后以与请求相对应的格式返回。
我在维基百科上阅读了this page关于200 OK
状态
在POST请求中,响应将包含描述或包含操作结果的实体
好。但是有201 Created
状态:
请求已完成,并导致创建新资源。
所以我的问题是:当一个POST请求成功并创建了一个新的博客文章时,我发回这两个http状态代码,或者一次只允许一个?
我没有从RFC获得此信息,我以为我没有完全阅读。
我认为一次只允许一个HTTP状态,但我应该使用哪个?
编辑(新问题):如果操作正在编辑现有博文,该怎么办?我对URI有一个PUT请求,这次我还要发回200 OK
然后再发送一个Location:
标头?因为这个位置与PUT请求的URI完全相同,除了它应该是GET请求之外,还可以吗?
答案 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
标头,则任何响应正文都将被解释为新创建资源的资源表示(而不是单个代表)的超文本列表。