【Python】【Requests】POSTやGETでJSONやDATAを送受信する方法
PythonでJSON形式の文字列を送信したり、受信したりする時、双方で型を合わせる必要がある。
PythonにはJSON型がなく、辞書型が存在する。
辞書型は「’(クォーテーション」でも「”(ダブルクォーテーション)」でもどちらでも柔軟に書けるが、JSONは基本的に 「”(ダブルクォーテーション)」 である必要がある。
これを意識せずに適当にjson.dumps、json.loadsをやったりやらなかったりとかすると、思わぬところでハマってしまう。
dataをPOST送信して受信するパターン
JSON形式の文字列をJSONではなくDATAとして送信し、それを取得するパターン。
送信側(dataをPOST)
1import requests
2import json
3
4#POST先URL
5url = "POST送信するURL"
6
7#JSON形式のデータ
8json_data = {
9 "col1": "val1",
10 "col2": "val2"
11}
12
13#POST送信
14response = requests.post(
15 url,
16 data = json.dumps(json_data) #dataを指定する
17 )
18
19res_data = response.json()
json.dumps()をすると、requestsがヘッダーをdataではなくjsonと認識してしまうため、dataと明示して送信する。
受信側(dataをデコードしてからjson.loads)
1#データ取得
2import json
3
4param = json.loads(request.data.decode('utf-8'))
5
6col1 = param.get('col1')
7col2 = param.get('col2')
request.dataをjson.loadsすることで、辞書型として、扱えるようになる。
jsonをPOST送信して受信するパターン
JSON形式の文字列をPOSTする。
送信側(json.dumps)
POST時に「json = 」とすることで、requestsが自動的にContentsTypeをjsonとして送信してくれる。
json.dumpsしている場合、「json = 」は省略可能。分かりやすさのためには、明示的に記載した方が良いと思う。
受信側(json.loads)
1import json
2
3#データ取得
4param = json.loads(request.json)
5
6col1 = param.get('col1')
7col2 = param.get('col2')
request.jsonをjson.loadsすれば、辞書型として扱える。
request.dataだとjson.loadsしてもstr型になるので注意。
formをPOST送信して受信するパターン
formデータとして送信するパターン。画像と同時に送信することが可能。
送信側(json.dumpsせずに送信)
1import requests
2import json
3
4#POST先URL
5url = "POST送信するURL"
6
7#JSON形式のデータ
8json_data = {
9 "col1": "val1",
10 "col2": "val2"
11 "list1": {
12 "list1_col1": "list1_val1",
13 "list1_col2": "list1_val2",
14 }
15}
16
17#POST送信
18response = requests.post(
19 url,
20 data = json_data
21 )
22
23res_data = response.json()
json.dumpsせずに送信するとformデータとして送信される。
受信側(form.getを使う場合(項目別に取得))
1#データ取得
2col1 = request.form.get('col1')
3col2 = request.form.get('col2')
4list1 = request.form.getlist('list1')
各項目毎にform.getで取得可能。リストを取得する場合はgetlistを使う。
paramをGET送信して受信するパターン
GETはPOSTのように色々(JSONとかDATAとかFILEとか)送信できないので、送信側も受信側も比較的シンプル。
送信側(paramをGET送信)
1import requests
2import json
3
4#GET先URL
5url = "GET送信するURL"
6
7#JSON形式のデータ
8json_data = {
9 "col1": "val1",
10 "col2": "val2"
11}
12
13#GET送信
14response = requests.post(
15 url,
16 params = json_data
17 )
18
19res_data = response.json()
json.dumpsとかしなくても、受信側ではキーを指定して値を取得可能。
受信側(argsで取得)
1import json
2
3#データ取得
4col1 = request.args.get('col1')
5col2 = request.args['col2']
GET送信されたパラメータは request.args.get(‘キー名’)または request.args[‘キー名’]で取得する。
Multipart/form形式でデータを送信する
値データのみ(画像データなし)でMultipart/form形式でデータを送信したい場合は以下の記事を参照。