将JSON字符串作为发布请求发送

时间:2015-12-22 13:43:57

标签: python json http python-3.x

rocksteady的解决方案

他最初是指字典。但是下面的代码发送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)

我正在使用一个API,要求我将JSON作为POST请求发送以获得结果。问题是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')会给我一个“预期的字符串或缓冲区”错误

添加了.encode('utf-8')的调试器的

编辑2 Screenshot

1 个答案:

答案 0 :(得分:4)

由于我有一个类似的应用程序正在运行,但客户端仍然缺失,我自己尝试了。 正在运行的服务器来自以下练习:

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-string。

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