我正在尝试解密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'
这个对我来说是模棱两可的。我已经看到了更新端点的一些实现,这些实现返回更新后的对象。我见过的其他人在体内什么也没有返回。
我的问题是这个
答案 0 :(得分:2)
200 OK
可以返回带有Content-Length: 0
的空正文。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。