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通信の方法についてでした。