我遵循OpenAPI(swagger)规范来定义我的API端点。这是获取用户数据的端点定义的摘录:
"paths": {
"/users/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"description": "The user ID on which the operation will be executed.",
"required": true,
"type": "integer",
"format": "int32",
}
]
}
}
但是我想使用 / users / me 来获取登录用户的数据(因为在某些时候,用户ID对于已登录用户来说是未知的)。正如你所看到的, me 是一个字符串,而不是一个整数,所以我找不到根据OpenAPI规范在参数定义中混合类型的方法。
有没有办法或解决方法呢?我应该定义另一个端点 / users / me 并复制 / users / {id} 定义以满足此需求吗?
答案 0 :(得分:3)
我认为有两种可能的方法可以做到这一点:
/users/me
定义第二个端点,而不包含任何路径参数。 Swagger应该允许这样做,因为URI字符串是不同的。 users/me
段与期望整数值的端点不匹配;也不是整数与固定字符串me
匹配。{id}
参数键入为字符串,pattern约束允许“我”或整数。以下是第二个选项的样子:
{
"paths": {
"/users/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"description": "The user ID on which the operation will be executed.",
"required": true,
"type": "string",
"pattern": "^[-+]?[1-9]\\d*$|^[Mm][Ee]$"
}
]
}
}
}
注意:
+
或-
符号,后跟一个整数值。如果您不需要有符号整数,则可以删除[-+]?
表达式。\d
(十进制数字)的转义反斜杠。 JSON字符串需要这个。me
作为整数的替代,使用大小写的任意组合。 至于是否使用第一个或第二个选项,它实际上取决于您的API和您的代码。如果API契约完全相同,从语法上讲,第二个选项的优点是只需要一个路径对象,因此代码中只有一个处理程序。
如果规则不同,例如/users/me
变体需要在标头中传递API密钥或用户令牌,然后第一个选项可能更清晰。
答案 1 :(得分:1)
如果你对多路复用相同的api不感兴趣,那么最简单的解决办法就是把它分解成两个api。
例如
/users/{id}
/current_user
/current_user
路径甚至不需要任何参数,因为您选择实施的身份验证方案就足够了。