2014-10-05 56 views
0

我正在使用以下代码尝试为我自己的存储库创建webhook。不过,我不断收到以下回应:使用Github API创建webhook无法在Django中使用请求

{u'documentation_url': u'https://developer.github.com/v3', 
u'message': u'Body should be a JSON Hash'} 

代码:

hook = {u'name': u'web', u'active': True, u'config': {u'url': u'http://my/payload/destination'}} 
t = json.JSONEncoder().encode(hook) 
p = requests.post('https://api.github.com/repos/:user/:repo/hooks', params=t, headers={'content-type': 'application/json', 'Authorization': 'token ' + token}) 

这里是T的输出:

{"active": true, "config": {"url": "http://my/payload/desination"}, "name": "web"} 

并在报头中的授权令牌被格式化为例如:

token REDACTED 

我知道这应该工作,所以我去了http://www.hurl.it/使用与上述完全相同的信息,它是成功的。任何想法为什么发生这种情况?

回答

3

您未提供POST正文; params用于URL查询参数。使用data说法相反:

p = requests.post(
    'https://api.github.com/repos/:user/:repo/hooks', data=t, 
    headers={'content-type': 'application/json', 'Authorization': 'token ' + token}) 

params在URL中?代替后放参数。

requests版本2.4.2开始,您还可以将JSON编码保留为requests.post()调用;只需通过有效负载编码为json关键字参数。将为您添加正确的Content-Type标头:

hook = {u'name': u'web', u'active': True, u'config': {u'url': u'http://my/payload/destination'}} 
p = requests.post(
    'https://api.github.com/repos/:user/:repo/hooks', 
    json=hook, headers={'Authorization': 'token ' + token}) 
+0

这就是我从requests.get()请求中复制一些代码所得到的结果。非常感谢,这很有道理。我会在几分钟内接受你的答案! – user1079404 2014-10-05 01:25:48