質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.08%

ぐるナビapiで市町村コードを手に入れる方法

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,693

442ky119

score -83

グルナビのレストラン検索APIにはリクエスト時に指定可能なパラメータの中に「市町村コード」がないらしいですが、例えば東北だけののレストランの情報を知りたい場合はどうすればいいですか?

<?php

/**
 * HTMLにテキストを出力する際は必ずこの関数を通す 
 */
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

// エンドポイントとパラメータを定義
$endpoint = 'http://api.gnavi.co.jp/RestSearchAPI/20150630/';
$params = [
    'keyid' => '私のid',
    'format' => 'json',
    'pref' => '04',
];

// リクエスト実行
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $endpoint . '?' . http_build_query($params, '', '&'),
    CURLOPT_RETURNTRANSFER => true, // レスポンスボディを返り値として取得
    CURLOPT_FAILONERROR => true, // HTTPステータス400以上はエラーと見なす
    CURLOPT_ENCODING => 'gzip', // 通信を圧縮する
]);
$response = curl_exec($ch);

// エラーのときはテキストとしてエラーメッセージを出して終了
if ($response === false) {
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    exit(curl_error($ch));
}

// API側がクソ実装してなければこのjson_decodeは必ず成功するはず
$obj = json_decode($response);

// HTMLとして表示
header('Content-Type: text/html; charset=UTF-8');

?>
<!DOCTYPE html>
<title>Example</title>
<?php foreach ($obj->rest as $r): ?>
<table border="1">
    <caption><?=h($r->name)?></caption>
    <tr>
        <th>店舗名</th>
        <td><?=h($r->name)?></td>
    </tr>
    <tr>
        <th>アクセス</th>
        <td><?=h($r->access->line)?><?=h($r->access->station)?>から<?=h($r->access->walk)?>分</td>
    </tr>
</table>
<?php endforeach; ?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/06/12 19:55

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+8

リファレンスも読まずにプログラミングをするなんて不可能では?
http://api.gnavi.co.jp/api/manual/

RTFM

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+8

もう1度だけうるさいことを。

https://teratail.com/questions/37226 で書いた回答の意味をよく考えてみてください。
これからもこのまま結局他人の善意に頼ってコーディングしてもらったものを微修正して「自分のもの」を作り上げるのですか。

今やろうとしていることに対して、致命的にそれ以前の知識が不足しています。
仮にこのまま、なんらかご希望の動作をするものができたとしても、なぜそれがそのように動作するのかわからないままになりますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/12 21:54

    はい、大丈夫です。

    キャンセル

  • 2016/06/12 22:06

    大丈夫というのは、XMLやJSONの扱いをわかっているということですね。
    では、

    APIのエンドポイントに対して、任意のパラメータを付与してアクセスし、XMLまたはJSON・JSONPといった形式でレスポンスを取得し、それを任意の箇所に書き出す、という処理です。

    という意味も理解できるということでしょう。
    だとしたら、リファレンスを見てエンドポイントへ適切なパラメータをつけてアクセスすれば、レスポンスを受け取れるはずです。

    だとしたら、エンドポイントへのパラメータの付与方法について、もしくはレスポンスの解釈方法についてのご質問になるはずです。

    そう言った具体的なご質問につながっていないので、上記のようなうるさいことを書きました。


    しかし質問者さんが、自分はわかっている、というのであれば勘違いでしたね。
    すみません。

    キャンセル

  • 2016/06/12 23:31

    説明不足ですみません、レスポンスフィールドについての知識が余りないんです。

    キャンセル

+1

http://api.gnavi.co.jp/api/manual/ のエリアマスタAPI などで取得できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/12 19:49

    おまけ2

    ぐるなび API の場合、API テストツールがありますので、ここで、条件を選択すると URL欄に 結果を検索できる URL が作れます。(URLの IDを自分のIDに置き換えて使います。)
    http://api.gnavi.co.jp/api/tools/?apitype=ver1_PhotoSearch

    キャンセル

  • 2016/06/12 20:56

    ありがとうございます。
    やってみます。
    わからなくなったらまた連絡します。

    キャンセル

  • 2016/06/13 12:38

    コードのように書きましたが宮城県の店舗情報が手に入りません。

    キャンセル

+1

ぐるナビのサンプルコードはいろいろと修正すべき点が多いので,「受付中 <tr><td>の表にしたい」で私が書いた回答をベースにいろいろ書き換えてみてください.ぐるなび Web Service - レストラン検索APIを見ればリクエストパラメータに関してもレスポンスフィールドに関しての情報も両方手に入ります.但し,もしJSONで取り扱う場合は少し応用が必要です.

  • リクエストパラメータに関しては,書いてある通りです.エリア指定は「area」「pref」「areacode_l」「areacode_m」「areacode_s」の5つです.下に行くほど区分が小さくなり,市町村レベルの指定は下3つでできるかと思います.エリアコードの取得方法も書いてある通りです.各エリアコード取得用エンドポイントに「keyid」「format」のみ指定して送ってください.

  • レスポンスパラメータに関しては,XMLを基準に書いてあるのでJSONを取り扱う場合は少し読み替えが必要です.てっとり早いのはvar_dumpしてみて構造を眺めることですが,「出現回数が複数になっているものは配列になる」という法則があるようで,これに従えばvar_dumpの確認無しでもコードを書けます.

エリアコード取得用エンドポイントの利用ですが,一目確認したいだけならわざわざコードを書く必要すらありません.APIテストツールで簡単に確認を行えます.ただしJSONがそのままでは読みにくいので,ターミナルからワンライナーのPHPコードを利用すると便利です.例えばMacならクリップボードを標準出力に流すpbpasteコマンドを使えますが,あらかじめAPIテストツールが取得したJSONデータをコピーしておいたうえで

php -r 'var_dump(json_decode(`pbpaste`);'

を実行すると見やすく表示されます.

イメージ説明

例えばこれを見れば,東北のエリアコードはAREA160であるとわかります.PHPでアクセスするなら 

$json->area[1]->area_code

でいいこともわかりますね.別の方法として,インストールが必要ですが jsonpp uni2ascii パッケージを利用するという手段もあります.

pbpaste | jsonpp | ascii2uni -a U -q

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/13 09:46

    jsonは難しいですか?
    初めて使うので不安です。
    また、応用が必要だと書いてありますがどういう応用が必要ですか?

    キャンセル

  • 2016/06/13 09:55

    回答本当に全部読まれましたか?落ち着いてください…

    応用は「XML基準で書かれた内容の読み替え」と「見やすく表示する方法」です.書いたとおりです.

    キャンセル

  • 2016/06/13 09:58

    JSONについて無知であれば,ここを一読してください.

    http://dev.classmethod.jp/etc/concrete-example-of-json/

    注意すべき点は,JavaScriptによるJSONに対する「変数.要素名」でのアクセスはPHPでは「$変数->要素名」として表現されることです.配列に関してはどちらも「$変数[オフセット番号]」です.

    キャンセル

  • 2016/06/13 10:22

    ありがとうございます。丁寧に説明してありがとうございます。
    またわからなくなったら、質問します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る