【发布时间】:2020-12-26 09:57:08
【问题描述】:
几年前,我创建了a tiny web service,它以两种表示形式提供相同的资源。
# returns a collection of Foos
GET /foo
# returns the same collection of Foos in a different JSON representation
GET /foo?projection=X with 'Accept: my-specific-media-type'
这在 (Java) 代码中非常有效,因为我可以将两个方法映射到相同的 @Path 并具有不同的返回类型。一个接受 @QueryParam 和 @Consumes 特定的媒体类型,而另一个不接受。
但是,根据(当前)@ApiOperationSwagger 注释,我选择了错误的 API 设计。
HTTP 方法和路径的组合创建了唯一的操作
因此,在我将旧项目升级到当前库版本后,Swagger 模型仅包含一个 GET /foo 操作 - 这是随机的,因为它依赖于通过 Java 反射进行的运行时代码自省。
所以,问题是这样的:Foo 资源以不同的表示形式实际上是“相同”资源还是不同的资源? Swagger 注释似乎暗示了后者(不同的资源 -> 不同的路径)。
【问题讨论】:
-
通常使用内容类型协商(即使用
Accept和Content-Type标头)让服务器和客户端确定使用哪种表示格式。在 HTML 表单的情况下,即发送到服务器的媒体类型要么是隐式 (application/x-www-form-urlencoded),要么是显式给出。不幸的是,Swagger has hardly anything to do with REST -
是的,我完全了解内容类型协商的注意事项。不管客户端如何表达它想要使用的表示,都存在
Foo的表示是否构成资源的问题。Foo是资源还是Foo-as-JSON 是资源? Swagger 与 REST 有很大关系,因为 Swagger 成为 OpenAPI 2 规范,这反过来又导致了 OpenAPI 3。你链接到的 Q 谈论了 Swagger 与 HATEOAS。在 OpenAPI 2 和 3 中,您都不能指定具有多种不同响应类型的路径。 -
REST 架构中的资源是untyped。通常,数据,无论其表示形式如何,都定义了资源。表示只是该日期相对于所选媒体类型的具体实例。同样,Swagger 与 REST 没有太大关系。如果是这样,它就会对现在和实际上更接近 RPC 而不是 REST 的情况做出错误的描述。当然,对于那些散布错误含义的“伪 REST”API,您可能会觉得它确实属于 REST 堆栈,但它并不
标签: rest swagger jax-rs openapi