リクルートWEBサービスでJSONを取得した場合のContent-Typeがなぜかapplication/jsonではなくtext/javascriptになっているという話です。
リクルートWEBサービスについて
リクルートWEBサービスはリクルートが提供しているWeb APIサービスです。
左上青色欄に記載されているAPIはおそらくリクルート内製のもので、リクエストやレスポンスの形がおおよそ統一されています。
レスポンスの形式にはXML,JSON,JSONPの3種類が選択ができます。
旅行検索やグルメ検索などのAPIが提供されており、
メールアドレスを登録してAPIキーを発行してもらうだけで誰でも簡単に利用できます。
左側灰色欄に記載されているAPIは少し勝手が違うようで、リクエストやレスポンスの形が少し異なります。
本記事では青色欄にあるAPIのレスポンスのContent-Typeを確認していきます。
XMLデータ取得
ここではRestlet Client - REST API TestingというChrome拡張機能を使って青色欄APIにリクエストを投げます。
デフォルトの戻り型がXMLなので、普通にリクエストを投げます。
APIキーは一応塗りつぶしています。
レスポンスのボディを見ると、XML形式で返ってきていることが分かります。
Content-Typeはapplication/xmlとなっています。
調べてみると、XMLのContent-TypeはRFC7303でapplication/xmlが推奨されているらしいです。
JSONデータ取得
続いてJSON形式の戻り値を取得します。
リクエストの末尾に&format=jsonを追加してJSON形式のレスポンスを要求します。
まずレスポンス右側のボディを見ると、なにやらJSONらしきデータが返ってきてはいるのですが、ごちゃごちゃとしていて見辛いです。Restlet Clientは通常JSONで返されたデータを整形して表示してくれるのですが、このデータはなぜか整形してくれていません。
レスポンス左側のContent-Typeを見てみると、「text/javascript」となっています。
調べてみると、JSONのContent-TypeはRFC4627で「application/json」と定められているようです。
つまり、Content-Typeが合っていないためにRestlet ClientがJSONとして認識できていないため整形が効いていないようです。
ちなみにリクルートWEBサービスの灰色欄にあるイベントサーチAPI(ATND BETA)なんかはJSONを要求した場合Content-Typeをapplication/jsonにして返してくれているようで、整形もちゃんと効いています。
JSONPデータ取得
最後に、リクエストの末尾を&format=jsonpにしてJSONP形式のレスポンスを要求します。
ボディにはJSONPらしきものが入っていて、Content-Typeはtext/javascriptとなっています。
調べてみると、JSONPはRFCではContent-Typeの規定が定められておらず、かつてちゃんと規定しようと動きがあったものの結局定まらないままtext/javascriptが巷で使われているという状態のようです。
なのでJSONPのContent-Typeに関しては正しくはないにせよ間違ってはいなさそうです。
整形してくれないのは単にRestlet Clientが対応していないだけでしょう。
まとめ
取得データ型とそのContent-Typeをまとめるとこうなります。
XML | JSON | JSONP | |
---|---|---|---|
リクルートWEBサービス(青) | application/xml | text/javascript | text/javascript |
RFC | application/xml | application/json | 規定なし |
Content-Typeが正しく設定されていないとアプリが想定通りの動作をしてくれないことがあるのでご注意を。