2010-11-16 98 views
6

我想使用POST技术访问Web API。我可以使用GET技术访问它,但API所有者告诉我某些功能仅适用于POST。不幸的是,我似乎无法开机自检。使用POST和urllib2访问网络API

下面是用GET是什么在起作用:

API_URL = "http://example.com/api/" 

def call_api(method, **kwargs): 
    url = API_URL + method 
    if kwargs: 
     url += '?' + urllib.urlencode(kwargs) 
    req = urllib2.Request(url) 
    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 
    return urllib2.urlopen(req) 

这里是不与岗位工作(导致HTTP 400错误):

API_URL = "http://example.com/api/" 

def call_api(method, **kwargs): 
    url = API_URL + method 
    data='' 
    if kwargs: 
     data=urllib.urlencode(kwargs) 
    req = urllib2.Request(url, data) 
    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 
    return urllib2.urlopen(req) 

做任何事情在任何人跳出来为在本质上不正确POST代码?我从来没有做过POST调用,但我读过的所有内容似乎都表明我的代码是合理的。如果我使用POST,是否有一些不同的方式可以为授权执行add_header事情?

+1

您的POST代码看起来与您的GET代码完全相同。你是否复制并粘贴了错误的东西? – 2010-11-16 15:02:52

+0

Doh!是的,有一个粘贴错误。现在修复。 – neomech 2010-11-16 15:30:29

回答

9

随着urllib2您需要将数据添加到POST体:

def call_api(method, **kwargs): 
    url = API_URL + method 
    req = urllib2.Request(url) 

    if kwargs: 
     req.add_data(urllib.urlencode(kwargs)) 

    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 

    # req.get_method() -> 'POST' 

    return urllib2.urlopen(req) 
+0

我在我的问题中没有粘贴POST代码,但是现在您可以看到它与您在此处的内容几乎完全相同。我打算只是假设问题涉及到API以及它的期望,而不是我的代码。 – neomech 2010-11-16 15:32:07

2

由于@sneeu上面所指出的,它是将数据被张贴到该请求由GET转换请求的行为进入POST。

但是,这仍然假设API预计在POST主体中接收的是表单编码数据。我曾经使用过的许多最近的API都期待着其他内容(最常见的是XML或JSON)。

您可以验证该API期望作为数据有效载荷接收吗?

+0

根据我迄今为止看到的代码,我认为你是对的...错误是由于API不期待我试图发布的任何内容。 – neomech 2010-11-16 15:32:52

1

我都面临着同样的问题,我想与HTTP的POST方法发送数据,但dir(req)后,我发现get_method,但没有set_method,而且我还发现有一个叫做data属性,所以尝试了这一点:

>>> req.data={"todototry":"123456"} 
>>> req.get_method() 
'POST' 
>>> 

谢谢@sneeu。