代码之家  ›  专栏  ›  技术社区  ›  p4bl0

HTTP状态的兼容性

  •  2
  • p4bl0  · 技术社区  · 16 年前

    我目前正在实现一个RESTfulAPI(不严重,只是为了一个有趣的博客引擎),我对HTTP状态兼容性有一些疑问。

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

    我读下去 this page 来自维基百科关于 200 OK 现状

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

    可以。但是还有 201 Created 状态:

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

    所以我的问题是:当一个帖子请求成功并且创建了一个新的博客帖子时,我会返回这两个HTTP状态代码,或者一次只允许一个?

    我没有从 RFC 我以为我没有完全读完。

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

    编辑 (新问题):如果操作正在编辑现有的博客文章怎么办?我对一个URI有一个Put请求,这次我必须发送回 200行 然后一个 Location: 头球也是吗?因为这个位置将与放置请求的URI完全相同,除了它应该是一个GET请求,可以吗?

    2 回复  |  直到 13 年前
        1
  •  6
  •   AlBlue RACGAMERUP    16 年前

    所有2xx状态均成功。但是,在发布以创建资源的情况下,您可能应该返回201以及资源的位置。从规格:

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

    请求已完成,并且 导致新资源 创建。新创建的资源 可以由URI引用 在实体中返回 响应,具有最特定的URI 对于位置给定的资源 标题字段。反应应该是 包括包含以下列表的实体 资源特征和 用户或 用户代理可以选择 合适的。实体格式为 由中给定的媒体类型指定 内容类型标题字段。这个 源服务器必须创建资源 返回201状态代码之前。 如果无法执行操作 服务器应立即响应 改为202(接受)响应。

    换句话说,您应该返回:

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

    浏览器将知道这是要引用的资源,并且请求已成功。你不需要担心多重身份。

        2
  •  0
  •   Nicholas Shanks    13 年前

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

    除了阿尔布卢所说的:

    换句话说,您应该返回:

    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]
    

    如果不包括 内容位置 header,任何响应主体都将被解释为新创建资源的超文本资源表示列表(而不是单个代表)。