当前位置: 首页 > 知识库问答 >
问题:

OpenAPI 3:如何在PATCH请求体中要求一个或多个属性?

申屠乐池
2023-03-14

我有一个用户资源:

我想定义一个补丁,这样客户端就可以更新image、bio或两者。

有效的请求主体示例如下:

{
  "image": "filename.jpg",
  "bio": "My biography"
}

如果image属性单独发送,则现有的bio属性将在服务器上保持不变,并且只会更新图像。如果两者都发送(如上所述),两者都将更改。

简而言之:

>

  • 不允许使用空的请求正文。

    {"image":"new.jpg"}{"bio":"new bio"or{"image":"new.jpg","bio":"new bio"是允许的。

    这就是我目前所拥有的。我正在使用带有两个独立类型的anyOf对象:object。我曾使用virtserver在Swagger hub上尝试过这一点,但虚拟服务器似乎总是返回200 OK并返回示例数据,无论传递了什么,所以我没有办法知道。

    我的定义符合我的意图吗?如果没有,最佳做法是什么?

    openapi: 3.0.0
        ...
        
        patch:
          summary: update a user
          parameters:
            - in: path
              name: uid
              description: user id
              schema:
                type: string
              required: true
          requestBody:
            description: Update a user's profile
            content:
              application/json:
                schema:
                  type: object
                  anyOf:
                    - type: object
                      properties:
                        image:
                          type: string
                    - type: object
                      properties:
                        bio:
                          type: string
                  additionalProperties: false
            required: true
          responses:
            '200':
              description: Successfully updated
              content:
                application/json:
                  schema:
                    $ref: '#/components/schemas/User'
    
  • 共有1个答案

    范书
    2023-03-14

    您可以使用minProperties:1:

          requestBody:
            description: Update a user's profile
            content:
              application/json:
                schema:
                  type: object
                  properties:
                    image:
                      type: string
                    bio:
                      type: string
                  minProperties: 1   # <-----------
                  additionalProperties: false
    

    或所需的任何一项:

                  type: object
                  properties:
                    image:
                      type: string
                    bio:
                      type: string
                  anyOf:   # <-----------
                    - required: [image]
                    - required: [bio]
                  additionalProperties: false
    

    您的原始示例定义了一个空对象{},因为:

    1. 如果未定义“必需”或“最小属性”,则所有属性都是可选的

    至于:

    我曾使用VirtServer在SwaggerHub上尝试过这一点,但虚拟服务器似乎总是返回200 OK,并返回示例数据,不管传递了什么。

    这是因为SwaggerHub模拟不会验证输入,并且始终返回基于响应模式的静态响应。

    从SwaggerHub留档:

    请注意,mock不支持业务逻辑,即它不能根据输入发送特定响应。

    ...

    模拟根据其响应和规范中定义的响应媒体类型为每个API操作生成静态响应。

    如果一个操作有多个响应代码,则模拟返回具有最低状态代码的响应。例如,如果操作具有响应201、202和400,则模拟返回201响应。

     类似资料:
    • 我有这个OpenAPI模式: 所有属性都是必需的。这是用于<code>PUT/user/profile<code>的。 我会把它改成 。用户发送的参数只是他们只请求更改。系统验证至少需要一个参数。 我如何描述[用户名,电子邮件,描述,个人资料_图标]之一是必需的? 可接受的示例请求: 不可接受的示例(错误): 注释器很接近,但它似乎仅适用于模式,而不是属性。 https://swagger.io/

    • 我正在尝试发送一个经过身份验证的请求,只需点击邮递员。 所以,我有一个名为“Oauth”的请求,我正在使用测试将令牌存储在局部变量中。 我现在要做的是,对于需要承载令牌的任何其他请求,自动运行Oauth请求(从预请求脚本)。 有没有一种方法可以通过单击邮递员按钮来获取访问令牌并发送经过身份验证的请求?

    • 问题内容: 我对PersonDTO具有以下定义: 这是一个示例记录: 现在,约翰·多伊离婚了。因此,我需要向该URL发送PATCH请求: 带有以下请求正文: 我不知道该怎么做。这是我到目前为止尝试过的: 这是上述问题: 1)由于我仅设置了MaritalStatus,因此其他字段均为null。因此,如果我打印出请求,它将看起来像这样: 这是否意味着我必须先获得GET才能进行PATCH? 2)我得到以

    • 在Jersey 2中,我试图开发一种方法,它允许传递一对JSON列表(服务、方法),这些列表表示REST请求中对资源的访问路径,并将结果聚合到单个响应中。因此,JSON列表可以如下所示: 相应的命令bean可以如下所示: 我找到了这个主题,但它似乎适用于Jersey的版本1:如何在单个请求中访问多个资源:Jersey Rest 谢谢你的回答,为我糟糕的英语感到抱歉。

    • 问题内容: 我有几乎相同的Ajax Request调用,但我需要对其进行扩展以使其更加通用 参见示例代码:http : //jsfiddle.net/2b8gR/6/ 我让它适用于Page A,并且想将其用于Page B,C,D等…,但不想为每个新的Ajax请求重写该函数。 除以下内容外,大多数代码将保持不变: 输入下一个/上一个(page_a_next变为page_b_next) 显示页面div

    • 早上好 是否有办法获得请求。要求要求一场在图像的层次结构中看到的属性?我尝试了以下方法: <代码>对象值=请求。getAttribute(“Travis”) 以及