Flask Restful 根据请求正文中的数据以 XML 或 JSON 格式响应

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?