20.7。 httplib —HTTPプロトコルクライアント
ソースコード: :source: `Lib / httplib.py`
このモジュールは、HTTPおよびHTTPSプロトコルのクライアント側を実装するクラスを定義します。 通常、直接使用されることはありません。モジュール urllib は、HTTPおよびHTTPSを使用するURLを処理するために使用します。
ノート
このモジュールのパブリックインターフェイスは、Python2.0で大幅に変更されました。 HTTP
クラスは、1.5.2との下位互換性のためにのみ保持されます。 新しいコードでは使用しないでください。 使用法については、オンラインのdocstringを参照してください。
このモジュールは、次のクラスを提供します。
- class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])
HTTPConnection インスタンスは、HTTPサーバーとの1つのトランザクションを表します。 ホストとオプションのポート番号を渡してインスタンス化する必要があります。 ポート番号が渡されない場合、ポートは
host:port
の形式であればホスト文字列から抽出され、それ以外の場合はデフォルトのHTTPポート(80)が使用されます。 trueの場合、オプションのパラメーター strict (デフォルトはfalse値)により、ステータス行を有効なHTTP / 1.0または1.1ステータス行として解析できない場合、BadStatusLine
が発生します。 。 オプションの timeout パラメーターが指定されている場合、ブロック操作(接続試行など)はその秒数後にタイムアウトします(指定されていない場合は、グローバルなデフォルトのタイムアウト設定が使用されます)。 オプションの source_address パラメーターは、HTTP接続の送信元アドレスとして使用する(ホスト、ポート)のタプルにすることができます。たとえば、次の呼び出しはすべて、同じホストとポートでサーバーに接続するインスタンスを作成します。
>>> h1 = httplib.HTTPConnection('www.cwi.nl') >>> h2 = httplib.HTTPConnection('www.cwi.nl:80') >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80) >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
バージョン2.0の新機能。
バージョン2.6で変更: timeout が追加されました。
バージョン2.7で変更: source_address が追加されました。
- class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address[, context]]]]]]])
安全なサーバーとの通信にSSLを使用する HTTPConnection のサブクラス。 デフォルトのポートは
443
です。 context を指定する場合は、さまざまなSSLオプションを記述する ssl.SSLContext インスタンスである必要があります。key_file および cert_file は非推奨です。代わりに、 ssl.SSLContext.load_cert_chain()を使用するか、 ssl.create_default_context()にを選択させてください。システムの信頼できるCA証明書。
ベストプラクティスの詳細については、セキュリティに関する考慮事項をお読みください。
バージョン2.0の新機能。
バージョン2.6で変更: timeout が追加されました。
バージョン2.7で変更: source_address が追加されました。
バージョン2.7.9で変更: context が追加されました。
このクラスは、デフォルトで必要なすべての証明書とホスト名のチェックを実行するようになりました。 以前の未確認の動作に戻すには、動作
ssl._create_unverified_context()
を context パラメーターに渡すことができます。
- class httplib.HTTPResponse(sock, debuglevel=0, strict=0)
接続に成功するとインスタンスが返されるクラス。 ユーザーが直接インスタンス化することはありません。
バージョン2.0の新機能。
- class httplib.HTTPMessage
- HTTPMessage インスタンスは、HTTP応答からのヘッダーを保持するために使用されます。 mimetools.Message クラスを使用して実装され、HTTPヘッダーを処理するためのユーティリティ関数を提供します。 ユーザーによって直接インスタンス化されることはありません。
必要に応じて、次の例外が発生します。
- exception httplib.HTTPException
このモジュールの他の例外の基本クラス。
Exception
のサブクラスです。バージョン2.0の新機能。
- exception httplib.NotConnected
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.InvalidURL
HTTPException のサブクラス。ポートが指定されていて、数値以外または空の場合に発生します。
バージョン2.3の新機能。
- exception httplib.UnknownProtocol
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.UnknownTransferEncoding
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.UnimplementedFileMode
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.IncompleteRead
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.ImproperConnectionState
HTTPException のサブクラス。
バージョン2.0の新機能。
- exception httplib.CannotSendRequest
ImpproperConnectionState のサブクラス。
バージョン2.0の新機能。
- exception httplib.CannotSendHeader
ImpproperConnectionState のサブクラス。
バージョン2.0の新機能。
- exception httplib.ResponseNotReady
ImpproperConnectionState のサブクラス。
バージョン2.0の新機能。
- exception httplib.BadStatusLine
HTTPException のサブクラス。 サーバーが理解できないHTTPステータスコードで応答した場合に発生します。
バージョン2.0の新機能。
このモジュールで定義されている定数は次のとおりです。
- httplib.HTTP_PORT
- HTTPプロトコルのデフォルトポート(常に
80
)。
- httplib.HTTPS_PORT
- HTTPSプロトコルのデフォルトポート(常に
443
)。
また、整数ステータスコードの次の定数:
絶え間ない | 価値 | 意味 |
---|---|---|
CONTINUE
|
100
|
HTTP / 1.1、 RFC 2616、セクション10.1.1 |
SWITCHING_PROTOCOLS
|
101
|
HTTP / 1.1、 RFC 2616、セクション10.1.2 |
PROCESSING
|
102
|
WEBDAV、 RFC 2518、セクション10.1 |
OK
|
200
|
HTTP / 1.1、 RFC 2616、セクション10.2.1 |
CREATED
|
201
|
HTTP / 1.1、 RFC 2616、セクション10.2.2 |
ACCEPTED
|
202
|
HTTP / 1.1、 RFC 2616、セクション10.2.3 |
NON_AUTHORITATIVE_INFORMATION
|
203
|
HTTP / 1.1、 RFC 2616、セクション10.2.4 |
NO_CONTENT
|
204
|
HTTP / 1.1、 RFC 2616、セクション10.2.5 |
RESET_CONTENT
|
205
|
HTTP / 1.1、 RFC 2616、セクション10.2.6 |
PARTIAL_CONTENT
|
206
|
HTTP / 1.1、 RFC 2616、セクション10.2.7 |
MULTI_STATUS
|
207
|
WEBDAV RFC 2518、セクション10.2 |
IM_USED
|
226
|
HTTPでのデルタエンコーディング、 RFC 3229 、セクション10.4.1 |
MULTIPLE_CHOICES
|
300
|
HTTP / 1.1、 RFC 2616、セクション10.3.1 |
MOVED_PERMANENTLY
|
301
|
HTTP / 1.1、 RFC 2616、セクション10.3.2 |
FOUND
|
302
|
HTTP / 1.1、 RFC 2616、セクション10.3.3 |
SEE_OTHER
|
303
|
HTTP / 1.1、 RFC 2616、セクション10.3.4 |
NOT_MODIFIED
|
304
|
HTTP / 1.1、 RFC 2616、セクション10.3.5 |
USE_PROXY
|
305
|
HTTP / 1.1、 RFC 2616、セクション10.3.6 |
TEMPORARY_REDIRECT
|
307
|
HTTP / 1.1、 RFC 2616、セクション10.3.8 |
BAD_REQUEST
|
400
|
HTTP / 1.1、 RFC 2616、セクション10.4.1 |
UNAUTHORIZED
|
401
|
HTTP / 1.1、 RFC 2616、セクション10.4.2 |
PAYMENT_REQUIRED
|
402
|
HTTP / 1.1、 RFC 2616、セクション10.4.3 |
FORBIDDEN
|
403
|
HTTP / 1.1、 RFC 2616、セクション10.4.4 |
NOT_FOUND
|
404
|
HTTP / 1.1、 RFC 2616、セクション10.4.5 |
METHOD_NOT_ALLOWED
|
405
|
HTTP / 1.1、 RFC 2616、セクション10.4.6 |
NOT_ACCEPTABLE
|
406
|
HTTP / 1.1、 RFC 2616、セクション10.4.7 |
PROXY_AUTHENTICATION_REQUIRED
|
407
|
HTTP / 1.1、 RFC 2616、セクション10.4.8 |
REQUEST_TIMEOUT
|
408
|
HTTP / 1.1、 RFC 2616、セクション10.4.9 |
CONFLICT
|
409
|
HTTP / 1.1、 RFC 2616、セクション10.4.10 |
GONE
|
410
|
HTTP / 1.1、 RFC 2616、セクション10.4.11 |
LENGTH_REQUIRED
|
411
|
HTTP / 1.1、 RFC 2616、セクション10.4.12 |
PRECONDITION_FAILED
|
412
|
HTTP / 1.1、 RFC 2616、セクション10.4.13 |
REQUEST_ENTITY_TOO_LARGE
|
413
|
HTTP / 1.1、 RFC 2616、セクション10.4.14 |
REQUEST_URI_TOO_LONG
|
414
|
HTTP / 1.1、 RFC 2616、セクション10.4.15 |
UNSUPPORTED_MEDIA_TYPE
|
415
|
HTTP / 1.1、 RFC 2616、セクション10.4.16 |
REQUESTED_RANGE_NOT_SATISFIABLE
|
416
|
HTTP / 1.1、 RFC 2616、セクション10.4.17 |
EXPECTATION_FAILED
|
417
|
HTTP / 1.1、 RFC 2616、セクション10.4.18 |
UNPROCESSABLE_ENTITY
|
422
|
WEBDAV、 RFC 2518、セクション10.3 |
LOCKED
|
423
|
WEBDAV RFC 2518、セクション10.4 |
FAILED_DEPENDENCY
|
424
|
WEBDAV、 RFC 2518、セクション10.5 |
UPGRADE_REQUIRED
|
426
|
TLSへのHTTPアップグレード、 RFC 2817 、セクション6 |
INTERNAL_SERVER_ERROR
|
500
|
HTTP / 1.1、 RFC 2616、セクション10.5.1 |
NOT_IMPLEMENTED
|
501
|
HTTP / 1.1、 RFC 2616、セクション10.5.2 |
BAD_GATEWAY
|
502
|
HTTP / 1.1 RFC 2616、セクション10.5.3 |
SERVICE_UNAVAILABLE
|
503
|
HTTP / 1.1、 RFC 2616、セクション10.5.4 |
GATEWAY_TIMEOUT
|
504
|
HTTP / 1.1 RFC 2616、セクション10.5.5 |
HTTP_VERSION_NOT_SUPPORTED
|
505
|
HTTP / 1.1、 RFC 2616、セクション10.5.6 |
INSUFFICIENT_STORAGE
|
507
|
WEBDAV、 RFC 2518、セクション10.6 |
NOT_EXTENDED
|
510
|
HTTP拡張フレームワーク、 RFC 2774 、セクション7 |
- httplib.responses
このディクショナリは、HTTP1.1ステータスコードをW3C名にマップします。
例:
httplib.responses[httplib.NOT_FOUND]
は'Not Found'
です。バージョン2.5の新機能。
20.7.1。 HTTPConnectionオブジェクト
HTTPConnection インスタンスには次のメソッドがあります。
- HTTPConnection.request(method, url[, body[, headers]])
これにより、HTTPリクエストメソッドメソッドとセレクター url を使用してサーバーにリクエストが送信されます。 body 引数が存在する場合、ヘッダーが終了した後に送信するデータの文字列である必要があります。 または、開いているファイルオブジェクトの場合もあります。その場合、ファイルの内容が送信されます。 このファイルオブジェクトは、
fileno()
およびread()
メソッドをサポートする必要があります。 headers 引数は、リクエストとともに送信する追加のHTTPヘッダーのマッピングである必要があります。headers にヘッダーがない場合、
str
の長さから本体の長さを判別できれば、すべてのメソッドにContent-Length
ヘッダーが自動的に追加されます。表現、またはディスク上のファイルの報告されたサイズから。 body がNone
の場合、本文を予期するメソッド(PUT
、POST
、およびPATCH
)を除いて、ヘッダーは設定されません。この場合、0
に設定されます。バージョン2.6で変更: body はファイルオブジェクトにすることができます。
- HTTPConnection.getresponse()
サーバーからの応答を取得するために要求が送信された後に呼び出す必要があります。 HTTPResponse インスタンスを返します。
ノート
サーバーに新しい要求を送信する前に、応答全体を読んでおく必要があることに注意してください。
- HTTPConnection.set_debuglevel(level)
- デバッグレベル(出力されるデバッグ出力の量)を設定します。 デフォルトのデバッグレベルは
0
です。これは、デバッグ出力が出力されないことを意味します。
- HTTPConnection.set_tunnel(host, port=None, headers=None)
HTTP接続トンネリングのホストとポートを設定します。 通常、プロキシサーバーを介してHTTPS接続を行う必要がある場合に使用されます。
headers引数は、CONNECTリクエストで送信する追加のHTTPヘッダーのマッピングである必要があります。
バージョン2.7の新機能。
- HTTPConnection.connect()
- オブジェクトの作成時に指定したサーバーに接続します。
- HTTPConnection.close()
- サーバーへの接続を閉じます。
上記のrequest()
メソッドを使用する代わりに、以下の4つの関数を使用して、リクエストを段階的に送信することもできます。
- HTTPConnection.putrequest(request, selector[, skip_host[, skip_accept_encoding]])
これは、サーバーへの接続が確立された後の最初の呼び出しである必要があります。 request 文字列、 selector 文字列、およびHTTPバージョン(
HTTP/1.1
)で構成される行をサーバーに送信します。Host:
またはAccept-Encoding:
ヘッダーの自動送信を無効にするには(たとえば、追加のコンテンツエンコーディングを受け入れるため)、 skip_host または skip_accept_encoding をFalse以外の値で指定します。バージョン2.4で変更: skip_accept_encoding 引数が追加されました。
- HTTPConnection.putheader(header, argument[, ...])
- RFC 822 スタイルのヘッダーをサーバーに送信します。 ヘッダー、コロンとスペース、および最初の引数で構成される行をサーバーに送信します。 さらに引数を指定すると、タブと引数で構成される継続行が送信されます。
- HTTPConnection.endheaders(message_body=None)
ヘッダーの終わりを示す空白行をサーバーに送信します。 オプションの message_body 引数を使用して、リクエストに関連付けられたメッセージ本文を渡すことができます。 メッセージ本文は、文字列の場合はメッセージヘッダーと同じパケットで送信され、それ以外の場合は別のパケットで送信されます。
バージョン2.7で変更: message_body が追加されました。
- HTTPConnection.send(data)
- サーバーにデータを送信します。 これは、 endheaders()メソッドが呼び出された後、 getresponse()が呼び出される前にのみ直接使用する必要があります。
20.7.2。 HTTPResponseオブジェクト
HTTPResponse インスタンスには、次のメソッドと属性があります。
- HTTPResponse.read([amt])
- 応答本文、または次の amt バイトまでを読み取って返します。
- HTTPResponse.getheader(name[, default])
- ヘッダー name の内容を取得します。一致するヘッダーがない場合は、 default を取得します。
- HTTPResponse.getheaders()
(ヘッダー、値)タプルのリストを返します。
バージョン2.4の新機能。
- HTTPResponse.fileno()
- 基になるソケットの
fileno
を返します。
- HTTPResponse.msg
- 応答ヘッダーを含む mimetools.Message インスタンス。
- HTTPResponse.version
- サーバーが使用するHTTPプロトコルのバージョン。 HTTP / 1.0の場合は10、HTTP /1.1の場合は11。
- HTTPResponse.status
- サーバーから返されたステータスコード。
- HTTPResponse.reason
- サーバーから返された理由句。
20.7.3。 例
GET
メソッドを使用するセッションの例を次に示します。
>>> import httplib
>>> conn = httplib.HTTPSConnection("www.python.org")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> conn.request("GET", "/")
>>> r2 = conn.getresponse()
>>> print r2.status, r2.reason
404 Not Found
>>> data2 = r2.read()
>>> conn.close()
HEAD
メソッドを使用するセッションの例を次に示します。 HEAD
メソッドがデータを返すことはないことに注意してください。
>>> import httplib
>>> conn = httplib.HTTPSConnection("www.python.org")
>>> conn.request("HEAD","/")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> data = res.read()
>>> print len(data)
0
>>> data == ''
True
POST
リクエストの方法を示すセッションの例を次に示します。
>>> import httplib, urllib
>>> params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
... "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
302 Found
>>> data = response.read()
>>> data
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()
クライアント側のHTTP PUT
リクエストは、POST
リクエストと非常によく似ています。 違いは、HTTPサーバーがPUT
リクエストを介してリソースを作成できるようにするサーバー側のみです。 httplibを使用してPUT
リクエストを実行する方法を示すセッションの例を次に示します。
>>> # This creates an HTTP message
>>> # with the content of BODY as the enclosed representation
>>> # for the resource http://localhost:8080/foobar
...
>>> import httplib
>>> BODY = "***filecontents***"
>>> conn = httplib.HTTPConnection("localhost", 8080)
>>> conn.request("PUT", "/file", BODY)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200, OK