HTTP 200响应是否意味着必须有一个响应体



我正试图破译Swagger规范文档并使用它生成代码。它包含以下端点定义:

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

基于端点摘要和200响应描述,我很清楚,这个端点旨在返回一个包含"0"的数组或集合的响应体;"特征";,即使在规范中没有定义响应

假设我是对的,规范作者只是忘记添加它。那么我应该如何看待这个端点:

/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. 在这种情况下,规范作者使用HTTP204来明确表示没有响应体会不会不那么令人困惑?(我可以回答这个问题--但在这种情况下有理由使用HTTP 200而不是204吗?或者这只是因为作者不知道HTTP 200以外的成功响应代码吗?(
  3. 如果#1的答案是否定的,#2的答案是肯定的:为什么HTTP是以这种方式定义的
  1. 200 OK可以用Content-Length: 0返回一个空体
  2. 204 No Content有一个比许多人意识到的更具体的目的。引用当前规范:

204响应允许服务器指示操作已经成功应用于目标资源,同时意味着用户代理不需要遍历离开其当前的"代理";文件视图";(如有(。服务器假定用户代理将提供对用户的一些成功指示,与自己的一致接口,并在响应中应用任何新的或更新的元数据它的积极代表。

基本上就是说,例如,如果提交了一个HTML表单,服务器用204响应,它可以向浏览器发出信号,让其不要将当前页面刷新到新位置,或者重定向到其他任何位置。例如,它可以在不强制浏览器重定向/切换到新url的情况下促进"保存"操作。另请参阅205以了解类似的操作,但具有不同的行为。

浏览器(据我所知(实际上并没有实现这种行为。但是REST/Hypermedia/HATEOAS客户端可以

当前规范还说明了更常见的用途,即200 without a response body,但如果您一直回到HTTP/1.0规范,这就是整个部分。注意,它只有提到了这种行为,而没有说明204只是200减号体的替代品:

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

所以这里的关键是,这表明超媒体客户端应该如何表现。除去这一点,我同意没有太多理由使用204。我认为这已经成为一种没有强烈目的的惯例。

旁注:除非你对网络考古学感兴趣,否则不要参考RFC2616。

  1. 参见#2

最新更新