CakePHP3.x系で外部のAPIを実行する方法

CakePHP3を使用して外部のAPIを利用する際の実装方法をまとめました。

2系の時とは実装方法が異なるので、2系でAPIの実装したことがあるひとは注意が必要です。

環境

  • PHP: 7.1.0
  • CakePHP: 3.5.X

GETリクエストでAPIを実行する場合

Controllerに下記のactionを追加します。

今回は郵便番号から住所を取得する外部APIを利用します。

Controllerの先頭部分にClientをインポートしておきます。

use Cake\Network\Http\Client;
    public function searchAddress() {
        $url = 'http://zipcloud.ibsnet.co.jp/api/search';
        $data = [
            'zipcode' => $this->request->getQuery('郵便番号')
        ];

        $http = new Client();
        $response = $http->get($url, $data);

        $body = json_decode($response->body());

        $results = [];
        if ($body->status == 200 && $body->message == null && $body->results != null) {
            foreach ($body->results as $result) {
                $tmp = [
                    '郵便番号' => $result->zipcode,
                    '都道府県コード' => $result->prefcode,
                    '住所1' => $result->address1,
                    '住所2' => $result->address2,
                    '住所3' => $result->address3,
                    '住所かな1' => $result->kana1,
                    '住所かな2' => $result->kana2,
                    '住所かな3' => $result->kana3
                ];
                array_push($results, $tmp);
            }
        } else {
            $this->response->body(json_encode($body->message));
        }

        $this->set(compact('results'));
        $this->set('_serialize', ['results']);
    }

試しに上記の実装したURLに郵便番号のパラメータとして「100-0001」を設定して、GETリクエストを実行すると、下記のレスポンスが返ってきます。

array(1) {
  [0]=>
  array(8) {
    ["郵便番号"]=>
    string(7) "1000001"
    ["都道府県コード"]=>
    string(2) "13"
    ["住所1"]=>
    string(9) "東京都"
    ["住所2"]=>
    string(12) "千代田区"
    ["住所3"]=>
    string(9) "千代田"
    ["住所かな1"]=>
    string(18) "トウキョウト"
    ["住所かな2"]=>
    string(15) "チヨダク"
    ["住所かな3"]=>
    string(12) "チヨダ"
  }
}

最後に

CakePHP3HttpClientを利用することで簡単にAPIを実行することができました。

APIの実装部分を共通クラスにしておくことで、システム内で汎用的に利用できるようにもなります。