Python

【Python】【Requests】multipart/form-dataで値データのみを送信する

MAX

APIでPOSTリクエストをする際に、Content-Typeとしてmultipart/form-dataで送信する必要がある場合がある。

通常、multipart/form-dataは画像やCSVなどのファイルを送信する際に使用されるが、画像ファイルなどはなしで値のみを送信したい場合もある。

画像と値を合わせて送信したい場合、filesとdataを指定すれば良い感じに送信してくれるが、値データだけを送信したい場合、少し特殊になる。

スポンサーリンク

値データのみをmultipart/form-dataで送信①

filesのみに値データを設定して送信する。dataは使用しないパターン。

1import requests
2
3url = "https://sample.com"
4files = {
5    "key1": (None, "val1"),
6    "key2": (None, "val2"),
7    "key3": (None, "val3"),
8}
9r = requests.post(url=url, files=files)
10print(f"{r.request.headers}")
11# {'User-Agent': 'python-requests/2.27.1', 
12#  'Accept-Encoding': 'gzip, deflate',
13#  'Accept': '*/*', 
14# 'Connection': 'keep-alive',
15#  'Content-Length': '1024',
16#  'Content-Type': 'multipart/form-data;
17#  boundary=bc7543bf1249b2e58f32c30dfe34d365'}

postパラメータにfilesを指定することで、requestsがboundaryを自動で設定してくれる。

値データのみをmultipart/form-dataで送信②

dataに値を設定し、filesにはNoneを指定するパターン。

1import requests
2
3url = "https://sample.com"
4data = {
5    "key1": "val1",
6    "key2": "val2",
7    "key3": "val3",
8}
9files = {(None, None)}
10
11r = requests.post(url=url, data=data, files=files)
12print(f"{r.request.headers}")
13# {'User-Agent': 'python-requests/2.27.1',
14#  'Accept-Encoding': 'gzip, deflate',
15#  'Accept': '*/*',
16#  'Connection': 'keep-alive',
17#  'Content-Length': '1024',
18#  'Content-Type': 'multipart/form-data;
19#  boundary=bc7543bf1249b2e58f32c30dfe34d365'}

こちらの書き方の方が通常のdata、filesの使い方に似ているので分かりやすいかもしれない。

Content-Typeにmultipart/form-dataを設定するパターン(エラー)

なお、headerのContent-Typeにmultipart/form-dataを設定し、boundaryを設定しなかった場合、boundaryが設定されていない旨のエラーが発生する。

1import requests
2
3headers = {"Content-Type": "multipart/form-data"}
4url = "https://sample.com"
5data = {
6    "key1": "val1",
7    "key2": "val2",
8    "key3": "val3",
9}
10r = requests.post(url=url, data=data, headers=headers)
11print(f"{r.text}")
12# no multipart boundary param in Content-Type

boundaryを自分で設定できない場合、filesを使用した方が無難。

textやjson形式でデータを送信

application/jsonやapplication/textでデータを送信したい場合は以下の記事を参照。

あわせて読みたい
【Python】【Requests】POSTやGETでJSONやDATAを送受信する方法
【Python】【Requests】POSTやGETでJSONやDATAを送受信する方法
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました