如何在Flask中获取GETted json数据

时间:2016-08-16 14:54:25

标签: python json curl flask

我正在使用Flask在Python中实现REST API。 我必须获取参数来执行查询并返回资源。为了与REST原则保持一致,我将使用GET请求进行此操作。

鉴于可以有很多参数,我想通过conf.json文件发送它们,例如:

{"parameter": "xxx"}

我通过curl执行请求:

  

$ curl -H" Content-Type:application / json" --data @ conf.json -G http://localhost:8080/resources/

请求被重定向到具有以下操作的路由:

@resources.route('/resources/', methods=['GET'])
def discover():
if request.get_json():
    json_data=request.get_json()
    return jsonify(json_data)

我得到的是:

<head> 
<title>Error response</title> 
</head> 
<body> 
<h1>Error response</h1> 
<p>Error code 400. 
<p>Message: Bad request syntax ('GET /resources/?{"parameter": "xxx"} HTTP/1.1'). 
<p>Error code explanation: 400 = Bad request syntax or unsupported method. </body>

有人知道如何获取json数据并在请求中正确处理它吗?

2 个答案:

答案 0 :(得分:4)

request.get_json()在请求正文中查找JSON数据(例如,POST请求将包含哪些内容)。您将JSON数据放在GET请求的 URL查询字符串中。

您的curl命令发送您的JSON未转义,并生成无效的网址,因此服务器正确拒绝:

http://localhost:8080/resources/?{"parameter": "xxx"}

例如,您不能在网址中包含空格。您必须使用--data-urlencode代替才能正确转义:

$ curl --data-urlencode @conf.json -G http://localhost:8080/resources/

请注意,此处不需要Content-Type标头;您没有任何请求正文来记录 的内容。

调整后的curl命令现在会发送一个编码正确的网址:

http://localhost:8080/resources/?%7B%22parameter%22%3A%20%22xxx%22%7D%0A%0A

使用request.query_string访问该数据。在将此代码传递给json.loads()之前,您还必须解码 URL编码:

from urllib import unquote

json_raw_data = unquote(request.query_string)
json_data = json.loads(json_raw_data)

考虑到许多网络服务器限制了他们接受的网址长度。如果您计划以这种方式在网址中发送超过4k个字符,则您确实需要重新考虑并使用POST个请求。这是4k的JSON数据 URL编码,这增加了相当大的开销。

答案 1 :(得分:0)

Martijn回答是对的

let colorName : any = "Green";
let color : Color = Color["" + colorName];

但是您不需要使用$ curl --data-urlencode @conf.json -G http://localhost:8080/resources/ 来获取带有烧瓶的args。我会在我的端点上使用以下内容。

urllib

此外,我会考虑使用@resources.route('/resources') def test(): args = request.args return args.get('parameter') 扩展,以便您可以设置正在运行的应用程序上下文中存在的可重现的测试用例。

flask_testing

https://pythonhosted.org/Flask-Testing/