はじめに
PHP製のアプリケーションAからアプリケーションB(PHP7.3・Laravel6.3)のWebAPIに対してPOSTリクエストを送信することを想定します。
異なるアプリケーションからWebAPIを叩く方法を初めて実装したので、実施した内容を整理しようと思います。
環境
- PHP
- V 5.6
- V 7.3
- Laravel(6.4)
クライアント側の実装
クライアント側(リクエスト送信側)ではPHP5.6を使用したアプリケーションです。
こちら側で、Laravel製のアプリケーション(PHP7.3 / Laravel6.4)のWebAPIを叩くメソッドを実装します。
今回、WebAPIを叩くために、PHPの標準機能である「curl」をしようします。
$base_url = 'https://xxx.xxx.xxx.xxx'; // アプリケーションBのドメイン
$destination = 'api/hoge'; // アプリケーションBのAPIのパス
$header = [
'Content-Type: application/json', // json形式のデータをpostするので必要
];
$params = [
'hoge' => 'hoge',
'fuga' => 'fuga'
]; // 対象APIへのリクエストパラメータ
$curl = curl_init(); // curlの初期化
curl_setopt($curl, CURLOPT_URL, $base_url.$destination); // curlするURL
curl_setopt($curl, CURLOPT_POST, TRUE); // POSTメソッド指定
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); // parameter クエリ文字列にエンコードしてpost
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // HTTPヘッダー
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 証明書の検証を無効化
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 証明書の検証を無効化
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 返り値を文字列に変更
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
$output= curl_exec($curl); // curlの実行・レスポンス
$result = json_decode($output); // JSONを連想配列にパース
curl_close($curl); // コネクションを閉じる
APIサーバ側の実装
アプリケーションAからcurlでPOSTリクエストされるAPIの実装を行います。
$dataJsonString = file_get_contents(‘php://input’);
// リクエストデータを加工
$dataList = [];
foreach (explode(‘&’, $dataJsonString) as $data) {
$tmpList = explode(‘=’, $data);
$key = $tmpList[0];
$val = $tmpList[1];
$dataList[$key] = $val;
}
注意点
リクエストパラメータについて、APIで処理するために連想配列に加工することを目標とします。
Larvelのrequestヘルパー関数では、postされたパラメータを受け取ることができませんでした。
また、PHPの標準関数である$_POSTでも受け取れません。
そこで、上記のように、file_get_contents関数を使用して、POSTデータを受け取ります。
file_get_contentsについて
- 生のPOSTデータを取得する方法です。
- 何故生のPOSTデータを取得する必要があるのか?
- 通常のPOSTデータはKeyとValueの組み合わせによる連想配列の形式となるが、
JSON形式に変換することで文字列のみとなり、標準の「$_POST」では形式が合わず取得が出来なくなるためと思われます。
- 通常のPOSTデータはKeyとValueの組み合わせによる連想配列の形式となるが、
最後に
PHPの標準機能であるcurlとfile_get_contentsをもちいて、アプリケーション間の処理の受け渡しを実装することができました。