英文:
variable in openapi 3.0 response schema
问题
Here's the translated code portion you provided:
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: 获取特定操作的信息
operationId: 获取操作信息
parameters:
- name: action
in: path
required: true
description: 操作的名称
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 响应对象的名称
{action}:
type: string
description: 操作的名称
{action}Id:
type: integer
description: 操作的ID
required:
- name
- {action}
- {action}Id
Please note that I've translated the comments and descriptions to Chinese, but the code structure remains the same.
英文:
I have a legacy REST endpoint, which I would like to adress using openapi 3.0.
The Endpoint uses a path variable:
path: action/{action}s/
and also uses this path variable in the response schema like:
response in json:
{
"name": "someName",
"{action}": "someActionName",
"{action}Id": 5
}
I couldn't find a explaination about this in the openapi guide. Is it possible to generate an openapi 3.0 spec with such a request? If yes, how would this example look like?
with this:
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: Get information for a specific action
operationId: getActionInfo
parameters:
- name: action
in: path
required: true
description: The name of the action
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: The name of the response object
{action}:
type: string
description: The name of the action
{action}Id:
type: integer
description: The ID of the action
required:
- name
- {action}
- {action}Id
in editor.swagger.io, I get a parser error in line 31. (The line with "{action}Id:")
答案1
得分: 2
看起来你正在尝试在你的模式中定义逻辑。OpenAPI 不支持根据用户定义的参数定义键的能力。最多,你可以使用 OpenAPI 的多态响应来定义基于用户输入的潜在响应。例如:
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: 获取特定动作的信息
operationId: 获取动作信息
parameters:
- name: action
in: path
required: true
description: 动作的名称
schema:
type: string
enum:
- create
- delete
- update
- get
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 响应对象的名称
oneOf:
- $ref: '#/components/schemas/CreateAction'
- $ref: '#/components/schemas/DeleteAction'
- $ref: '#/components/schemas/UpdateAction'
- $ref: '#/components/schemas/GetAction'
required:
- name
components:
schemas:
CreateAction:
type: object
required:
- create
- createId
properties:
create:
type: string
description: 动作的名称
createId:
type: integer
description: 动作的ID
DeleteAction:
required:
- delete
- deleteId
type: object
properties:
delete:
type: string
description: 动作的名称
deleteId:
type: integer
description: 动作的ID
UpdateAction:
type: object
required:
- update
- updateId
properties:
update:
type: string
description: 动作的名称
updateId:
type: integer
description: 动作的ID
GetAction:
type: object
required:
- get
- getId
properties:
get:
type: string
description: 动作的名称
getId:
type: integer
description: 动作的ID
这将允许你基于请求定义响应。如果选择这个方法,我强烈建议使用枚举作为动作,以确保只有正确的响应可以被发送回去。
然而,另一个选择是彻底改变响应。你可以做类似下面这样的事情,看起来更清晰,也更具可扩展性。
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: 获取特定动作的信息
operationId: 获取动作信息
parameters:
- name: action
in: path
required: true
description: 动作的名称
schema:
$ref: '#/components/schemas/Actions'
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 响应对象的名称
action:
type: object
required:
- name
- type
- id
properties:
type:
$ref: '#/components/schemas/Actions'
name:
type: string
description: 动作的名称
id:
type: integer
description: 动作的ID
components:
schemas:
Actions:
type: string
description: 要执行的动作
enum:
- push
- pull
- punch
- kick
这里需要注意的一点是,这只是一个例子。我不建议在响应中使用枚举,因为对响应的更改可能会破坏你的 API 的任何使用者。
英文:
It looks like you are trying to define logic within your schema. Openapi does not support the ability to define a key based upon a user defined parameter. At most, you could use openapi polymorphic responses to define a potential response based upon the user's input. For example:
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: Get information for a specific action
operationId: getActionInfo
parameters:
- name: action
in: path
required: true
description: The name of the action
schema:
type: string
enum:
- create
- delete
- update
- get
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: The name of the response object
oneOf:
- $ref: '#/components/schemas/CreateAction'
- $ref: '#/components/schemas/DeleteAction'
- $ref: '#/components/schemas/UpdateAction'
- $ref: '#/components/schemas/GetAction'
required:
- name
components:
schemas:
CreateAction:
type: object
required:
- create
- createId
properties:
create:
type: string
description: The name of the action
createId:
type: integer
description: The ID of the action
DeleteAction:
required:
- delete
- deleteId
type: object
properties:
delete:
type: string
description: The name of the action
deleteId:
type: integer
description: The ID of the action
UpdateAction:
type: object
required:
- update
- updateId
properties:
update:
type: string
description: The name of the action
updateId:
type: integer
description: The ID of the action
GetAction:
type: object
required:
- get
- getId
properties:
get:
type: string
description: The name of the action
getId:
type: integer
description: The ID of the action
This will allow you to define the response based upon the request. If going this route, I highly suggest using an enum as the action, to ensure only the proper response can be sent back.
However, another option would be to change the response altogether. You could do something like this, and it would look cleaner and be more scalable.
openapi: 3.0.0
info:
title: My API
version: 1.0.0
paths:
/myaction/{action}s:
get:
summary: Get information for a specific action
operationId: getActionInfo
parameters:
- name: action
in: path
required: true
description: The name of the action
schema:
$ref: '#/components/schemas/Actions'
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: The name of the response object
action:
type: object
required:
- name
- type
- id
properties:
type:
$ref: '#/components/schemas/Actions'
name:
type: string
description: The name of the action
id:
type: integer
description: The ID of the action
components:
schemas:
Actions:
type: string
description: The action to perform
enum:
- push
- pull
- punch
- kick
One thing of note here is that this is just an example. I don't recommend using enums in responses, as a change to your response could break any consumers of your api.
答案2
得分: 0
是的,所有版本的OpenAPI规范都支持部分段路径模板。
英文:
Yes, partial segment path templates are supported by all versions of the OpenAPI specification.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论