Python

【Python】【Requests】POSTやGETでJSONやDATAを送受信する方法

MAX

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形式でデータを送信したい場合は以下の記事を参照。

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