【问题标题】:Basic Auth urllib2 with HTTPPasswordMgrWithDefaultRealm and POST data带有 HTTPPasswordMgrWithDefaultRealm 和 POST 数据的基本 Auth urllib2
【发布时间】:2012-02-20 21:31:58
【问题描述】:

我有这个完美运行的 cURL 调用:

curl -H 'X-Requested-With: SO demo' -d 'parameter=value' https://username:password@api.domain.com/api/work/

我的转换不起作用。

import urllib2
# Create a password manager.
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# Add the username and password.
top_level_url = 'https://api.server.com'
password_mgr.add_password(None, top_level_url, 'username', 'password')
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
# Create "opener" (OpenerDirector instance).
opener = urllib2.build_opener(handler)
# Install the opener so all calls to urllib2.urlopen use our opener.
urllib2.install_opener(opener)
# Create request.
headers = {'X-Requested-With':'SO demo.'}
uri = 'https://api.domain.com/api/work/'
data='parameter=value'
req = urllib2.Request(uri,data,headers)
# Make request to fetch url.
result = urllib2.urlopen(req)
urllib2.HTTPError: HTTP Error 401: Unauthorized

这是我不明白的。同一台服务器有一个单独的 API,类似的代码可以在其中工作,唯一改变的是参数和 uri。请注意,cURL 调用适用于两个 API 调用。

第二次 API cURL 调用(有效):

curl -H 'X-Requested-With: SO demo' -d 'parameter=value' https://username:password@api.domain.com/api2/call.php

下面的等效代码:

import urllib2
# Create a password manager.
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# Add the username and password.
top_level_url = 'https://api.server.com'
password_mgr.add_password(None, top_level_url, 'username', 'password')
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
# Create "opener" (OpenerDirector instance).
opener = urllib2.build_opener(handler)
# Install the opener.
# Now all calls to urllib2.urlopen use our opener.
urllib2.install_opener(opener)
# Create request.
headers = {'X-Requested-With':'SO demo.'}
uri = 'https://api.server.com/api2/call.php'
data='parameter=value'
req = urllib2.Request(uri,data,headers)
# Make request to fetch url.
result = urllib2.urlopen(req)
# Read results.
result.read()

为什么当 uri 以 '.php' 结尾时 urllib2 可以工作,但当 uri 以 '/' 结尾时不工作

【问题讨论】:

    标签: python urllib2 basic-authentication unauthorized http-error


    【解决方案1】:

    在您设置的第一个请求中:

    uri = 'https://api.domain.com/api/work/'
    

    但如果你要像第二次运行那样做,你可能打算把它写成:

    uri = 'https://api.server.com/api/work/'
    

    【讨论】:

    • 第二次 Python 运行是与第二次 curl 运行相同 uri 的比较。
    • 我想我很困惑,为什么有时你有时调用 api.domain.com 有时又调用 api.server.com。
    • 服务器有两个API版本,每个版本的内容不同。
    【解决方案2】:

    来自Python urllib2 Basic Auth Problem

    问题 [是] 根据 HTTP 标准,Python 库首先发送未经身份验证的请求,然后只有当它通过 401 重试得到响应时,才会发送正确的凭据。如果 ... 服务器不执行“完全标准的身份验证”,那么库将无法工作。

    此特定 API 在第一次尝试时不会以 401 重试响应,而是以包含未发送凭据消息的 XML 响应进行响应。

    【讨论】:

    • 在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请将它们标记为:stackoverflow.com/questions/9495279
    • 谢谢凯夫。事实证明解决方案是相同的,但我只看到了问题的不同症状。还应该是一个副本吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多