ぐるなびAPI

ぐるなびAPIのバージョンアップ仕様変更対応

このブログでは、レストランの情報をぐるなびWeb ServiceのぐるなびAPIを使って取得して記事に表示させる方法について書いています

記事を見たときの最新の情報をとってくるように、記事内に埋め込む場合には、そのお店の情報をとってくるショートコードを埋め込んでおり、飲食店の情報+口コミを表示させるページは、phpでぐるなびAPIを呼び出して、ページ生成しています

ぐるなびAPIには2018年秋に仕様変更がありました

仕様変更前まで、ぐるなびAPIで情報を取得する際には、XMLを使っていたのですが、今後XMLはサポート外になり、JSONでの取得になるという仕様変更になっています

ぐるなびAPIバージョンアップのお知らせ

ぐるなびWEBサービスからお知らせが届きました

ぐるなびAPIが、バージョンアップで仕様変更になり、対応が必要になりました

旧バージョンのAPIは、2019年9月3日まで提供されるので、まだ1年は今のAPIが使えるのですが、そうそうに対応しておきます

ぐるなびAPIの仕様変更

まず、APIのURLが変わります

レストラン検索APIの変更例

[変更前]https://api.gnavi.co.jp/RestSearchAPI/20150630/
[変更後]https://api.gnavi.co.jp/RestSearchAPI/v3/

この仕様変更に対しては、URLを変えればいいだけですね

 

そしてメインの仕様変更内容はこちらです

APIの中身の主な仕様変更

・XMLでのレスポンス提供がなくなり、JSONのみになり、フォーマットを指定するformatパラメータが無くなる
・httpによるリクエスト受付を終了し、https://となる

細かい内容は他にも書いてありますが、主な対処が必要な仕様変更はこれらだと思います

 

httpについての仕様変更に対しては、httpsでリクエストしていれば、そのままでいいってことですね

であれば、リクエストのURLをv3に変えて、formatを削除するだけでよさそうです

Javascriptは使っていないです

対応が必要な問題は、XMLがなくなるほうです

今までは、XMLで取得してXMLファイルをパースして使っていましたので、こちらは変更が必要になります

JSONに対応しないとならないです

ぐるなびAPIの仕様変更 JSON形式ファイルへの対応

XMLで取得していたファイルをJSONに変更します

ぐるなびAPIのURLから、file_get_content()でファイルを読み込み、simplexml_load_string()で配列にして、$xmlに格納していました

JSONに変わっても、ぐるなびAPIのURLから、file_get_content()で読み込むのはいっしょですね

file_get_content()で読み込んだ後、json_decode()で配列にして、$jsonに格納します

ぐるなびAPI仕様変更 URL変えて、JSONに対応だけではうまくいかず

ちょっとしたコーディングミスもありましたが、URL変更とJSONファイル読み込みの対応を行ってテストしてみたのですが、レスポンスがエラーになってうまくいきませんでした

パラメータのsortが設定した値がないというエラーと、店舗IDがおかしいというエラーになっていました

今までの旧バージョンのAPIでは、フリーワード検索するときに、sortにもidにも0を入れていて通っていたのですが、これらが通らなくなったようですみたい

確かにAPI仕様上は、sortはディフォルトのソート順の場合は設定しない、あるいは1か2でソート順を指定することになっていて、店舗IDは特に何も記載がなかったのですが、旧バージョンではsort=0にしていても、店舗IDが無効値でもフリーワード検索ができていました

sort順はもともと使用していなかったので、パラメータから削除することでよいのですが、店舗IDがフリーワード検索の場合は指定せず、店舗IDで検索する場合は指定するというように場合分けしないとなりません

そこで、sortパラメータは削除し、フリーワード検索の場合と、店舗IDの検索の場合とで、呼び出す関数を切り替えるようにして対応してみたところ、無事検索できるようになりました

ぐるなびAPI仕様変更対応

新バージョンのAPIを呼び出すことと、JSONをパースするように対応した、新バージョン用の関数をfunction.phpに追加して、フリーワード検索と店舗ID検索で呼び出し関数を切り替えるように、ぐるなびAPI関数を呼び出す側のphpを変更

テスト用のphpにして、試すところまでで、ブログに経過を残しながら、朝の2時間かからないぐらいの対応時間でした

ですが、さらに一筋縄ではいかないところがありました

多言語レストラン検索APIでのスペース

 

多言語レストラン検索APIではスペースを入れると検索結果が得られない場合がありました

例えば「横浜 中華街」で多言語レストラン検索APIで検索すると、検索結果が得られません

存在しないという検索結果になるようです

旧バージョンでは検索できていましたが、新バージョンのV3にするとできないです

テストツールで検索してみてもだめなので、多言語APIではだめみたいです

日本語だけのレストラン検索APIを使うと、「横浜 中華街」でも検索できます

多言語レストラン検索APIの不具合でしょうか?

しょうがないから、レストラン検索APIを使うように変更します

当初、多言語で検索しようと思っていたのですが、いまのところ日本語でしか検索していません

