Laravelで郵便番号を取得するAPIを実装する

Laravel
目次

利用するAPI

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

あわせて読みたい
郵便番号データのダウンロード - zipcloud 株式会社アイビスが運営する郵便番号データ配信サービス「zipcloud」。Google App Engine 上で稼働しています。


試しにURLを試してみてください。
https://zipcloud.ibsnet.co.jp/api/search?zipcode=1500043

そうすると、郵便番号から下記のリクエストがreturnされます

{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "渋谷区",
			"address3": "道玄坂",
			"kana1": "トウキョウト",
			"kana2": "シブヤク",
			"kana3": "ドウゲンザカ",
			"prefcode": "13",
			"zipcode": "1500043"
		}
	],
	"status": 200
}

このAPIを利用して、住所を取得していきます。

Laravel側の実装

Controllerでの実装箇所だけ説明します。もしもレイアードアーキテクチャで実装する場合はInfrastructure層のRepositoryまたはAdapterに記述する箇所になります。

    /**
     * 郵便番号から住所を取得
     *
     * @param int $zipCode 郵便番号
     * @return Illuminate\Http\JsonResponse
     */
    public function getAddressFromZipcode(int $zipCode): Illuminate\Http\JsonResponse
    {
        try {
            $address_array = $this->execApi($zipCode);

            return response()->json($address_array);
        } catch (Exception $exception) {
            error_log($exception);

            return response()->json(
                [
                    'message' =>  "住所取得に失敗しました"
                ],
                Response::HTTP_INTERNAL_SERVER_ERROR
            );
        }
    }

    /**
     * 郵便番号を利用して、住所を取得するAPIを実行
     *
     * @param int $zipCode 郵便番号
     * @return array
     */
    private function execApi(int $zipCode): array
    {
        $url = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" . $zipCode;

        $handle = curl_init();
        curl_setopt($handle, CURLOPT_URL, $url);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($handle, CURLOPT_ENCODING, "UTF-8");

        $response =  curl_exec($handle);
        curl_close($handle);

        $xml = json_decode($response, true);

        return [
            "state" => $xml['results'][0]['address1'],
            "city" => $xml['results'][0]['address2'],
            "address" => $xml['results'][0]['address3']
        ];
    }

上記の例はGuzzleを利用しないでAPIを実行しています。

Guzzleを利用すると下記のようになります

    /**
     * 郵便番号を利用して、住所を取得するAPIを実行
     *
     * @param int $zipCode 郵便番号
     * @return array
     */
    private function execApi(int $zipCode): array
    {
        $client = new GuzzleHttp\Client();
        $url = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" . $zipCode;
        
        $response = $client->request('GET', $url);
        
        $xml = json_decode($response, true);

        return [
            "state" => $xml['results'][0]['address1'],
            "city" => $xml['results'][0]['address2'],
            "address" => $xml['results'][0]['address3']
        ];
    }

これでスッキリしましたね

まとめ

無料でAPIが公開されているので、非常に助かりますね。

どこのサービスも郵便局が公開しているCSVを毎月importして、DBを更新しているので、住所の影響は大きく受けないと思います。

最終更新月も記載されているので、この辺り安心かと思います

Laravel側で住所を取得したので、あとはVue.jsなどのフロントエンド側で住所を表示させるだけになります。

簡単でしたね。

ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる