2

REST リソースに接続し、Python スクリプト (Python 3.2.3) を使用してデータを取得しようとしています。スクリプトを実行すると、HTTP エラー 401: Unauthorized というエラーが表示されます。基本認証を使用してRESTクライアントを使用して、指定されたRESTリソースにアクセスできることに注意してください。REST クライアントで、ホスト名、ユーザー、およびパスワードの詳細を指定しました (レルムは必要ありません)。以下はコードと完全なエラーです。よろしくお願いいたします。

コード:

import urllib.request

# set up authentication info
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm=None,
                       uri=r'http://hostname/',
                       user='administrator',
                       passwd='administrator')
opener =  urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
res = opener.open(r'http://hostname:9004/apollo-api/nodes')
nodes = res.read()

エラー

Traceback (most recent call last):
File "C:\Python32\scripts\get-nodes.py", line 12, in <module>
    res = opener.open(r'http://tolowa.wysdm.lab.emc.com:9004/apollo-api/nodes')
File "C:\Python32\lib\urllib\request.py", line 375, in open
   response = meth(req, response)
File "C:\Python32\lib\urllib\request.py", line 487, in http_response
   'http', request, response, code, msg, hdrs)
File "C:\Python32\lib\urllib\request.py", line 413, in error
   return self._call_chain(*args)
File "C:\Python32\lib\urllib\request.py", line 347, in _call_chain
   result = func(*args)
File "C:\Python32\lib\urllib\request.py", line 495, in http_error_default
   raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized
4

2 に答える 2

4

正しいレルム名を指定してください。これは、たとえばブラウザでページを開くときに確認できます。パスワード プロンプトに名前が表示されます。

于 2012-08-30T17:24:34.873 に答える
3

発生した例外をキャッチしてレルムを読み取ることもできます。

import urllib.error
import urllib.request

# set up authentication info
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm=None,
                       uri=r'http://hostname/',
                       user='administrator',
                       passwd='administrator')
opener =  urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
try:
    res = opener.open(r'http://hostname:9004/apollo-api/nodes')
    nodes = res.read()
except urllib.error.HTTPError as e:
    print(e.headers['www-authenticate'])

次の出力が得られるはずです。

Basic realm="The realm you are after"

上からレルムを読み取り、それをadd_passwordメソッドに設定すると、うまくいくはずです。

于 2012-08-30T18:10:51.020 に答える