2015-12-22 90 views
3

慢拍摇滚乐的解决方案工作发送JSON字符串作为POST请求

他原本指的字典。但是,下面的代码发送JSON字符串还曾用请求的奇迹:

import requests 

headers = { 
    'Authorization': app_token 
} 
url = api_url + "/b2api/v1/b2_get_upload_url" 
content = json.dumps({'bucketId': bucket_id}) 

r = requests.post(url, data = content, headers = headers) 

我与需要我送JSON作为POST请求才能得到结果的API工作。问题是Python 3不会允许我这样做。

下面的Python 2代码工作正常,实际上它的官方样片:

request = urllib2.Request(
    api_url +'/b2api/v1/b2_get_upload_url', 
    json.dumps({ 'bucketId' : bucket_id }), 
    headers = { 'Authorization': account_authorization_token } 
) 
response = urllib2.urlopen(request) 

但是,使用此代码在Python 3只使它抱怨数据是无效的:

import json 
from urllib.request import Request, urlopen 
from urllib.parse import urlencode 

# -! Irrelevant code has been cut out !- 

headers = { 
    'Authorization': app_token 
} 
url = api_url + "/b2api/v1/b2_get_upload_url" 

# Tested both with encode and without 
content = json.dumps({'bucketId': bucket_id}).encode('utf-8') 

request = Request(
    url=url, 
    data=content, 
    headers=headers 
) 

response = urlopen(req) 

我试过urlencode(),就像你应该这样做。但是这会从Web服务器返回一个400状态码,因为它期望纯JSON。即使纯JSON数据无效,我也需要以某种方式强制Python发送它。

编辑:根据要求,这里是我得到的错误。由于这是一个烧瓶应用,这里的调试器的截图:

Screenshot

添加.encode('utf-8')给了我一个“预期的字符串或缓冲区”错误

编辑2:与.encode('utf-8')调试器的Screenshot添加

+0

你不“应该”使用进行urlencode;这是为表单编码的数据,但你发送JSON。但是如果你收到错误,你应该发布它。 –

+0

服务器不支持unicode字符“\ u2119”。创建一个演示服务器,如果要测试另一个。 – dsgdfg

+0

看看这个:[json.dumps与flask.jsonify](https://stackoverflow.com/questions/7907596/json-dumps-vs-flask-jsonify)也许它有帮助。 – rocksteady

回答

3

由于我有一个类似的应用程序运行,但客户端仍然失踪,我自己试了一下。 这是运行的服务器是由下面的练习:

Miguel Grinberg - designing a restful API using Flask

这就是为什么它使用的身份验证。

有趣的部分:使用requests您可以保持字典原样。

看看这个:

username = 'miguel' 
password = 'python' 

import requests 
content = {"title":"Read a book"} 

request = requests.get("http://127.0.0.1:5000/api/v1.0/projects", auth=(username, password), params=content) 
print request.text 

看来工作:)

更新1:

POST请求使用requests.post(做...) 这这里描述得好:python requests

更新2:

为了完成答案:

requests.post("http://127.0.0.1:5000/api/v1.0/projects", json=content) 

发送JSON字符串。

json是请求的有效参数,并在内部使用json.dumps() ...

+0

词典不是问题。这些工作正常,我无法发送不属于任何字典或列表的单个JSON字符串。但是也可以使用字符串测试请求,因为您已经提出了它。 – Quad