ブラウザのフェッチAPIを介してSlackメッセージを投稿しようとしています。
fetch('https://hooks.slack.com/services/xxx/xxx/xx', {
method: 'post',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-type': 'application/json'
},
body: JSON.stringify({text: 'Hi there'})
})
.then(response => console.log)
.catch(error => console.error);
};
次のエラーメッセージが表示されます。
Fetch API cannot load:
https://hooks.slack.com/services/xxxxxxx/xxxxx.
Request header field Content-type is not allowed by Access-Control-Allow-Headers in preflight response.
何をすべきか?
残念ながら、そのSlack APIエンドポイントは、フロントエンドJavaScriptコードからのクロスオリジンリクエストの処理で壊れているように見えます。つまり、CORSプリフライトOPTIONS
リクエストを適切に処理しないため、唯一の解決策はContent-Type
ヘッダーを省略します。
したがって、リクエストコードのheaders
部分から以下を削除する必要があるようです。
'Content-type': 'application/json'
その'Content-type': 'application/json'
部分は、ブラウザに CORSプリフライトOPTIONS
リクエスト を実行するようにトリガーします。そのため、ブラウザでフロントエンドJavaScriptコードが実行しようとしているPOST
リクエストを送信できるようにするには、https://hooks.slack.com/services
APIエンドポイントが、値にAccess-Control-Allow-Headers
を含むContent-Type
応答ヘッダーを返す必要があります。
ただし、そのエンドポイントはそのヘッダーを返さないため、プリフライトは失敗し、ブラウザはそこで停止します。
通常、フロントエンドJavaScriptからJSONを期待するAPIエンドポイントに投稿する場合、そのContent-Type: application/json
ヘッダーをリクエストに追加することは、まさにあなたがしなければならないことであり、すべきことです。ただし、この場合はそうではありません。特定のAPIエンドポイントが適切に処理しないためです。
axios
を使用していますが、同様の問題が発生しました。私にとってうまくいったのは、Content-Type
ヘッダーをapplication/x-www-form-urlencoded
に設定することです。このスレッドで見つかりました: https://github.com/axios/axios/issues/475 これは「単純なリクエスト」をトリガーするため、CORSプリフライトのトリガーを回避するようです。 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests
HTH。