2016-02-15 147 views
1

我正在嘗試使用PATCH更新Firebase實體。以下是我有:熱點使用python(urllib2)向Firebase REST API發出PATCH請求?

數據:

'foo': { 
    'bar': 'baz' 
} 

規則:

"foo": { 
     ".write": true, 
     ".read": true, 
     "bar": { 
     ".write": true, 
     ".read": true, 
     } 
},   

代碼:

import urllib 
import urllib2 

AUTH_SECRET = 'redacted' 
BASE_URL = 'redacted' 
URL = BASE_URL + '/foo/.json' 

values = {'bar' : 'baz3'} 
data = urllib.urlencode(values) 

request = urllib2.Request(URL + '?auth=' + AUTH_SECRET, data) 
request.get_method = lambda: 'PATCH' 
resp = urllib2.urlopen(request) 

print resp.read() 

我收到 「HTTP錯誤400:錯誤的請求」。

+0

爲什麼我被低估? – SM79

+0

你試過逃脫你的字符串嗎? – Arman

回答

1

你可以用代碼發送在try/except請求,然後讀什麼發回的內容在發生錯誤的情況下,像這樣:

from urllib2 import HTTPError 
try: 
    resp = urllib2.urlopen(request) 
except HTTPError as e: 
    print e.read() 

我跑你的代碼,這是我收到的:

{ 
    "error" : "Invalid data; couldn't parse JSON object. Are you sending a JSON object with valid key names?" 
} 

所以火力地堡希望你在JSON發送數據,而你就像一個URL查詢字符串'bar=baz3'發送。因此,該數據序列化爲一個JSON字符串格式化會修復錯誤:

import json 
values = {'bar': 'baz3'} 
data = json.dumps(values) 

而且我會建議你使用Requests庫,因爲它好得多使用。

首先安裝要求:

pip install requests 

然後你可以做這樣的:

import urllib 
import requests 


AUTH_SECRET = 'redacted' 
BASE_URL = 'redacted' 

get_params = urllib.urlencode({'auth': AUTH_SECRET}) 
url = BASE_URL + '/foo/.json' + '?' + get_params 
data = {'bar': 'baz3'} 

resp = requests.patch(url, json=data) 
print resp.json() 
0

爲什麼要用urllib的建立與PARAMS的網址是什麼?你可以把它們作爲字典給請求。