Rakuten RapidAPIのSkyscanner Flight Searchで、unirestを使うとundefinedが返る問題

2019-09-03

https://www.skyscanner.com/sttc/blackbird/opengraph_solid.png

Rakuten RapidAPIのSkyscanner Flight Searchを使って、航空券の価格情報を取得しようとしていたのですが、うまくいきませんでした。

request.bodyだけundefined

今回は複数あるエンドポイントのうち、指定した航路の航空券の最安値を検索するBrowse Quotesを使用しました。

公式ドキュメントでは、unirestライブラリを使ったコードスニペットが公開されているのですが、何度やってもデータを取得できず、undefinedになってしまいます。

unirest.get("https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/browsequotes/v1.0/US/USD/en-US/SFO-sky/JFK-sky/2019-09-01?inboundpartialdate=2019-12-01")
.header("X-RapidAPI-Host", "skyscanner-skyscanner-flight-search-v1.p.rapidapi.com")
.header("X-RapidAPI-Key", "【APIキー】")
.end(function (result) {
  console.log(result.status, result.headers, result.body);
});

stack overflowで似たような投稿を発見

ググるとstack overflowで同じ問題についての投稿がありました。

The API response is in json and the Response Header is being output, but the Response Body is supposed to give me an object with webcams, but instead it shows as “undefined”.

https://stackoverflow.com/questions/53821723/rapidapi-response-body-shows-as-undefined

その後、投稿者自身の回答が追加されていました。

Following up because I got interest—I eventually solved this issue when I encountered it with Imgur’s API by using the Fetch API instead of Unirest. There seems to be some issue with RapidAPI and Unirest, but when I contacted support they were unaware of any issues.
I recommend trying fetch() if you’re still encountering this.

https://stackoverflow.com/a/55938532/11876397

Unirestではなく、通常のfetchを使えば動いたとのこと。さっそくやってみました。

fetchを使うと動いた

fetch(`https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/browsequotes/v1.0/US/USD/en-US/YVR/HND/2019-10-01`, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        'X-RapidAPI-Host': 'skyscanner-skyscanner-flight-search-v1.p.rapidapi.com',
        'X-RapidAPI-Key': '【APIキー】'
      }
    })
      .then(res => res.json())
      .then(data => {
        console.log(data);
      })
      .catch(error => {
        console.log(error)
      });

このように通常のfetchで書き直してみました。

やったー。無事取得できました。