热门使用python(urllib2)向Firebase REST API发出PATCH请求?

时间:2016-02-15 01:08:35

标签: python firebase

我正在尝试使用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:错误请求”。

2 个答案:

答案 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来提出请求。