【发布时间】:2021-05-04 10:10:46
【问题描述】:
这些 OpenAPI 3 路径是否不明确?
/shops/{shopId}/pets/{petId}
/shops/{shopId}/pets/_search
我想回答 否,但是,严格阅读规范,我无法决定,因为它们似乎不属于规范中的 3 条陈述:
- 两条路径都不是具体的(规范中使用的术语)
- 路径似乎不符合具有相同层次结构但模板名称不同的模板路径标准(我不太清楚):
"/shops/{}/pets/{}" != "/shops/{}/pets/_search " - 路径看起来不像模棱两可示例
以下是 OA3 规范的摘录(仅此而已:我的问题在第一行)。
OA3 规范摘录
OpenAPI 3 规范 (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#paths-object) 的“路径对象”段落说明(3 个句子,3 个语句):
匹配 URL 时,具体(非模板化)路径将在其模板化对应路径之前匹配。具有相同层次结构但不同模板名称的模板路径不得存在,因为它们是相同的。如果匹配不明确,则由工具决定使用哪一个。
这 3 个语句后面跟着 3 个示例(仅此而已):
假设以下路径,具体定义,/pets/mine, 如果使用将首先匹配:
/pets/{petId}
/宠物/我的以下路径被视为相同且无效:
/pets/{petId}
/宠物/{名字}以下可能导致不明确的解决方案:
/{实体}/我
/books/{id}
【问题讨论】:
-
不是您问题的答案。但是 URL
/shops/{shopId}/pets/_search包含一个动词search,这是一种反模式。该 URL 应为/shops/{shopId}/pets?action=_search -
@MohitMutha 为什么这是一种反模式?相反,为什么可以在查询参数中包含动词,但不能在路径参数中包含动词?
-
在 Http 中,动词是表示 CRUD 操作之一的 Http 方法(GET、PUT、POST、DELETE 等)。在上述情况下,您想要
search,这是 GET 的一种形式。GET /shops/{shopId}/pets表示我想要pets的列表,因此不需要search/ -
@MohitMutha 搜索不仅仅是获取宠物列表:例如,它是获取带有分数和方面的命中列表。但我明白你的意思:_search 不是 RESTful。