[Python]requestsでpost(multipart_form-data response)

Pythonのrequestsライブラリについて

Pythonのrequestsライブラリは、HTTPリクエストを簡単に送信することができるライブラリです。GET、POST、PUT、DELETEなどのHTTPメソッドを使い、URLエンコード、JSON、multipart/form-dataなどの形式でデータを送信できます。

POSTリクエストの基本的な使い方

requestsライブラリを使ったPOSTリクエストの基本的な使い方は以下のようになります。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.text)

上記の例では、urlにPOSTリクエストを送信し、dataには送信するデータを指定しています。レスポンスはresponseに格納され、response.textで取得できます。

multipart/form-data形式でのPOSTリクエストの方法

ファイルをアップロードする場合や、HTMLフォームのように複数のデータを送信する場合には、multipart/form-data形式を使います。

requestsライブラリでmultipart/form-data形式を使う場合は、filesパラメータを使います。以下は、ファイルをアップロードする場合の例です。

import requests
url = 'http://example.com/upload'
files = {'file': open('example.jpg', 'rb')}
response = requests.post(url, files=files)
print(response.text)

上記の例では、filesに送信するファイルを指定しています。ファイルはopen()で開き、'rb'でバイナリモードで読み込んでいます。

HTMLフォームのように複数のデータを送信する場合には、dataパラメータとfilesパラメータを同時に指定します。以下は、HTMLフォームでusernamepasswordを送信する場合の例です。

import requests
url = 'http://example.com/login'
data = {'username': 'user1', 'password': 'pass1'}
files = {'profile_photo': open('photo.jpg', 'rb')}
response = requests.post(url, data=data, files=files)
print(response.text)

POSTリクエストによるレスポンスの取得方法

requestsライブラリでPOSTリクエストによるレスポンスを取得する場合、responseオブジェクトのtext属性やcontent属性、json()メソッドを使います。

text属性は、レスポンスの文字列を取得します。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.text)

content属性は、レスポンスのバイト列を取得します。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.content)

json()メソッドは、レスポンスをJSON形式でパースして取得します。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
json_data = response.json()
print(json_data)

レスポンスの解析とエラーハンドリング

レスポンスを解析する場合には、responseオブジェクトのstatus_code属性やheaders属性を使います。

status_code属性は、HTTPステータスコードを取得します。200番台は正常終了、400番台はクライアントエラー、500番台はサーバエラーを表します。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
if response.status_code == 200:
    print('Success!')
else:
    print('Error! status_code=' + str(response.status_code))

headers属性は、レスポンスのヘッダーを取得します。例えば、レスポンスのContent-TypeがJSONの場合は、response.json()でJSONをパースできます。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
if response.headers['Content-Type'] == 'application/json':
    json_data = response.json()
    print(json_data)
else:
    print('Error! Content-Type=' + response.headers['Content-Type'])

また、エラーが発生した場合には、response.raise_for_status()で例外を発生させることができます。

import requests
url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
try:
    response.raise_for_status()
except requests.exceptions.HTTPError as e:
    print('Error! ' + str(e))

まとめ

Pythonのrequestsライブラリを使うことで、簡単にHTTPリクエストを送信することができます。POSTリクエストによるデータ送信やmultipart/form-data形式でのファイルアップロード、レスポンスの取得方法、エラーハンドリング、実践的な例などについて紹介しました。