【Python】日付と文字列を相互に変換する方法
MAX
MAX999blog
APIでPOSTリクエストをする際に、Content-Typeとしてmultipart/form-dataで送信する必要がある場合がある。
通常、multipart/form-dataは画像やCSVなどのファイルを送信する際に使用されるが、画像ファイルなどはなしで値のみを送信したい場合もある。
画像と値を合わせて送信したい場合、filesと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を自動で設定してくれる。
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の使い方に似ているので分かりやすいかもしれない。
なお、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を使用した方が無難。
application/jsonやapplication/textでデータを送信したい場合は以下の記事を参照。