Description
OpenAPI 3.0 ignores Content-Type in a response headers map; response media types belong in content. Names such as Accept or Authorization are not categorically forbidden for every response header, so check their actual HTTP meaning and contract.
Potential impact
Misdocumenting the body format or repurposing standard headers for business data can make generated clients disagree with actual responses.
Remediation
Describe media types through response content in OpenAPI 3.0 or produces in Swagger 2.0. Define other response headers to match the names and value formats actually returned, without arbitrarily changing standard header semantics.
Examples
These OpenAPI 3.0 examples compare a Content-Type definition with a separate Pet header. Pet is only an example for genuine business metadata; it is not a renamed substitute for the body-format header.
Before
{
"openapi": "3.0.0",
"info": {
"title": "Simple API Overview",
"version": "1.0.0"
},
"paths": {
"/": {
"get": {
"operationId": "listVersionsv2",
"summary": "List API versions",
"responses": {
"500": {
"description": "500 response",
"content": {
"application/json": {
"examples": {
"foo": {
"value": {
"versions": [
{
"status": "CURRENT",
"updated": "2011-01-21T11:33:21Z",
"id": "v2.0",
"links": [
{
"href": "http://127.0.0.1:8774/v2/",
"rel": "self"
}
]
}
]
}
}
}
}
}
},
"400": {
"description": "400 response",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"examples": {
"foo": {
"value": {
"versions": [
{
"status": "CURRENT",
"updated": "2011-01-21T11:33:21Z",
"id": "v2.0",
"links": [
{
"href": "http://127.0.0.1:8774/v2/",
"rel": "self"
}
]
}
]
}
}
}
}
}
}
}
}
}
}
}
After
{
"openapi": "3.0.0",
"info": {
"title": "Simple API Overview",
"version": "1.0.0"
},
"paths": {
"/": {
"get": {
"operationId": "listVersionsv2",
"summary": "List API versions",
"responses": {
"500": {
"description": "500 response",
"content": {
"application/json": {
"examples": {
"foo": {
"value": {
"versions": [
{
"status": "CURRENT",
"updated": "2011-01-21T11:33:21Z",
"id": "v2.0",
"links": [
{
"href": "http://127.0.0.1:8774/v2/",
"rel": "self"
}
]
}
]
}
}
}
}
}
},
"400": {
"description": "400 response",
"headers": {
"Pet": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"examples": {
"foo": {
"value": {
"versions": [
{
"status": "CURRENT",
"updated": "2011-01-21T11:33:21Z",
"id": "v2.0",
"links": [
{
"href": "http://127.0.0.1:8774/v2/",
"rel": "self"
}
]
}
]
}
}
}
}
}
}
}
}
}
}
}
The revised response still describes its JSON body in content.application/json. If Pet is needed, the server must actually return that string header value.