HTTP 200响应是否暗示必须有一个响应正文?

时间:2020-07-10 23:10:26

标签: http swagger openapi

我正在尝试解密Swagger规范文档并使用它生成代码。它包含以下端点定义:

/feature:
  get:
    summary: Returns all features
    operationId: getAllFeatures
    tags:
      - feature
    responses:
      '200':
        description: 'Features retrieved successfully'
      '400':
        $ref: '#/responses/BadRequest'

根据端点摘要和200响应说明,对我来说很清楚,即使该响应未在规范中定义,该端点也打算返回包含“特征”数组或集合的响应主体。

假设我是对的,并且规范作者只是忘记添加它。那我该怎么做这个端点:

/features:
  put:
    summary: Updates an existing feature
    operationId: updateFeature
    parameters:
      - name: body
        in: body
        description: 'Feature to be updated'
        required: true
        schema:
          $ref: '#/definitions/Feature'
    tags:
      - feature
    responses:
      '200':
        description: 'Feature updated'

这个对我来说是模棱两可的。我已经看到了更新端点的一些实现,这些实现返回更新后的对象。我见过的其他人在体内什么也没有返回。

我的问题是这个

  1. HTTP 200响应是否暗示必须为响应正文?我无法确定HTTP规范(https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)是否需要,还是只是声明它可以存在。
  2. 在这种情况下,规范作者使用HTTP 204明确表示没有响应正文是否会引起混淆? (我可以回答这个问题--但是在这种情况下是否有理由使用HTTP 200而不是204?或者这仅仅是作者不知道HTTP 200以外的成功响应代码吗? )
  3. 如果#1的答案为否,而#2的答案为是:为什么以这种方式定义HTTP?

1 个答案:

答案 0 :(得分:2)

  1. 200 OK可以返回带有Content-Length: 0的空正文。
  2. 204 No Content具有比许多人意识到的更具体的目的。引用current spec

204响应允许服务器指示该操作已被执行 成功应用于目标资源,同时暗示 用户代理不需要遍历其当前的“文档” 视图”(如果有)。服务器假定用户代理将提供 根据用户自己的情况向用户表明成功的迹象 界面,并在响应中应用任何新的或更新的元数据 它的主动表示。

基本上是说,例如,如果提交了HTML表单,并且服务器以204进行响应,则服务器可以用信号通知浏览器将当前页面刷新到新位置,或重定向到其他任何地方。例如,它可以简化“保存”操作,而无需强制浏览器重定向/切换到新的URL。另请参见205,以了解类似的操作,但具有不同的行为。

浏览器(据我所知)实际上并未实现此行为。但是REST / Hypermedia / HATEOAS客户端可以

当前规范也说明了更普遍的用法,即200 without a response body,但是如果您一路回到HTTP / 1.0规范,这就是整个section。请注意,它提到了此行为,而没有说204只是200负体的替代物:

服务器已完成请求,但是没有新信息可发送回。如果客户端是用户代理,则不应更改导致生成请求的文档视图的文档视图。该响应主要旨在允许输入脚本或其他操作,而不会导致用户代理的活动文档视图发生更改。响应中可能包含实体标头形式的新元信息,该新元信息应适用于当前在用户代理的活动视图中的文档。

因此,这里的关键是它表示超媒体客户端应如何运行。删除这一点,我同意没有太多理由使用204。我认为这没有约定的目的。

旁注:除非您是互联网考古专家,否则请不要参考RFC2616。

  1. 请参阅#2