下面是一个API *.yml部分。我想为要Content-type: text/plain
的数据设置响应标头,但它现在总是返回application/json
。
/order:
post:
tags:
- order
summary: order
operationId: PostOrder
parameters:
requestBody:
description: Order result
content:
application/json:
schema:
type: object
properties:
openReq:
type: string
example: 'test'
responses:
200:
description: Customer order receive successed
headers: {}
content:
application/json:
schema:
type: string
text/plain:
schema:
type: string
响应由以下 python 代码返回:
def post_order(platform, open_req=None): # noqa: E501
"""order
"""
return 'do some magic!'
响应标头始终处于content-type: application/json
responses:
200:
description: Customer order receive successed
headers: {}
content:
application/json:
schema:
type: string
text/plain:
schema:
type: string
此代码段的响应标头始终处于content-type: text/plain; charset=utf-8
responses:
200:
description: Customer order receive successed
headers: {}
content:
# application/json:
# schema:
# type: string
text/plain:
schema:
type: string
我可以在函数post_order
中设置响应标头内容类型吗?
如果希望函数动态决定返回哪种内容类型,则必须按照文档中的说明显式设置标头。
两种方法之一是返回内容的元组、返回代码和标头字典,如下所示:
def post_order(platform, open_req=None):
"""order
"""
return 'do some magic!', 200, {'content-type': 'text/plain'}
第二种方法是显式创建一个响应对象并返回:
from connexion.lifecycle import ConnexionResponse
def post_order(platform, open_req=None):
"""order
"""
return ConnexionResponse(
status_code=200,
content_type='text/plain',
body='do some magic!'
)
这使您可以更好地控制其他调整。但是,如果简单的元组解决方案适用于您的情况,则没有必要。
如果您发送具有特定 mimetype 的内容,则接受的答案将不起作用,我试图发送text/csv
,唯一有效的(不/r/n
响应中作为字符并且不使用Connexion/flask/swagger-ui
生成换行符)是这个
from connexion.lifecycle import ConnexionResponse
def post_order(platform, open_req=None):
"""order"""
return ConnexionResponse(
status_code=200,
content_type='text/csv',
mimetype='text/csv', # <----
body='do some magic!'
)
解释:
上一个答案中的第一种方法对我根本不起作用
def post_order(platform, open_req=None):
"""order"""
return 'do some magic!', 200, {'content-type': 'text/plain'}
当我尝试发送text/csv
时,设置中的其他一些步骤将内容类型更改回application/json
。
但是,第二种方法
from connexion.lifecycle import ConnexionResponse
def post_order(platform, open_req=None):
"""order"""
return ConnexionResponse(
status_code=200,
content_type='text/plain',
body='do some magic!'
)
设置为text/csv
时确实正确更改了content-type
,但没有正确设置 mimetype,我花了一段时间才弄清楚为什么我在没有产生换行符的情况下获得带有/r/n
的字符串。这可能是因为Connexion仍在尝试将响应呈现为JSON而不是预期的text/csv
。
我发布的解决方案是唯一有效的方法,除了直接使用烧瓶响应,我也将包括在这里,这让我倾向于解决方案
from flask import Response
def post_order(platform, open_req=None):
"""order"""
return Response('do some magic!', mimetype='text/csv')
ConnexionResponse "docs"(它是源代码):https://github.com/spec-first/connexion/blob/9be473d5eabebde3df8d50e69f46513a66bba497/connexion/lifecycle.py
也许您将 API Swagger 文档与实际实现混淆了,您的文档是正确的,这意味着响应200 OK
,可以返回为application/json
或text/plain
。返回哪一个完全取决于终结点的实现。如果你的端点只返回application/json
,那么你永远不会收到text/plain
,这不是Swagger/OpenApi的工作。