requestsライブラリ
requests
ライブラリは、Pythonでもっとも人気のある広く使用されているライブラリの1つであり、HTTPリクエストを行うために使用されます。このライブラリは、リクエストを行うための複雑さを美しくシンプルなAPIの背後に抽象化し、HTTP/1.1リクエストをシームレスに送信できるようにします。これにより、シンプルなPythonライブラリを使用して、ヘッダー、フォームデータ、マルチパートファイル、およびパラメータなどのコンテンツをHTTPリクエストに追加できます。
requestsライブラリのインストール
requests
をインストールするには、次のpipコマンドを実行します。
$ pip instal requests
GETリクエスト
GETリクエストはもっとも一般的なHTTPメソッドの1つです。これはリソースからデータを取得または読み取るために使用されます。Pythonのrequests
ライブラリでは、GETリクエストを非常に簡単に行うことができます。
import requests
response = requests.get('https://api.github.com')
# Now we have a Response object called 'response'.
print(response.status_code)
200
POSTリクエスト
POSTリクエストは、新しいリソースを作成するためにデータをサーバーに送信するために使用されます。POSTでサーバーに送信されるデータは、リクエストボディに保存されます。requests
を使用したPOSTリクエストの例を以下に示します。
import requests
data = {
'name': 'John',
'age': '30'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.status_code)
print(response.json())
この例では、データとして辞書を送信していますが、requestsは送信前にそれをフォームエンコードします。
PUTリクエスト
PUTリクエストはPOSTリクエストと似ており、データをサーバーに送信します。違いは、PUTリクエストが冪等であるということです。つまり、同じPUTリクエストを複数回URLに対して行っても、常に同じ結果になります。以下にPUTリクエストの例を示します。
import requests
data = {
'name': 'John',
'age': '30'
}
response = requests.put('https://httpbin.org/put', data=data)
print(response.status_code)
print(response.json())
DELETEリクエスト
DELETEリクエストは、サーバーからリソースを削除するために使用されます。以下にDELETEリクエストの例を示します。
import requests
response = requests.delete('https://httpbin.org/delete')
print(response.status_code)
print(response.json())
HEADリクエスト
HEADリクエストは、GETリクエストに似ていますが、レスポンスヘッダーのみをサーバーに要求し、実際のリソース(つまり、メッセージボディ)は返されません。これは、リソースの可用性をチェックしたり、実際のコンテンツをダウンロードせずにレスポンスヘッダーをチェックする場合に便利です。以下にHEADリクエストの例を示します。
import requests
response = requests.head('https://httpbin.org/get')
print(response.status_code)
print(response.headers)
PATCHリクエスト
PATCHリクエストは、PUTリクエストとは異なり、リソース全体を置き換えるのではなく、リソースに部分的な変更を適用するために使用されます。以下にPATCHリクエストの例を示します。
import requests
data = {
'name': 'John'
}
response = requests.patch('https://httpbin.org/patch', data=data)
print(response.status_code)
print(response.json())
タイムアウト
デフォルトでは、リクエストはタイムアウトしません。タイムアウトの期間を設定すると、リクエストが無期限に待機することがないようにするのは一般的なベストプラクティスです。タイムアウトを設定する方法を以下に示します。
import requests
try:
response = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
print("The request timed out")
この例では、リクエストが3秒以内に完了しなかった場合、requests.exceptions.Timeout
例外が発生します。
リダイレクト
デフォルトでは、URLへのGET、OPTIONS、POST、PUT、PATCH、DELETEリクエストは、レスポンスステータスコードが301、302、303、307、または308の場合に自動的に新しい場所にリダイレクトされます。この動作を無効にする場合は、次のように自動リダイレクトを無効にすることができます。
import requests
response = requests.get('http://github.com', allow_redirects=False)
print(response.status_code)
この例では、http://github.com
へのGETリクエストは301ステータスコードを返しますが、allow_redirects=False
を設定したため、自動的なリダイレクトは行われません。
ヘッダー
ヘッダーは、リクエストまたはレスポンスに関する追加情報を提供します。リクエストにヘッダーを追加するには、headers
パラメータに辞書を渡します。以下にその方法を示します。
import requests
headers = {'user-agent': 'my-app/0.0.1'}
response = requests.get('https://httpbin.org/get', headers=headers)
print(response.json())
JSONデータの送信
JSON(JavaScript Object Notation)は、ウェブサービスを含むデータ交換において多様な用途で使用される一般的なデータ形式です。多くのAPIがJSONデータと連携します。
以下にJSONデータを送信する例を示します。
import requests
import json
data = {
'name': 'John',
'age': 30
}
headers = {'Content-type': 'application/json'}
response = requests.post('https://httpbin.org/post', data=json.dumps(data), headers=headers)
print(response.json())
この例では、最初にjson
モジュールをインポートし、json.dumps()
を使用してPythonの辞書をJSON文字列に変換します。また、Content-type
ヘッダーをapplication/json
に設定して、JSONデータを送信していることをサーバーに伝えています。
フォームデータの送信
フォームデータは通常、HTMLフォームからサーバーにデータを送信するために使用されます。データはキーと値のペアのシリーズとして送信され、各ペアはフォームフィールドとその値を表します。Requestsライブラリを使用すると、フォーマットを手動で行うことなく簡単にフォームデータを送信できます。
送信できるフォームデータには、application/x-www-form-urlencoded
とmultipart/form-data
の2種類があります。前者はデフォルトであり、ほとんどの場合に適していますが、ファイルを送信する必要がある場合はmultipart/form-data
を使用する必要があります。
以下にmultipart/form-data
を送信する例を示します。
import requests
data = {
'name': 'John',
'age': 30
}
files = {
'file': open('file.txt', 'rb')
}
response = requests.post('https://httpbin.org/post', data=data, files=files)
print(response.json())
この例では、バイナリモードでファイルを開き、files
辞書に含めています。POSTリクエストを行う際に、requests
は自動的にContent-Type
ヘッダーをmultipart/form-data
に設定し、データとファイルを適切にフォーマットします。
ファイルを使用した後は、必ずファイルを正しく閉じるためにリソースを解放するため、ファイルを閉じるようにします。ファイルを正しく閉じるための良い方法は、with
ステートメントを使用することです。
with open('file.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', data=data, files=files)
参考