python - 使用 POST 和 urllib2 访问 Web API

标签 python http post 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)

以下是不适用于 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)

有没有人突然发现 POST 代码中存在固有错误?我以前从未进行过 POST 调用,但我读过的所有内容似乎都表明我的代码是合理的。如果我使用的是 POST,是否有一些不同的方法可以为授权执行 add_header 操作?

最佳答案

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

关于python - 使用 POST 和 urllib2 访问 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4195325/

相关文章:

python - 保存到数据库以防止Python中的SQL注入(inject)

python - 作为类属性的实例列表

http - 使用 SPDY 的 HTTP 管道和 HTTP 多路复用之间的区别

python - Flask 丢失客户的回复

go - 如何从此请求中获取 POST 值?

python - 将 LoginView 和 LogoutView 与自定义模板结合使用

python - 使用 matplotlib 按钮在我创建的绘图之间交替/切换

java - 为什么从套接字流读取会永远阻塞?

html - HTTPS iframe 显示为 HTTP(混合内容)

PHP:在两个站点之间传输一个大数组