URLクエリ

クエリ文字列とは

URLのクエリ文字列は、URLの末尾に ? で始まり、キーと値のペアを含む文字列です。

クエリ文字列の例

?name=John&age=30

URLSearchParams

URLSearchParamsは、URLのクエリ文字列の操作を簡単するオブジェクトです。

クエリ文字の値取得

クエリ文字列を解析してキーと値のペアを取得できます。

const queryString = 'name=John&age=30';
const params = new URLSearchParams(queryString);
console.log(params.get('name')); // 'John'
console.log(params.get('age'));  // '30'

クエリ文字の作成

append() で、新しいキーと値のペアをクエリ文字列に追加できます。

params.append('city', 'New York');
console.log(params.toString()); // 'name=John&age=30&city=New+York'

郵便番号検索API

zip cloud

zip cloudは、郵便番号から住所を取得するAPIです。現在(2023年時点)は無料で利用できます。

  • APIを利用するときは、サーバに負荷をかけないように注意しましょう

API URL

「zip cloud」のAPI URLは、以下のとおりです。

http://zipcloud.ibsnet.co.jp/api/search

「zip cloud」のAPIでは、郵便番号のキーは「zipcode」で指定します。

http://zipcloud.ibsnet.co.jp/api/search?zipcode=1600022

郵便番号検索

郵便番号から都道府県のプルダウン選択と、テキストボックスに住所を表示してみましょう。

ファイル構成

search_address/
├── data/
│        └── prefectures.json
├── js/
│        └── app.json
└── app.html

HTML修正

HTMLに「郵便番号」と「市区町村」の入力と検索ボタンを追加します。

search_address.html
    <main class="container">
        <h2 class="mt-3">住所検索</h2>
        <!-- 郵便番号検索 追加 -->
        <div class="mb-3">
            <label class="form-label">郵便番号</label>
            <div class="input-group w-25">
                <input id="zipcode" class="form-control" type="text" name="zipcode">
                <button class="btn btn-sm btn-secondary" onclick="searchHandler()">検索</button>
            </div>
        </div>

        <div class="mb-3">
            <label class="form-label" for="">都道府県</label>
            <select id="prefecture" class="form-control w-25" name="prefecture">
                <option value="">--- 都道府県 ---</option>
            </select>
        </div>

        <!-- 市区町村 追加 -->
        <div class="mb-3">
            <label class="form-label" for="">市区町村</label>
            <input id="city" class="form-control" type="text" name="address2">
        </div>
    </main>
結果

API URL確認

API通信メソッド追加

API通信メソッド searchAddress() を追加し、API URLを生成します。

default.js
const SEARCH_URI = "https://zipcloud.ibsnet.co.jp/api/search";

const searchAddress = async (zipcode) => {
    try {
        const query_param = new URLSearchParams({ zipcode: zipcode, })
        const uri = SEARCH_URI + "?" + query_param.toString();
        console.log(uri);
    } catch (error) {
        errorDisplay.innerHTML = error;
    }
}

イベントハンドラ追加

【検索】ボタンのクリックイベントハンドラ searchHandler() を追加し、searchAddress() を非同期で実行します。

default.js
const searchHandler = async () => {
    const zipcode = document.getElementById('zipcode').value;
    var data = await searchAddress(zipcode);
}

ブラウザで郵便番号を入力して【検索】ボタンをクリックして、API URLを確認してみましょう。

結果例

https://zipcloud.ibsnet.co.jp/api/search?zipcode=1600001

API処理

APIデータ取得

searchAddress() で、fetch() でデータ取得し、json() でオブジェクトに変換します。

js/app.js
const SEARCH_URI = "https://zipcloud.ibsnet.co.jp/api/search";

const searchAddress = async (zipcode) => {
    try {
        const query_param = new URLSearchParams({ zipcode: zipcode, })
        const uri = SEARCH_URI + "?" + query_param.toString();
        console.log(uri);
        const response = await fetch(uri);
        const data = await response.json();
        return data;
    } catch (error) {
        errorDisplay.innerHTML = error;
    }
}
  • async/await で非同期処理に注目

データ表示

searchHandler() で取得したデータから、郵便番号と住所をHTMLで表示します。

js/app.js
const searchHandler = async () => {
    const zipcode = document.getElementById('zipcode').value;
    if (!zipcode) {
        errorDisplay.innerHTML = '郵便番号を入力してください';
        return;
    }
    var data = await searchAddress(zipcode);
    console.log(data);
    if (data.results) {
        var results = data.results[0]
        document.getElementById('prefecture').value = results.prefcode;
        document.getElementById('city').value = results.address2 + results.address3;
    } else {
        errorDisplay.innerHTML = data.message;
    }
}

API処理確認

郵便番号検索をして、住所が表示されるか確認します。

結果