2013-04-01 209 views
3

我正在开发一个API包装器。我试图建立该规范中有如下要求:Python请求模块:urlencoding json数据

curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"[email protected]"}' http://localhost:5000/ 

这个请求产生从一个小的测试服务器我安装了以下回应看exatly什么头/ PARAMS等作为发送。这个小脚本生成:

uri: http://localhost:5000/, 
method: POST, 
api_key: None, 
content_type: application/json, 
params: None, 
data: data={"name":"Partner13", "email":"[email protected]"} 

所以这上面的是我希望我的Python脚本来创建,当它击中的小测试脚本的结果。

我正在使用python requests模块,这是我使用过的最美丽的HTTP lib。所以这里是我的Python代码:

uri = "http://localhost:5000/" 
headers = {'content-type': 'application/json' } 
params = {} 
data = {"name":"Partner13", "email":"[email protected]"} 
params["data"] = json.dumps(data) 
r = requests.post(uri, data=params, headers=headers) 

这么简单的东西。设置标题,并为POST参数创建一个字典。该字典有一个名为“data”的条目,它是我想发送给服务器的数据的JSON字符串。然后我打电话给这个帖子。但是,结果我的小测试脚本还给是:

uri: http://localhost:5000/, 
method: POST, 
api_key: None, 
content_type: application/json, 
params: None, 
data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D 

所以基本上我想要的数据参数下的发送JSON数据已经urlendcoded。

有谁知道如何解决这个问题?我查看了请求文档,似乎无法找到一种不自动urlencode发送数据的方法。

非常感谢, 凯文

+0

curl示例中的数据无效json。它是表单编码和json的混合体。 –

回答

3

当创建用于数据的关键字的对象,简单地分配一个可变json.dumps(数据)的结果。另外,因为HTTP POST可以同时接受url参数和请求主体中的数据,并且因为requests.post函数有一个名为“params”的关键字参数,所以最好使用不同的变量名称为可读性。请求文档使用变量名“有效载荷”,这就是我使用的。

data = {"name":"Partner13", "email":"[email protected]"} 
payload = json.dumps(data) 
r = requests.post(uri, data=payload, headers=headers) 
0

请求自动URL编码作为数据传递的字典here。 John_GG的解决方案可以工作,因为不是在'data'字段中发布包含JSON编码字符串的字典,而是直接传递JSON编码字符串:字符串不会自动编码。我不能说我理解Requests中这种行为的原因,但不管它是什么。没有办法切换我能找到的这种行为。

祝你好运,凯文。

+0

你所指的“这里”是对url参数进行编码,因为它们进入了url,当然这些参数是url编码的。在request post函数签名中,“params”是指url参数,而“data”是指POST主体。 –

+0

@John_GG实际上,它也用于对请求主体进行编码。调用堆栈就像'Request.init()' - >'PreparedRequest.prepare()' - >'PreparedRequest.prepare_body()' - >'RequestEncodingMixin._encode_params()'。这似乎是自动处理具有“application/x-www-form-urlencoded”内容的请求。 – augurar