DRF+aspida+openapi2aspidaでRequestBodyがFormDataになってしまう
DRFで生成していたopenapiスキーマをopenapi2aspidaで変換するとリクエストボディがFormDataになってしまう
結論: スキーマの定義に multipart/form-data が含まれているとFromDataとして解釈してしまう。
code:py
if (isRefObject(target.requestBody)) {
const ref = resolveReqRef(openapi, target.requestBody.$ref);
reqFormat = 'FormData';
reqFormat = 'URLSearchParams';
}
元になった openapi.yaml はこれ。
application/json と multipart/form-data の両方が定義されているのでFormDataになってしまう。
code:yaml
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AnswerSubmitRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/AnswerSubmitRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/AnswerSubmitRequest'
openapi2aspida が複数の Content-Type を持つ場合を想定していないっぽい。
解決策
とりあえずSchema側で、 application/json だけ返すようにする。
code:settings.py
SPECTACULAR_SETTINGS = {
...
}
本質的な解決
別にDjango側のスキーマとして間違っている訳ではないので本質的な解決ではない。
どうあるべきかというと、 openapi2aspida の挙動を変えるのが自然
生成時に preferredContentType のようなオプションで application/json を指定したら、優先するといったもの。
提案してみてもいいかもしれない。