neo*_*ech 6 python post http urllib2
我正在尝试使用POST技术访问Web API.我能够使用GET技术访问它,但API所有者告诉我某些功能仅适用于POST.不幸的是我似乎无法让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)
Run Code Online (Sandbox Code Playgroud)
这是什么不适用于POST(导致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)
Run Code Online (Sandbox Code Playgroud)
任何人都会因为POST代码本身不正确而跳出来吗?我之前从未做过POST调用,但我读过的所有内容似乎都表明我的代码是合理的.如果我使用POST,是否有一些不同的方式我应该为授权执行add_header操作?
sne*_*eeu 10
随着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)
Run Code Online (Sandbox Code Playgroud)