Python

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

PythonでJSON形式の文字列を送信したり、受信したりする時、双方で型を合わせる必要がある。

PythonにはJSON型がなく、辞書型が存在する。

辞書型は「’(クォーテーション」でも「”(ダブルクォーテーション)」でもどちらでも柔軟に書けるが、JSONは基本的に 「”(ダブルクォーテーション)」 である必要がある。

これを意識せずに適当にjson.dumps、json.loadsをやったりやらなかったりとかすると、思わぬところでハマってしまう。

dataをPOST送信して受信するパターン

JSON形式の文字列をJSONではなくDATAとして送信し、それを取得するパターン。

送信側(dataをPOST)

import requests
import json

#POST先URL
url = "POST送信するURL"

#JSON形式のデータ
jsonData = {
    "col1": "val1",
    "col2": "val2"
}    

#POST送信
response = requests.post(
    url,
    data = json.dumps(jsonData)    #dataを指定する
    )

resDatas = response.json()

json.dumps()をすると、requestsがヘッダーをdataではなくjsonと認識してしまうため、dataと明示して送信する。

受信側(dataをデコードしてからjson.loads)

#データ取得
import json

param = json.loads(request.data.decode('utf-8'))

col1 = param.get('col1')
col2 = param.get('col2')

request.dataをjson.loadsすることで、辞書型として、扱えるようになる。

 

jsonをPOST送信して受信するパターン

JSON形式の文字列をPOSTする。

送信側(json.dumps)

import requests
import json

#POST先URL
url = "POST送信するURL"

#JSON形式のデータ
jsonData = {
    "col1": "val1",
    "col2": "val2"
}    

#POST送信
response = requests.post(
    url,
    json = json.dumps(jsonData)     #jsonはなくても送信可能
    )

resDatas = response.json()
 

POST時に「json = 」とすることで、requestsが自動的にContentsTypeをjsonとして送信してくれる。

json.dumpsしている場合、jsonは省略可能。分かりやすさのためには、明示的に記載した方が良いとは思う。

受信側(json.loads)

import json

#データ取得
param = json.loads(request.json)

col1 = param.get('col1')
col2 = param.get('col2')

request.jsonをjson.loadsすれば、辞書型として扱える。

request.dataだとjson.loadsしてもstr型になるので注意。

formをPOST送信して受信するパターン

formデータとして送信するパターン。画像と同時に送信することが可能。

送信側(json.dumpsせずに送信)

import requests
import json

#POST先URL
url = "POST送信するURL"

#JSON形式のデータ
jsonData = {
    "col1": "val1",
    "col2": "val2"
    "list1": {
        "list1_col1": "list1_val1",
        "list1_col2": "list1_val2",
        }
}    

#POST送信
response = requests.post(
    url,
    data = jsonData
    )

resDatas = response.json()

json.dumpsせずに送信するとformデータとして送信される。

受信側(form.getを使う場合(項目別に取得))

#データ取得
col1 = request.form.get('col1')
col2 = request.form.get('col2')
list1 = request.form.getlist('list1')

各項目毎にform.getで取得可能。リストを取得する場合はgetlistを使う。

 

paramをGET送信して受信するパターン

GETはPOSTのように色々(JSONとかDATAとかFILEとか)送信できないので、送信側も受信側も比較的シンプル。

送信側(paramをGET送信)

import requests
import json

#GET先URL
url = "GET送信するURL"

#JSON形式のデータ
jsonData = {
    "col1": "val1",
    "col2": "val2"
}    

#GET送信
response = requests.post(
    url,
    params = jsonData
    )

resDatas = response.json()

json.dumpsとかしなくても、受信側ではキーを指定して値を取得可能。

受信側(argsで取得)

import json

#データ取得
col1 = request.args.get('col1')
col2 = request.args['col2']

GET送信されたパラメータは request.args.get(‘キー名’)または request.args[‘キー名’]で取得する。