edo1z blog

プログラミングなどに関するブログです

zipcloud - 郵便番号データのAPI

郵便番号検索機能をWEBサービスで提供してくれています。

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

登録などは一切不要みたいです。 getで、http://zipcloud.ibsnet.co.jp/api/search?zipcode=1540017のように郵便番号を与えると、jsonで返ってきます。

{
    "message": null,
    "results": [
        {
            "address1": "東京都",
            "address2": "世田谷区",
            "address3": "世田谷",
            "kana1": "トウキョウト",
            "kana2": "セタガヤク",
            "kana3": "セタガヤ",
            "prefcode": "13",
            "zipcode": "1540017"
        }
    ],
    "status": 200
}

不正な郵便番号を与えるとエラーが返ってきます。

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

{
    "message": "パラメータ「郵便番号」の桁数が不正です。",
    "results": null,
    "status": 400
}

桁数が正しいが存在しない郵便番号を与えると、エラーではないがnullが返ってきます。

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

{
    "message": null,
    "results": null,
    "status": 200
}

また、郵便番号にハイフンがあってもきちんと対応してくれている。 http://zipcloud.ibsnet.co.jp/api/search?zipcode=154-0017

{
    "message": null,
    "results": [
        {
            "address1": "東京都",
            "address2": "世田谷区",
            "address3": "世田谷",
            "kana1": "トウキョウト",
            "kana2": "セタガヤク",
            "kana3": "セタガヤ",
            "prefcode": "13",
            "zipcode": "1540017"
        }
    ],
    "status": 200
}

あら、でもAjaxでgetで取得しようとしたらエラーになる。クロスドメイン関係のエラーなので、Ajaxのアクセスできないのかもしれない。仕方ないのでPHPでつくってみる。

今fuelphp使っている。

/**
 * zip cloudで郵便番号から住所情報を取得する関数(Ajax用)
 */
public function get_address($zip_code = null){
    if(!$zip_code) return $this->response(null);

    $context = stream_context_create(array(
        'http' => array('ignore_errors' => true)
    ));

    header("Content-type:text/html;charset=UTF-8");
    $address = file_get_contents('http://zipcloud.ibsnet.co.jp/api/search?zipcode=' . $zip_code, false, $context);
    $address_arr = json_decode($address, true);

    if($address_arr['status'] != 200 || empty($address_arr['results'])) return $this->response(null);

    //カナを全角にする
    for($i = 1; $i < 4; $i++){
        $address_arr['results'][0]['kana' . $i] = mb_convert_kana($address_arr['results'][0]['kana' . $i], 'KV', 'UTF-8');
    }

    //都道府県をコードに変換する
    $address_arr['results'][0]['address1'] = Model_Building::get_prefecture_code_from_name($address_arr['results'][0]['address1']);

    $this->response(json_encode($address_arr['results'][0]));
}

これにjavascriptでAjaxでアクセスする。

function zipcloud(base_url, zip_code, class_name){
    if(!base_url || !zip_code) return;
    if(!class_name) class_name = '';

    $.ajax({
        type: "GET",
        url: base_url + 'hoge/' +  zip_code,
        dataType: "json",
        success: function(address){
            address = JSON.parse(address);
            $('.zipcloud_pref_code' + class_name).val(address['address1']);
            $('.zipcloud_city' + class_name).val(address['address2']);
            $('.zipcloud_address' + class_name).val(address['address3']);
            $('.zipcloud_city_kana' + class_name).val(address['kana2']);
            $('.zipcloud_address_kana' + class_name).val(address['kana3']);
        }
    });
}

これに郵便番号が変わったらonchangeでアクセスする。