Python 使用POST和urllib2访问web API

Python 使用POST和urllib2访问web API,python,http,post,urllib2,Python,Http,Post,Urllib2,我正在尝试使用POST技术访问web API。我可以使用GET技术访问它,但API所有者告诉我某些功能只适用于POST。不幸的是,我似乎无法得到邮政工作 以下是GET的工作原理: API_URL = "http://example.com/api/" def call_api(method, **kwargs): url = API_URL + method if kwargs: url += '?' + urllib.urlencode(kwargs)

我正在尝试使用POST技术访问web API。我可以使用GET技术访问它,但API所有者告诉我某些功能只适用于POST。不幸的是,我似乎无法得到邮政工作

以下是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)
以下是与POST不兼容的内容(导致HTTP 400错误):


在邮政编码中,是否有任何东西被认为是天生不正确的?我以前从未做过POST调用,但我读到的所有内容似乎都表明我的代码是合理的。如果我使用POST,是否有其他方法可以为授权添加标题?

使用
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)

正如上面@sneeu所指出的,将要发布的数据添加到请求中的行为将请求从GET转换为POST

然而,这仍然假设API期望在POST正文中接收的是表单编码的数据。我使用过的许多最近的API都希望在其中包含其他内容(最常见的是XML或JSON)


您能验证API希望作为数据有效负载接收什么吗?

我遇到了同样的问题,我想用HTTP的POST方法发送数据,但在
dir(req)
之后,我找到了
get_方法,但没有
set_方法
,而且我还发现了一个名为
data
的属性,请尝试一下:

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

谢谢@sneeu。

您的邮政编码似乎与GET编码完全相同。你复制和粘贴的东西不正确吗!是的,有一个粘贴错误。现在已修复。我的问题中有一个错误,我没有粘贴我的邮政编码,但正如您现在看到的,它几乎与您在这里看到的相同。我将假设问题与API及其期望值有关,而不是与我的代码有关。根据我迄今为止看到的代码,我认为你是对的……错误是由于API不期望我试图发布的内容。
>>> req.data={"todototry":"123456"}
>>> req.get_method()
'POST'
>>>