OpenAPI路径模板是否支持RFC 6570语法及规范问询
我存在一些困惑,swagger.io提到OpenAPI参数序列化与RFC 6570路径/查询模板语法存在关联,openapis.com文档也有相关提及。我关注的是路径模板字符串中表达OpenAPI参数的确切语法。
A) OA规范是否允许使用RFC 6570的相关部分来替代参数对象?
我知道以下写法是被允许的:
paths: "/test/{foo}": get: operationId: getFoo parameters: - in: path name: foo required: true style: label schema: type: string
但以下写法是否被允许?它与第一种写法等价吗?
paths: # Parameters array omitted, as "." marks "foo" a "label" style parameter "/test/{.foo}": get: operationId: getFoo
B) 若第二种示例不被允许,路径参数的语法是什么?
从示例来看似乎是{<identifier>},但是否还有更多规则?
C) 若采用B选项(路径模板不使用RFC语法),{<identifier>}是否必须对应匹配的参数对象?
即路径模板中有多少个{<identifier>},就需要对应多少个参数对象?我对文档措辞不是完全确定,但openapis.com似乎暗示了这一点。文档还提到:
An exception is if the path item is empty, for example due to ACL constraints, matching path parameters are not required.
这句话是什么意思?
参考资料:
- OpenAPI 3.1规范:路径模板匹配章节
- Swagger文档:参数序列化章节
解答
A) 不允许,二者不等价
OpenAPI规范不支持用RFC 6570的模板语法(比如{.foo})来替代显式的参数对象。路径模板里的{<name>}仅用于标识参数的位置,参数的具体规则(类型、风格、是否必填等)必须通过parameters数组中的对象定义。
你提供的第二种写法是无效的:
- OpenAPI解析器只会识别
{foo}这类无修饰的占位符作为路径参数,{.foo}会被当作字面量路径的一部分,不会被解析为参数。 - 即使解析器能识别RFC 6570语法,也无法推断参数的类型、是否必填等关键信息,而这些是OpenAPI规范要求必须明确声明的。
B) 路径参数的标准语法
OpenAPI路径模板的参数语法只有一种:{<parameter-name>},其中<parameter-name>必须符合以下规则:
- 只能包含字母、数字、下划线(
_)、连字符(-)和点(.) - 不能包含RFC 6570中的修饰符(比如
.、/、?等前缀) - 参数名称必须与
parameters数组中对应路径参数的name字段完全匹配
C) 是的,必须一一对应;例外情况说明
参数对象必须与路径模板占位符一一对应:
路径模板里的每一个{<identifier>},都必须在parameters数组中有一个对应的in: path参数对象,且name字段完全一致。反之,parameters中的路径参数也必须在路径模板中有对应的占位符,否则会被视为无效定义。例外情况的含义:
文档中提到的例外是指:如果某个路径项(paths下的某个路径)是空的(比如因为ACL权限限制,没有定义任何HTTP方法),那么即使路径模板里有占位符,也不需要提供对应的参数对象。举个例子:paths: "/test/{foo}": # 没有定义get/post等任何操作,是空的路径项这种情况下,
{foo}不需要对应的参数对象,因为这个路径项没有任何可执行的操作,参数规则也就没有意义。
内容的提问来源于stack exchange,提问作者Balázs Édes

