我有一个使用 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 传递也不起作用,因为我正在处理文件上传,所以我想知道我是否做错了什么,或者我是否只需要为这个特定用例编写自己的函数。
所以我设法找到了解决方法,但我仍然不确定是否还有其他方法可以做到这一点。
首先,我为图像创建了一个单独的 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
生成器(如果这有影响的话)。