python requestsを用いたjsonのGET, POST通信

pythonのrequestsモジュールを用いて、phpとデータをやりとりする方法について。

私は、GET通信で記述していた内容をPOST通信に書き換える際に、丸3日ほどハマってしまいました。皆さんは私のようにハマりませんように。。。

GET通信

GET通信はURLパラメータに情報を付与する形でデータを送ります。
resuestsのparams引数にjsonデータを付与します。

import requests
TO_URL = "https://XXXXX/XXXXX.php"
json_data = { 'hoge': 'piyo' }
response = requests.get( TO_URL, params=json_data )
print( "status:", response.status_code )   # 200

php側

$json = $_GET;
echo "[json]\n";
var_dump( $json );

POST通信

POST通信。
headerにデータが “application/json” であることを明記します。requests.post()にjsonを渡す際には、json.dumps()でjsonを文字列に変換します。

import requests, json
TO_URL = "https://XXXXX/XXXXX.php"
json_data = { 'hoge': 'piyo' }
headers = { 'Content-Type': 'application/json' }
response = requests.post( TO_URL, data=json.dumps(json_data), headers=headers )
print( "status:", response.status_code )   # 200

php側

$raw_data = file_get_contents("php://input");   // $_POSTではない!
$json = json_decode($json, true);   // 第二引数をtrueにするとオブジェクトではなく、連想配列としてデコード
echo "[json]\n";
var_dump( $json );

POSTデータをphp側で受け取るには、file_get_contents(“php://input”)を使います。$_POSTではありません!
(私はこれで丸3日ぐらいはまりました、、、)

困った時はちゃんと公式のドキュメントを見ましょうね。
https://www.php.net/manual/en/reserved.variables.post.php

An associative array of variables passed to the current script via the HTTP POST method when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request.

$_POST変数で取得できるのは、データタイプが “application/x-www-form-urlencoded” か “multipart/form-data” の場合ですね。

おかげで私は、python requests側のコードを丸3日も疑うハメになりました。まさかPHP側が悪いとは。

皆さんがjsonのPOST通信で私のようにはまらないことを願っています!

以上、python requestsを用いたjsonのGET, POST通信の方法についてでした。