2015-12-22 91 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