同时获取表单和json格式的POST参数

问题描述 投票:0回答:3

我的网络服务应以以下两种格式接收呼叫:application / x-www-form-urlencodedcontent-type application / json

下面的代码可正确用于表单。但是,它不适用于json。显然我需要使用request.args.get

是否可以修改代码,以便同一方法可以接收这两种格式的调用?

@app.route("/api/<projectTitle>/<path:urlSuffix>", methods=['POST'])
def projectTitlePage(projectTitle, urlSuffix):

    apiKey = request.form.get('apikey')
    userId = databaseFunctions.getApiKeyUserId(apiKey)
    userInfo = databaseFunctions.getUserInfo(userId)
    projectId = databaseFunctions.getTitleProjectId(projectTitle)
    projectInfo = databaseFunctions.getProjectInfo(projectId)
    databaseFunctions.addUserHit(userId, projectId)
    databaseFunctions.addProjectHit(userId)

    print request.form.to_dict(flat=False)
    try:
        r = requests.post(projectInfo['secretUrl'], data=request.form.to_dict(flat=False))
    except Exception, e:
        return '/error=Error'

    return r.text
python api post flask http-post
3个回答
4
投票

尝试使用Request.get_json()获取JSON;如果失败,则会引发异常,之后您可以退回到使用Request.get_json()

request.form

如果模仿类型不是from flask import request from werkzeug.exceptions import BadRequest try: data = request.get_json() apiKey = data['apikey'] except (TypeError, BadRequest, KeyError): apiKey = request.form['apikey'] ,则application/json返回request.get_json();尝试使用None,则结果为data['apikey']。模仿类型正确,但JSON数据无效,给您一个TypeError,而所有其他无效的返回值都导致一个BadRequest(没有这样的键)或一个KeyError(对象不支持按名称索引) 。

另一个选项是测试TypeError

request.mimetype attribute

[无论哪种方式,如果没有有效的JSON数据或表单数据被发布,但没有request.mimetype条目或不相关的模仿类型被发布,则将引发if request.mimetype == 'application/json': data = request.get_json() apiKey = data['apiKey'] else: apiKey = request.form['apikey'] 异常并将400响应返回给客户端。


0
投票

我对Flask不太熟悉,但是根据他们的文档,您应该可以做类似的事情

apikey

0
投票

不管标题如何,我获取BadRequestcontent = request.headers['CONTENT-TYPE'] if content[:16] == 'application/json': # Process json else: # Process as form-encoded 的方法都是这样的>

json
© www.soinside.com 2019 - 2024. All rights reserved.