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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

API

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

Q&A

解決済

5回答

5014閲覧

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

uverworld101nm

総合スコア172

PHP

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

API

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

0グッド

2クリップ

投稿2016/06/27 08:31

編集2016/07/01 09:01

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

PHP

1$pref='PREF◯◯◯'

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

PHP

1hit_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){
というやり方で出力しています

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

投稿2016/06/27 08:41

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/06/27 09:17

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

2016/06/27 09:28

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

2016/06/27 09:48

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

2016/06/27 10:00

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

2016/06/27 10:39

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

2016/06/27 10:42

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

2016/06/27 10:53

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

2016/06/28 06: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){ というやり方で出力しています。
uverworld101nm

2016/06/29 13:09

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

2016/06/29 13:45

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

2016/06/29 14:22

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

2016/06/29 14:22

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

2016/06/29 14:36

リクエストも送れていないじゃないですか。 もう一度ぐるなびのサンプルを見てください。 リクエストの送り方もレスポンスの解析の仕方もサンプルにあるじゃないですか。 あなたが「提示したといっているコード」はとてもじゃないですがコードとは言えません。サンプルのコードをどう改造したかを質問に追記してください。
uverworld101nm

2016/06/29 14:44

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

2016/06/29 14:46

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

2016/06/29 14:49

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

2016/06/29 14:50

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

2016/06/29 14:50

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

2016/06/29 14:52 編集

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

2016/06/29 15: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の解析の仕方がわからない」とかにしたほうがいいですよ。たぶん、調べてから投稿しろと言われると思いますけどね。
uverworld101nm

2016/06/29 15:17

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

2016/06/29 15:41

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

2016/06/29 15:45

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

2016/06/30 05:59

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

0

ベストアンサー

そもそもの話、こういった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 09:51

編集2016/06/27 09:54
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/06/27 09:59

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

2016/06/27 12:07 編集

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/ こちらにテストツールもあり、いろいろ設定して結果が見られるようですので試してみては?
uverworld101nm

2016/06/28 07:01

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

2016/06/28 07:22

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

2016/06/28 07:30 編集

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

2016/06/28 07:49

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

2016/06/28 07:50

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

2016/06/28 08: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){ というやり方で出力しています。
hirohiro

2016/06/28 08:19 編集

xmlオブジェクトの参照と展開のやり方がわからないということですよね? この質問の内容とは変わってきますしコメント欄は表現できる要素も少ないので新たに質問を建てられるほうがよろしいのではないかと思います。 私もXMLの展開はあまり触ったことが無いので間違っているかも知れませんが、レスポンスデータを見た感じ「response」の参照が抜けてるように思います。(rootは無視できるのでしょうか?) if(is_array($xml->response->rest ))foreach($xml->response->rest as $key){echo $key->name;}こんな感じかも?(店舗名だけ出力される予定)
uverworld101nm

2016/06/28 08:58

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

2016/06/29 16:05

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

2016/06/29 22: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」(パラメータは動的に作成されるだろうから実際はこんなコードにすると保守性が悪いとは思いますけど)
uverworld101nm

2016/06/30 02:16

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

2016/06/30 02:17

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

2016/06/30 03:13

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

2016/06/30 06: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に渡せばいいのではないでしょうか?
guest

0

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

API利用ルール

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

投稿2016/06/27 12:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/06/28 07:05

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

退会済みユーザー

2016/06/28 08:20

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

0

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

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

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

投稿2016/06/27 08:45

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/06/27 08:51

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

0

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

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

投稿2016/06/27 08:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/06/27 09:11

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

2016/06/27 09:13

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

2016/06/29 13:09

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

退会済みユーザー

2016/06/30 00:42

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

2016/06/30 07:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問