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

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

ただいまの
回答率

90.48%

  • PHP

    24459questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • API

    1852questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ぐるなびapiで根本的に分からないこと

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,524

uverworld101nm

score 94

ぐるなびapiを使って肝心なことがわからないままです。
それは、例えば茨城県にある店舗を全て取得するにはどうすればいいですか?
リクエストパラメータに

$pref='PREF◯◯◯'


と書けば茨城県の店舗情報が入り、

hit_per_page=20


と書けば20店舗の店舗情報が手に入るのはわかります。
しかし、茨城県に何店舗あるのかわからないのでどう書けばいいかわかりません。
ちなみにデフォルトだと10店舗しか手に入りません。

※実は、レスポンスのtotal_hit_count、hit_per_page、page_offsetの出力の仕方がわからないんです。
xmlを使っており、レスポンスパラメータの書き方は、
$xml = simplexml_load_file( $url );
if(!$xml->rest){
echo '見つかりませんでした';
} else { 
foreach($xml->rest as $key){
というやり方で出力しています

※みなさん、ご回答ありがとうございます。
質問に逸れた質問をしてしまい大変すみません。
ですが、それでもご回答してくれてありがとうございます。
わからなかった問題がまた一つわかりました。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2016/06/30 17:15

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

回答 5

+4

hit_per_pageは一度のリクエストでどれだけの店舗数を取得するかを設定します。
あとはレスポンスのpage_offsetとリクエストのoffset_pageを、使って少しずつ情報を取得する必要がありそうです。

hit_per_pageにAPIが許容する最大値を設定すれば、やりとりの回数は減らせそうですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/27 18:17

    ご回答ありがとうございます。
    わからないところがあります。
    レスポンスのpage_offsetとリクエストのoffset_pageを、使って少しずつ情報を取得する必要があるとは、例えば10ページを表示したい場合はレスポンスのpage_offsetを1にし、リクエストのoffset_pageを10と書くのですか?

    キャンセル

  • 2016/06/27 18:28

    違います。
    レスポンスの値を書き換えるという考え方を捨ててください。
    レスポンスのpage_offsetが1なら全ページ中1ページ目を取得したという意味です、次は2ページ目が欲しいので、リクエストのoffset_pageに2を設定します。

    キャンセル

  • 2016/06/27 18:48

    その、次は2ページ目が欲しいならリクエストのoffset_pageに2を設定するとは何処にoffset_pageを書くのですか?

    キャンセル

  • 2016/06/27 19:00

    どこにってリクエストの条件にです。
    確認ですが、リクエストの送り方もわからないんですか?

    キャンセル

  • 2016/06/27 19:39

    リクエストの送り方は分かります。
    当然ですよ笑

    キャンセル

  • 2016/06/27 19:42

    僕が一瞬思ったのは、$page_offset=1,2;と書くのかなと思いました。
    すみません、一瞬思っただけなので気にしないで下さい。

    キャンセル

  • 2016/06/27 19:53

    $page_offset=2でいいんじゃないですか

    リクエストは送れるけど、リクエストの条件設定とレスポンスの使い方がわからないんですね。
    一度レスポンスをコンソール出力してください。

    キャンセル

  • 2016/06/28 15:55

    質問遅れました。
    実は、レスポンスのtotal_hit_count、hit_per_page、page_offsetの出力の仕方がわからないんです。
    xmlを使っており、レスポンスパラメータの書き方は、
    $xml = simplexml_load_file( $url );
    if(!$xml->rest){
    echo '見つかりませんでした';
    } else {
    foreach($xml->rest as $key){
    というやり方で出力しています。

    キャンセル

  • 2016/06/29 22:09

    すみません、レスポンスの使い方がまだわからないところがあります。

    キャンセル

  • 2016/06/29 22:45

    WebAPIを使うには理解が浅すぎるようです。基礎からやった方があなたのためになりますよ。

    キャンセル

  • 2016/06/29 23:22

    そうみたいですね。
    ただ、page_offsetを僕の提示したレスポンスパラメータの何処に書けばいいか教えていただけないでしょうか?
    page_offsetやtotal_hit_countなどの書き方がよくわからないんです。

    キャンセル

  • 2016/06/29 23:22

    xmlの中に入れないんですよね?

    キャンセル

  • 2016/06/29 23:36

    リクエストも送れていないじゃないですか。
    もう一度ぐるなびのサンプルを見てください。
    リクエストの送り方もレスポンスの解析の仕方もサンプルにあるじゃないですか。

    あなたが「提示したといっているコード」はとてもじゃないですがコードとは言えません。サンプルのコードをどう改造したかを質問に追記してください。

    キャンセル

  • 2016/06/29 23:44

    いや、僕の提示したコードでapiから情報を取得できているんです。

    キャンセル

  • 2016/06/29 23:46

    $pref='PREF◯◯◯'
    上記がコードですか?

    キャンセル

  • 2016/06/29 23:49

    それに、サンプルコードはxml仕様になっていないんです。
    json仕様なんです。

    キャンセル

  • 2016/06/29 23:50

    今提示しますから待ってください。

    キャンセル

  • 2016/06/29 23:50

    今はリクエストの話をしています。
    あなたが提示したコードとはどれですか?

    キャンセル

  • 2016/06/29 23:51 編集

    「提示した」と言っていたのに「今提示する」とはどういうことですか。

    キャンセル

  • 2016/06/29 23:52

    $apikey='私のid';
    $format='xml';
    $pref='PREF〇〇';
    $hit_per_page='20';
    $url ='http://api.gnavi.co.jp/RestSearchAPI/?keyid=' . $apikey . '&format=' . $format . '&pref=' . $pref . '&hit_per_page=' . $hit_per_page;

    キャンセル

  • 2016/06/29 23:52

    提示しました。

    キャンセル

  • 2016/06/30 00:04 編集

    $url ='http://api.gnavi.co.jp/RestSearchAPI/?keyid=' . $apikey . '&format=' . $format . '&pref=' . $pref . '&hit_per_page=' . $hit_per_page.'&offset_page=' . $[前回のレスポンスで取得したpage_offsetの値に1を加えたもの];

    レスポンスのxmlの解析については質問を再投稿したほうがいいですよ。
    タイトルも「ぐるなびapiで根本的に分からないこと」みたいなのではなく「xmlの解析の仕方がわからない」とかにしたほうがいいですよ。たぶん、調べてから投稿しろと言われると思いますけどね。

    キャンセル

  • 2016/06/30 00:17

    ご回答ありがとうございます。

    キャンセル

  • 2016/06/30 00:41

    疑問が一つあります。
    これはあなたへの最後の質問にしたいです。
    .'&offset_page=' . $[前回のレスポンスで取得したpage_offsetの値に1を加えたもの];のところです。
    このコードはどこに書けばいいですか?

    キャンセル

  • 2016/06/30 00:45

    あなたの作りたいアプリケーションによります。回答のしようがありません。
    あなたのアプリケーションなので自分で考えましょうね。

    キャンセル

  • 2016/06/30 14:59

    質問を変えます。
    .'&offset_page=' . $[前回のレスポンスで取得したpage_offsetの値に1を加えたもの];はそのまま.'&offset_page=' . $[前回のレスポンスで取得したpage_offsetの値に1を加えたもの];と書くのですか?

    キャンセル

checkベストアンサー

+2

そもそもの話、こういったAPIはデータを根こそぎ取得するような使い方を想定していません。
Google検索で「日本」と検索すると約 952,000,000 件のページがHITするそうですが
そのすべてを取得したいといった要望はまれでしょうし、要求されてもデータ量が膨大で非常にリソースを消費してしまいます。
「茨城県」の店舗すべてはそれこそ膨大な数でしょうから、一気にすべてを得ようという処理は非現実的ですし、API側も拒否すると思います。

尚、皆さんおっしゃっている「繰り返し取得」というのは
例えば条件なしで実行すると557094件あるようですが、これをすべて取得したいというなら、下の例のように1回20件取得するコールをoffsetをずらしながら27855件送って結果を合体させればできるということだと思います。
ただこんな膨大なリクエストを短期間に実行すると迷惑アクセスと認識されるのではないかと思います。

offset=1&hit_per_page=20 //1-20の店舗情報を取得
offset=21&hit_per_page=20 //21-40の店舗情報を取得
offset=41&hit_per_page=20 //41-60の店舗情報を取得
・・・・・・
offset=557080&hit_per_page=20 //557080-557094の店舗情報を取得

1001件~1020件のデータがほしいなら「offset=1001&hit_per_page=20」とすればいいのであって、1020件分のデータを取得する必要はありません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/27 18:59

    ご回答ありがとうございます。
    分かりやすい説明、ありがとうございます。
    一つ聞きたいことがあります。
    offset=1001&hit_per_page=20と書いてありますが、1ページ1ページの店舗を見たいのですが、どうすれば見れますか?

    キャンセル

  • 2016/06/27 21:03 編集

    20件ではなくて1件だけ抽出したいのでしょうか?
    offset=1001&hit_per_page=1 それならこれで、1001番目の店舗情報だけがリターンされると思います。(デフォルトだと10件取得するところを1件だけ取得するように変更したものです。)
    またWebサイトなどで、次へボタンで次の店舗を表示したいって場合は、その次へボタンのリンクに次のようなクエリを仕込んでおけばよろしいかと
    offset=(現在の番号+1)&hit_per_page=1 

    http://api.gnavi.co.jp/api/manual/
    こちらにテストツールもあり、いろいろ設定して結果が見られるようですので試してみては?

    キャンセル

  • 2016/06/28 16:01

    質問遅れました。
    全ての店舗を出力したいんです。つまり、全ての店舗を取得するため、上記のコード以外のコードで書きたいんです。
    僕の説明不足で分かりにくくてすみません。

    キャンセル

  • 2016/06/28 16:22

    > 全ての店舗を取得するため、上記のコード以外のコードで書きたいんです。
    どんな条件で絞り込んで結果が何件くらいなのを想定しているかわかりませんが、HITする店舗が一定数以上の場合は、小分けに繰り返し取得する以外の方法では無理です。
    hit_per_pageの上限はわかりませんが、1000だとすでにエラーになります。
    つまりHITする店舗が1000を越えるなら、1回のcallですべて取得するのは無理ということです。(API側で制限しているはずです。)

    キャンセル

  • 2016/06/28 16:27 編集

    もしかして、「HIT数は少ないけど10になるか20になるかわからないが件数は少ない。ただhit_per_pageは幾つに設定すればいいのだろう?」みたいな質問でしょうか?
    その場合は多めにしておけばいいと思います。
    入力した条件でHITする店舗が10件しかなくても、hit_per_page=100でエラーにはなりらずに、10件取得されます

    キャンセル

  • 2016/06/28 16:49

    ご回答ありがとうございます。
    HITする店舗が一定数以上の場合は、小分けに繰り返し取得する以外の方法では無理なんですね。というと上記のコードで書くしかないんですね。

    キャンセル

  • 2016/06/28 16:50

    「「HIT数は少ないけど10になるか20になるかわからないが件数は少ない。ただhit_per_pageは幾つに設定すればいいのだろう?」みたいな質問でしょうか?」ではありません。
    茨城県の全ての店舗を入手することがしたかったんです。

    キャンセル

  • 2016/06/28 17:01

    あと恥ずかしい話なんですが、実はレスポンスのtotal_hit_count、hit_per_page、page_offsetの出力の仕方がわからないんです。
    xmlを使っており、レスポンスパラメータの書き方は、
    $xml = simplexml_load_file( $url );
    if(!$xml->rest){
    echo '見つかりませんでした';
    } else {
    foreach($xml->rest as $key){
    というやり方で出力しています。

    キャンセル

  • 2016/06/28 17:14 編集

    xmlオブジェクトの参照と展開のやり方がわからないということですよね?
    この質問の内容とは変わってきますしコメント欄は表現できる要素も少ないので新たに質問を建てられるほうがよろしいのではないかと思います。

    私もXMLの展開はあまり触ったことが無いので間違っているかも知れませんが、レスポンスデータを見た感じ「response」の参照が抜けてるように思います。(rootは無視できるのでしょうか?)
    if(is_array($xml->response->rest ))foreach($xml->response->rest as $key){echo $key->name;}こんな感じかも?(店舗名だけ出力される予定)

    キャンセル

  • 2016/06/28 17:58

    すみません、responseを書くと出力できなくなります。
    もう一度チャレンジしています。

    キャンセル

  • 2016/06/30 01:05

    すみません、質問があります。
    offset=(現在の番号+1)&hit_per_page=1とありますが、実際書くときは
    $offset=($offset_page+1)&$hit_per_page=1と書くんですよね?

    キャンセル

  • 2016/06/30 07:40

    実際書くとは何処に書くときでしょう?
    APIのURLは「http://api.gnavi.co.jp/RestSearchAPI/20150630/?keyid=id&format=xml&hit_per_page=20&offset=1」こんな風になるのだから、すごく単純に書くならこうでしょうか?「$url="http://api.gnavi.co.jp/RestSearchAPI/".$day."/?keyid=".$id."&format=xml&hit_per_page=".$hit_per_page."&offset=".$offset」(パラメータは動的に作成されるだろうから実際はこんなコードにすると保守性が悪いとは思いますけど)

    キャンセル

  • 2016/06/30 11:16

    すみません、説明不足で。

    Webサイトなどで、次へボタンで次の店舗を表示したいって場合は、その次へボタンのリンクにクエリを仕込みたいのですが、
    offset=(現在の番号+1)&hit_per_page=1 
    というコードは何処に書けばいいんですか?

    キャンセル

  • 2016/06/30 11:17

    また、コードを書くとき'現在の番号'って書くのですか?

    キャンセル

  • 2016/06/30 12:13

    Webサイトで、次へボタンで次の店舗を表示したいです。

    キャンセル

  • 2016/06/30 15:13

    これはもうすでにAPIが解らないのでは無くて、PHPでのページ作成手法が良くわからないのではないかと思います。一応回答しますが、ここでの記述は窮屈ですのでこれで最後とさせてください。

    まずすみません、(現在の番号+1)これは間違いで、(現在の番号+一度に取得するページ数)が正しいですね。
    それでphpでページを作成する際に、そのときのoffsetの数値はphp側で把握しているはずです。(初回はありませんが1です。)
    $offset=1;
    if($next_offset)$offset=$next_offset;
    $url="http://api.gnavi.co.jp/RestSearchAPI/".$day."/?keyid=".$id."&format=xml&hit_per_page=".$hit_per_page."&offset=".$offset;
    $xml = simplexml_load_file( $url );
    //表示処理・・・
    $next_offset = $offset + $hit_per_page;
    実際こんなコードにはしないと思いますが、手っ取り早く動作確認するならこんな感じで、次へボタンでは$next_offsetをgetなりpostなりでphpに渡せばいいのではないでしょうか?

    キャンセル

+1

total_hit_count で、全部で何件あったのか分かります。

普通は、例えば1万件もあった場合全部来られてもこまりますから、
10件だけ表示して、次のページ分を取得したいとなったら、
offsetで11件目と指定して、また10件取得を total_hit_countを超えないまで、
好きなだけ繰り返すわけです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/27 18:11

    レスポンスのtotal_hit_count、hit_per_page、page_offsetで質問があります。
    どうすれば出力すればいいですか?
    他のレスポンスを出力する方法はわかります。
    しかし、上記3つのコードの出力方法はわかりません。

    キャンセル

  • 2016/06/27 18:13

    ちなみにxmlを使っており、レスポンスパラメータの書き方は

    $xml = simplexml_load_file( $url );
    if(!$xml->rest){
    echo '見つかりませんでした';
    } else {
    foreach($xml->rest as $key){
    というやり方で出力しました。

    キャンセル

  • 2016/06/29 22:09

    すみません、レスポンスの使い方が少し分からないところがあります。

    キャンセル

  • 2016/06/30 09:42

    APIつかったプログラムサンプルが、ネットで探せばあるかと思いますので、まずそういうの見て 改めてそれでもわからなかったことだけ質問するのが良いかと思います。全部分からないので全部教えてでは、丸投げと変わりません。自分で理解するのが目的にないのであればお金払って作ってもらったらどうでしょう。

    キャンセル

  • 2016/06/30 16:49

    ぐるなびapiを調べてもレスポンスのtotal_hit_count、hit_per_page、page_offsetが載っていないサンプルコードが多いので、分からなかったんです。
    すみません。

    キャンセル

+1

http://api.gnavi.co.jp/api/manual/restsearch/ に書かれています。

レスポンスに
total_hit_count  該当件数
hit_per_page  表示件数
page_offset   表示ページ
が、あります。

一回目の検索で、表示件数と検索条件に該当した件数が分かりますので、あとは、検索条件と検索開始位置を指定して、検索を繰り返せば、全件取得できると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/27 17:51

    ご回答ありがとうございます。
    検索を繰り返すってどういう意味ですか?

    キャンセル

+1

アプリケーションの仕様が分かりませんが、情報を入手し、それをDBに貯め、ユーザのリクエスト毎にDB検索結果を表示しようとしていませんか?
そうでない場合は、上限を決めないでAPIを叩く必要はなく、リクエスト毎にAPIを叩く方針になると思います。

API利用ルール

その場合、利用ルールに抵触する可能性が高いです。
もしDBに貯めこむ設計にしているのであれば、設計を見なおされてはいかがですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/28 16:05

    質問遅れました。
    「情報を入手し、それをDBに貯め、ユーザのリクエスト毎にDB検索結果を表示しようとしていませんか?」と回答されていますが、今の所そういう方法は使っていません。しかしDBを使った方法を考えていないことはありません。DBに貯め込む設定でわからないことがあります。それはDBに溜め込む設定にはどういうデメリットとメリットがあるのですか?

    キャンセル

  • 2016/06/28 17:20

    リクエスト毎にAPIを叩くのであれば、最新情報の表示に関して、良い例として記載されている通りの使用方法なので、利用ルールの違反を犯すことは無いと思います。

    キャンセル

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

  • PHP

    24459questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • API

    1852questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。