2016-03-27 10 views
4

window.fetch()を使用してサーバーからjsonを取得しようとしていますが、応答からデータを取得できません。 私はこのコードを持っている: - status and responsewindow.fetch()レスポンスからデータを取得するには?

> let url = 
> 'https://api.flightstats.com/flex/schedules/rest/v1/json/from/SYD/to/MEL/departing/2016/3/28?appId=f4b1b6c9&appKey=59bd8f0274f2ae88aebd2c1db7794f7f'; 
> let request = new Request (url, { 
>   method: 'GET', 
>   mode: 'no-cors' 
>  }); 
> 
> fetch(request) 
>   .then(function(response){ 
>    console.log(response) 
>   }); 

この要求が成功しているようだ、私はネットワーク]タブでJSONでステータス200 とレスポンスボディを参照してください。 ;私はあなたがFetch APIdocumentationを見てみた場合にconsole.log

+0

そのサイトがCORSをサポートしていないとあなたはAJAX呼び出しでクロス原点からデータを取得するためにCORSを必要とするようにそれは私には見えます。そのサイトはJSONPをサポートしていますので、そのメカニズムを使用できます。クロスオリジンサイトで特定のノーコアを使用すると、不透明な応答が返されます。つまり、実際のデータが返されるのを見ることはできません。アクセス権を修正する必要があります。このリクエストを 'cors'に設定すると、ここにcorsヘッダが存在しないことがわかります。ブラウザからJSONPを使用する必要があるように見えます。 – jfriend00

答えて

5

あなたがリクエストしているホストサイトはCORSをサポートしていません。そのため、fetch()を使用してクロスオリジンの要求を行い、データを戻すことはできません。 fetch()要求をmode: 'cors'に変更した場合、デバッグコンソールは、ホストサイトがCORSヘッダーを提供していないことを表示し、ブラウザが要求の結果を表示できるようにします。

mode: 'no-cors'を使用している場合、ブラウザーには結果が表示されないため(表示する権限がないため)、opaqueとタグ付けされた応答が表示されます。

api.flightstats.comサイトをちょっと調べてみると、CORSサポートの問題を回避してクロスオリジンのリクエストを正常に完了できるJSONPがサポートされていることがわかりました。

簡単にわかるように、私はjQueryを使用してJSONPリクエストができることを証明しました。ここにそのコードがあります。注意URLを/json/から/jsonp/に、具体的にはdataType: "jsonp"に変更しました。これにより、jQueryはcallback=xxxxxクエリパラメータを追加し、対応するスクリプト(JSONPメソッド)を介して応答を取得します。

var url = 
 
'https://api.flightstats.com/flex/schedules/rest/v1/jsonp/from/SYD/to/MEL/departing/2016/3/28?appId=f4b1b6c9&appKey=59bd8f0274f2ae88aebd2c1db7794f7f'; 
 

 
$.ajax(url, {dataType: "jsonp"}).then(function(response) { 
 
\t log(response); 
 
}, function(err) { 
 
    log("$.ajax() error:") 
 
\t log(err); 
 
})
<script src="http://files.the-friend-family.com/log.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

うん、jsonpがこの場合に働いている。ありがとうございました。 – Rielon

+0

@Rielon、純粋なJavaScript(jQueryなし)を使用したい場合は、https://github.com/robertodecurnex/J50Npi'J50Npi.getJSON(url、data、callback) 'を使用できます。 – Binyamin

4

でJSONを参照してくださいいけない理由を私は理解してカントconsole log image

- しかしconsole.logに、私はJSONオブジェクトを参照してくださいいけませんあなたはAPIがデータを抽出するための様々な方法を提供することに気づくでしょう:

  • arrayBuffer()
  • ブロブを()
  • JSON()
  • テキスト()
  • FORMDATA()

レスポンスが有効なJSON(これは表示されていないようですが)の場合、response.json()関数を使用してレスポンスデータを取得できます。これはまた、Fetch APIのものと同様にPromiseメカニズムを使用します。

response.json().then(function(data) { 
    console.log(data); 
}); 
+0

対象サイトがCORをサポートしていないように見えるので、OPはJSONPを使用してクロスオリジン要求を行う必要があります。 – jfriend00

関連する問題