私はodata apiを使用しています。postmanを使用してGETリクエストを実行すると、完璧に動作し、期待どおりの応答が得られます。
しかし、私のReactアプリからのフェッチ要求を使用すると、その要求は、以前にPostmanで使用したものと同じヘッダーを使用して401をスローし、Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 401.
このリクエストを解決する方法について何か考えはありますか?ありがとう!
fetch('https://api4.successfactors.com/odata/v2/', {
method: 'GET',
headers: {
authorization: `Basic ${auth}`, //auth is the encoded base64 username:password
},
})
.then(response => response.json())
.then((response) => {
console.log('in response: ', response);
})
.catch((error) => {
console.log('in fetchJobs error: ', error);
});
これは、PostmanがおそらくOptions
の前にプリフライトGET
リクエストを送信しておらず、GET
応答の受信時にCORSチェック(それはとにかく本当に意味をなさないからです)。
一方、ウェブページからコードを実行する場合Chromeは、リモートサーバーへの送信が許可されているクロスドメインリクエストパラメータを確認するために、どちらもプリフライトOptions
を実行しています。 Options
reqへの応答に、Origin
(リクエスト元のページのドメイン)を承認するための適切なAccess-Control-Allow-Origin
ヘッダーが付いているかどうかを確認します。
通常、プリフライトOptions
はブラウザーによってサーバーに送信され、サーバーが実行しようとしている操作の実行を許可されているかどうかがサーバーに尋ねられます。この場合はGET
です。リモート(クロスドメイン)サーバーがOptions
を承認する応答の正しいヘッダーでprelight GET
要求に応答しない場合、ブラウザーはそれを送信しません。ただし、Options
リクエストへの応答自体がcors Origin
チェックに合格しないため、それほど遠くまで届きません。
サーバーを制御している場合は、Options
リクエストに応答するために、レスポンスのAccess-Control-Allow-Origin
ヘッダーを設定してOrigin
リクエストに応答する必要があります。また、 Access-Control-Allow-Methods
にはGET
を含めます(おそらくOPTIONS
)。リモートサーバーを制御しない場合は、ヒットしようとしているサービスなどの通常のAPIサービスのバックエンドに、Origin
を認証するためにどこかに設定できる構成がある可能性があります。
あなたはcorsの動作についてもっと読むことができます here
理想的な方法は、サーバーで別のドメインからの呼び出しを許可することですが、バックエンドへのアクセスとテストサービスがない場合は、このchromeプラグインをインストールして事前にバイパスできます-フライトリクエスト cors chrome extension
CORSの問題が発生しています。問題を回避するには、バックエンドでCORSを有効にする必要があります。