若要自定义 XML 或 JSON 格式的响应媒体类型,需要按以下方式定义。
您需要定义一个 Flask 实例和 api 实例:
app = Flask(__name__)
api = Api(app)
然后,您需要定义支持的表示。
要声明 XML 响应格式,请定义以下内容:
@api.representation('application/xml')
def output_xml(data, code, headers=None):
resp = make_response(dumps({'response' : data}), code)
resp.headers.extend(headers or {})
return resp
要声明 JSON 响应格式,请执行以下操作:
@api.representation('application/json')
def output_json(data, code, headers=None):
resp = make_response(json.dumps({'response' : data}), code)
resp.headers.extend(headers or {})
return resp
默认情况下,api = Api(app)
响应格式为 JSON 格式,但如果您仍想为 REST API 设置默认响应格式,则可以将 API 实例更改为 api = Api(app, default_mediatype='application/json')
您还可以使用以下方式来声明响应格式。@api.representation()
api.representations['application/json'] = output_json
api.representations['application/xml'] = output_xml
您还可以通过使用自己的输出函数对 Api 类进行子类化来声明不同的响应格式:
class Api(restful.Api):
def __init__(self, *args, **kwargs):
super(Api, self).__init__(*args, **kwargs)
self.representations = {
'application/xml': output_xml,
'text/html': output_html,
'text/csv': output_csv,
'application/json': output_json,
}
让我们看一下示例的实现部分。
先决条件
Python 3.9.0、Flask 1.1.2 (pip install flask)、Flask-Restful 0.3.8 (pip install flask-restful)、Python-Simplexml 0.1.5 (pip install python-simplexml)
程序目录
您可以在系统中的任何位置为应用创建根目录。
我的示例的根目录名称是 python-flask-rest-api-multiple-response-formats。
将本示例所有的 Python 脚本都保存在这个根文件夹中。
REST 资源类
我要创建的第一件事是REST资源类。
rest.py
from flask import request
from flask_restful import Resource
class Greet(Resource):
def get(self):
return {'message' : 'Hello, how are you?'}
def post(self):
req = request.get_json()
print('req', req)
return req, 201
class GreetName(Resource):
def get(self, name):
return {'message' : 'Hello ' + name + ', how are you?'}
我创建了两个类——Greet 和 GreetName。Greet 类定义了两个函数 get()
和post()
. 用于资源获取或提取数据,并用于在服务器中创建新资源。
REST 配置
在这里,我将声明JSON和XML响应格式,REST API路由。
app.py
import rest
import json
from simplexml import dumps
from flask import Flask, make_response
from flask_restful import Api
app = Flask(__name__)
api = Api(app)
#api = Api(app, default_mediatype='application/json')
@api.representation('application/json')
def output_json(data, code, headers=None):
resp = make_response(json.dumps({'response' : data}), code)
resp.headers.extend(headers or {})
return resp
@api.representation('application/xml')
def output_xml(data, code, headers=None):
resp = make_response(dumps({'response' : data}), code)
resp.headers.extend(headers or {})
return resp
#api.representations['application/json'] = output_json
#api.representations['application/xml'] = output_xml
api.add_resource(rest.Greet, '/')
api.add_resource(rest.GreetName, '/<string:name>')
if __name__ == "__main__":
app.run()
创建应用程序和 api 实例后,我声明了响应格式。
测试应用程序
网址: http://localhost:5000/
默认情况下,响应为 JSON,如下图所示:
如果需要 XML 格式的响应,请在标头中添加 Accept/(application/xml) 键/值对。
对于POST请求,没有处理输入数据,只是在响应中返回。
网址:http://localhost:5000/<name>
通过名称作为路径参数传递的响应。
默认格式为 JSON。
您还可以通过在 HTTP 标头中设置 Accept/(application/xml) 键/值对来检查 XML 响应。