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[‘キー名’]で取得する。