でも、多言語レストランAPIと日本語だけのレストランAPIではけっこうパラメータが異なります

面倒ですが、パラメータの違いの対応を行わなければなりません

同様の店舗の情報であるのに、2つのAPIで、パラメータの名称も、配列の形も、パラメータの存在有無もかなり違います

同じようなものなのだから、統一しておいてくれればいいのですがだいぶ違うので面倒です

なんだかんだで、この対応でさらに2時間ぐらい食ってしまいまいました

応援口コミ検索APIのレスポンスが変わっている

応援口コミ・写真を取得するAPIのレスポンスが、旧バージョンのXMLの場合とか、レストラン検索APIとかとはちょっと違っていました

もともと旧バージョンのJSON形式でも同様のようですが、配列への格納処理に変更が必要でした

レストラン検索APIなどのレスポンスのレストラン情報のリストは下記のようになっていました

“rest”:[
{
},
{
}
]

しかし、応援口コミAPIの新バージョンは、こうです

“0”:{
“photo”:{
}
},
“1”:{
“photo”:{
}
}

“0”、”1″があって、その下層に”photo”がある

XMLではこうなってはいませんでしたし、レストラン検索APIとも違う

XMLやレストラン検索APIでやっていた今までの処理の方法のままでは、photo以下のデータを取り出すことができないので変更が必要になってます

応援口コミ検索APIのレスポンスへの対応

さらに2時間ほどかかって、応援口コミAPIへの対応ができました

まず、応援口コミAPIは、キーがひとつ余計に入っていたので対応

“response”:(
“0”:{
“photo”:{
}
},
“1”:{
“photo”:{
}
}
}

こういった形でトップにresponseが入っていました

確かにAPI仕様にはトップにResponseというのがありますが、レストラン検索APIの場合はAPI仕様に書いてあっても入っていませんでしたし、旧バージョンでXMLで取っていたときにもありませんでしたが、応援口コミAPIのJSONには入っていました

例えば、total_hit_countの値は、$jsonにJSONファイルを取り込んだ後、レストラン検索APIでは、

$json->total_hit_count

とすれば取り出せるのですが、応援口コミAPIでは

$json->response->total_hit_count

としないとなりません

これは、レスポンス仕様を見ているだけではわからず、JSONファイルを直に見ていてわかったことです

 

“0”,”1″のほうは、$nの値をforループで回してカウントアップして

$json->response->$n->photo

とすることで、photoの配列の中身を取り出すことができました

$photo=$json->response->$n->photo;

としてやることで、$photo-> で中身を取り出していくことができます

これで、なんとか応援口コミの写真などの情報も表示させることができるようになりました

API仕様が明記されていても、APIごとに微妙にJSONファイルの中身が違っていて、JSONファイルを出力してみて、どうなっているか確認して対応しないとなりませんでした

仕様の実現方法があいまいなところがあるのですね

間違い探し能力を試されているのかな

APIごとに対応の仕方が違うというのは、仕様書と仕様の実現方法が不完全、微妙に適当ですね

バージョンにより、店舗IDの無効値への対応やフリーワードでのスペースの扱い方に差があるのも微妙な変更です

いまどきのWEBサービスの仕様というのはこんなもんなのでしょうか

ぐるなびWEBサービスで検索できるお店が増えたのかな?

9月になって、ぐるなびWEBサービスのレスポンスからXMLが対象外になり、JSONのみになるというので対応したり、記事を追加修正したりしていて気づいたのですが、ぐるなびWEBサービスで検索できるお店がひろがったような気がします

以前は、ネット予約できるようなお店に限られていて、基本情報とか口コミはあるけれどもネット予約の対象にはなっていないようなお店は、WEBAPIで検索しても出てきませんでした

出てこないので、そういうお店はGoogleMapApiのGoogle Place Apiを使って情報をとってくるようにしていたのですが、最近同じお店をぐるなびのWEBAPIで検索すると、検索されるようになっています

ネット予約できるようなお店に比べると、料金情報が出てきていなかったり、写真がなかったりなど、情報に抜けはあるようなのですが一応検索結果に出てくるようになってます

また、ぐるなびには、お店の情報をブログに貼るという機能があるのですね

ぐるなびのお店の基本情報のページから、ブログに貼るタグを入手することができます

ぐるなびアフィリエイトを使うタグと、アフィリエイトを使わないタグがあり、また、タグをブログに貼るとお店のブログ紹介ページに掲載されるというお店もある(ただし、httpsのページは掲載されないという記載があるから、このブログはだめです)

以前記事を書いて、ぐるなびWEBAPIでお店の情報がとってこれなくて、GooglePlaceを使ったお店の記事をぐるなびを使うように、おいおいメンテしようかなと思います

ぐるなびにリンクしたほうが、周囲や関連のお店も見れていいかなと思うのですが、以前検索できなかったようなお店は、お店によっては写真も口コミもGoogleのほうが多いこともあるので、よしあしはあるのですが