0

完全に機能するこの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 呼び出しで機能することに注意してください。

2 番目の 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 が「/」で終わると機能しないのはなぜですか?

4

2 に答える 2

2

最初のリクエストでは、次のように設定しています。

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

しかし、2 回目の実行と同じように実行する場合は、次のように記述することを意図していた可能性があります。

uri = 'https://api.server.com/api/work/'
于 2012-01-28T03:29:12.870 に答える
1

Python urllib2 Basic Auth Problemから

問題は、HTTP 標準に従って、Python ライブラリが最初に認証されていないリクエストを送信し、401 再試行で応答された場合にのみ、正しい資格情報が送信されることです。... サーバーが「完全に標準の認証」を行わない場合、ライブラリは機能しません。

この特定の API は、最初の試行では 401 再試行で応答せず、資格情報が送信されなかったというメッセージを含む XML 応答で応答します。

于 2012-03-02T20:32:16.393 に答える