APIからデータを取得しようとしています。 APIはCORSサポートを有効にし、OPTIONSリクエストに以下の応答を返します。
Access-Control-Request-Headers:content-type
Access-Control-Allow-Origin:*
APIは、'Content-type'
以外の'application/json'
を許可しません。
この制限を使用して、React-Nativeのfetch
メソッドを使用してデータを取得しようとしています。
方法1(ノーコーズ):
{
method: 'POST',
mode: "no-cors",
headers: {
'content-type': 'application/json'
}
このメソッドを使用すると、ブラウザーはcontent-typeを「text/plain」として自動的に送信します。これは、CORSがデフォルトで3つのヘッダーのうち1つだけを許可しているためだと思います。ただし、サーバーはこのコンテンツタイプをサポートしていないため、サポートされていないコンテンツタイプに対してエラーを返します。
方法2(corsありまたはなし):
{
method: 'POST',
mode: "cors", // or without this line
redirect: 'follow',
headers: {
'content-type': 'application/json'
}
}
...
.then(response => console.log(response))
このシナリオでは、ChromeのF12ネットワークツールを使用して、サーバーがデータを返していることがわかります。サーバーへの最初の要求は、fetch
のOPTIONS
です。これに対して、サーバーは空のオブジェクトと上記のヘッダーセットを返します。次の呼び出しは実際のPOST API呼び出しで、サーバーはデータを含む適切なJSON応答で応答します。ただし、コードを介してコンソールに表示される応答は{}
。これは、reactのfetch
APIが実際のOPTIONS
呼び出しの代わりにPOST
呼び出しの応答を返すためだと思います。
OPTIONSリクエストのレスポンスを無視し、then
メソッドを取得して後続のリクエストのレスポンスを処理する方法はありますか?
あなたが当たっている当面の問題は、現在記述されているコードはレスポンスがJSONであることを期待しているが、レスポンスは実際にはJSONを取得するために処理する必要がある約束であるということです。
そのため、代わりに次のようなことを行う必要があります。
fetch("https://example.com")
.then(response => response.json())
.then(jsondata => console.log(jsondata))