如何解决Flask Restful 根据请求正文中的数据以 XML 或 JSON 格式响应
我正在尝试使用 Flask-Restful 构建一个 API,其中用户发送带有所需输出(如 JSON 或 XML)的请求正文:
{ "output_format": "XML" }
上述请求正文需要 XML 响应。我只有一个资源。
我的 app.py 文件如下所示:
from flask import Flask,make_response
from flask_restful import Api
import json
from simplexml import dumps
from config import Config
from resources.location_resource import CoordinateResource
app = Flask(__name__)
app.config.from_object(Config)
api = Api(app)
@api.representation('application/xml')
def output_xml(data,code,headers=None):
resp = make_response(dumps({'root': data}),code)
resp.headers.extend(headers or {})
return resp
@api.representation('application/json')
def output_json(data,headers=None):
resp = make_response(json.dumps(data),code)
resp.headers.extend(headers or {})
return resp
api.add_resource(CoordinateResource,'/getAddressDetails')
if __name__ == '__main__':
app.run()
我的资源文件如下所示:
from flask import request
from flask_restful import Resource
from http import HTTPStatus
from flask import request
import requests
# from geocode_play import getGeocodes
from geocode import getGeocodes
class CoordinateResource(Resource):
def post(self):
request.__setattr__(
'headers',{'Accept': 'application/'.join(request.get_json()['output_format'])})
json_data = request.get_json()
output_format = json_data['output_format']
address = json_data['address'] or 'New York'
output_data = getGeocodes(address,output_format)
return output_data,HTTPStatus.OK
我构建响应的中间文件是这样的:
import requests
import xml.etree.ElementTree as ET
def getGeocodes(address,output_format):
API_KEY = 'your-api-key'
url = 'https://maps.googleapis.com/maps/api/geocode/json?'
parameters = {
"address": address,"key": API_KEY
}
response_data = requests.get(url,params=parameters).json()
output_json_data = {
"coordinates": {
"lat": response_data['results'][0]['geometry']['location']['lat'],"lng": response_data['results'][0]['geometry']['location']['lng']
},"address": response_data['results'][0]['formatted_address']
}
if output_format == 'xml' or output_format == 'XML':
return {
"coordinates": {
"lat": response_data['results'][0]['geometry']['location']['lat'],"lng": response_data['results'][0]['geometry']['location']['lng']
},"address": response_data['results'][0]['formatted_address']
}
return output_json_data
此示例要求请求的标头声明 Accept: application/XML 以使 XML 工作,但它不关心输出格式变量。你能帮忙吗?
解决方法
尝试以下未测试但应该可以工作的代码
from flask import make_response
class CoordinateResource(Resource):
json_data = request.get_json()
output_format = json_data['output_format']
address = json_data['address'] or 'New York'
output_data = getGeocodes(address,output_format)
response = make_response(output_data)
format = json_data["output_format"]
if format.lower() == "xml":
response.headers["Content-Type"] = "application/xml"
else:
response.headers["Content-Type"] = "application/json"
return response
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。