Description
Describe the bug
Support for multiple content types for a single endpoint was added in #453 / #822. However, the implemented fix generates non-functional code if the content types expect the same model. For instance, take this Api Spec snippet:
paths./api/dns/add/...
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/DnsCreate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/DnsCreate'
multipart/form-data:
schema:
$ref: '#/components/schemas/DnsCreate'
required: true
...
components.schemas...:
DnsCreate:
type: object
properties:
name:
type: string
dns_type:
oneOf:
- $ref: '#/components/schemas/DnsTypeEnum'
- $ref: '#/components/schemas/BlankEnum'
content:
type: string
ttl:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- content
- dns_type
- name
All 3 content types expect the same content type: DnsCreate. However, this generates this Python code:
def _get_kwargs(
*,
body: Union[
DnsCreate,
DnsCreate,
DnsCreate,
],
) -> dict[str, Any]:
headers: dict[str, Any] = {}
_kwargs: dict[str, Any] = {
"method": "post",
"url": "/api/dns/add/",
}
if isinstance(body, DnsCreate):
_kwargs["json"] = body.to_dict()
headers["Content-Type"] = "application/json"
if isinstance(body, DnsCreate):
_kwargs["data"] = body.to_dict()
headers["Content-Type"] = "application/x-www-form-urlencoded"
if isinstance(body, DnsCreate):
_kwargs["files"] = body.to_multipart()
headers["Content-Type"] = "multipart/form-data"
_kwargs["headers"] = headers
return _kwargs
This results in all requests made to this endpoint being treated as multipart form data, and it is impossible to make a JSON or form-urlencoded request.
Desktop (please complete the following information):
- Python Version: 3.12.3
- openapi-python-client version: 0.25.0
Additional context
While it may seem odd to support 3 different content types for the same endpoint, this specification has the advantage of making Django Rest Framework's interactive API support form uploads (instead of requiring you to manually edit JSON). While I'm sure this is a more niche problem, I think we can all agree that this is problematic code generation. While I haven't contributed to this repo, perhaps supporting an additional content type parameter is the solution (rather than relying on isinstance
calls).