OpenAPI Generator 不生成多部分/表单数据的函数

问题描述 投票:0回答:1

我有一个使用 DRF-Spectaulous 生成的 OpenAPI 架构。重要的部分是:

...
    patch:
      operationId: patient_partial_update
      parameters:
      - in: path
        name: patient_id
        schema:
          type: string
          format: uuid
        description: A UUID string identifying this patient.
        required: true
      tags:
      - comp
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedPatientSerialiser'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedPatientSerialiser'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedPatientSerialiser'
...
components:
  schemas:
    ImageSerialiser:
      type: object
      properties:
        image:
          type: string
          format: uri
        alt:
          type: string
          maxLength: 150
        session:
          type: integer
          maximum: 9223372036854775807
          minimum: -9223372036854775808
          format: int64
          title: Session Number
        angle:
          allOf:
          - $ref: '#/components/schemas/AngleEnum'
          minimum: -9223372036854775808
          maximum: 9223372036854775807
      required:
      - alt
      - image
    PatchedPatientSerialiser:
      type: object
      properties:
        patient_no:
          type: string
          title: Patient Number
          maxLength: 25
        f_name:
          type: string
          nullable: true
          title: First Name
          maxLength: 100
        l_name:
          type: string
          nullable: true
          title: Last Name
          maxLength: 100
        sessions:
          type: integer
          maximum: 9223372036854775807
          minimum: 0
          format: int64
        images:
          type: array
          items:
            $ref: '#/components/schemas/ImageSerialiser'
...

如您所见,PATCH 请求具有 multipart/form-data 的定义,但是 openapi-generator-cli 生成的客户端仅包含对 application/json 输入的处理以及在空请求的结果中传递 FormData。显然,将其作为 JSON 传递也不起作用,因为我正在处理文件上传,所以我想知道我是否做错了什么,或者我是否只需要为这个特定用例编写自己的函数。

javascript django-rest-framework openapi openapi-generator drf-spectacular
1个回答
0
投票

所以我设法找到了解决方法,但我仍然不确定是否还有其他方法可以做到这一点。

首先,我为图像创建了一个单独的 API 端点,而不是嵌套数据(无论如何可能是更好的方法)。

其次,我根据

drf-spectaulous 文档
COMPONENT_SPLIT_REQUEST=True
添加到我的 REST_FRAMEWORK 设置中。这将创建请求与检索请求分开,并将图像属性更改为此,而不是初始模式中的 uri 格式:

    ImageSerialiserRequest:
      type: object
      properties:
        image:
          type: string
          format: binary

这允许您将 blob/文件直接传递到 API 并正确处理它。

最后,我必须进入我的架构文件并手动删除备用

requestBody
条目,这样我的
imageCreateRequest
看起来像这样:

    post:
      operationId: image_create
      tags:
      - comp
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ImageSerialiserRequest'

这是我可以让 API 客户端正确生成并以

FormData
形式发送数据的唯一方法。即使图像是二进制格式,它也只生成“application/JSON”方法。我不确定这是否是 OpenAPI 生成器的问题,或者是否有一些我错过的配置选项可以为我解决这个问题,但它确实看起来很奇怪,在定义了所有请求类型的情况下,它只生成一种与数据类型无关。我很高兴听到其他人是否找到了不同的解决方案。作为参考,我正在使用
typescript-fetch
生成器(如果这有影响的话)。

© www.soinside.com 2019 - 2024. All rights reserved.