我正在尝试使用PATCH更新Firebase实体。这就是我所拥有的:
数据:
'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 :(得分: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?"
}
因此,Firebase希望您在发送数据时发送数据,就像发送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()
答案 1 :(得分:0)
为什么使用urllib用params构建URL?你可以把它们作为dict来提出请求。