Slack incoming webhook: Content-type поля заголовка запроса не разрешен Access-Control-Allow-Headers в предполетном ответе
Я пытаюсь отправить слабое сообщение через fetch API в браузере:
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.
Что делать?
2 ответа:
Эта конечная точка Slack API, к сожалению, кажется нарушенной в обработке запросов кросс-происхождения из кода JavaScript frontend-в том, что она не обрабатывает запрос CORS preflight
OPTIONS
, как это должно быть, поэтому единственным решением, по-видимому, является опустить ЗаголовокContent-Type
.Таким образом, похоже, что вам нужно удалить следующее из
headers
части вашего кода запроса:'Content-type': 'application/json'
Эта часть
'Content-type': 'application/json'
запускает ваш браузер для выполнения запроса CORS preflightOPTIONS
. Итак, для вашего браузер чтобы разрешить вашему интерфейсному JavaScript-коду отправлять запросPOST
, который вы пытаетесь выполнить, конечная точка APIhttps://hooks.slack.com/services
должна возвращать заголовок ответаAccess-Control-Allow-Headers
, содержащийContent-Type
в своем значении.Но эта конечная точка не возвращает этот заголовок, поэтому предварительный полет завершается неудачей, и браузер останавливается прямо там.
Обычно при отправке из frontend JavaScript в конечную точку API, которая ожидает JSON, добавление заголовка
Content-Type: application/json
в запрос-это именно то, что вам нужно и должно быть сделано. Но не в данном случае-потому что эта конкретная конечная точка API не обрабатывает ее должным образом.
Я использую
axios
и имел аналогичную проблему. То, что сработало для меня, - это установка заголовкаContent-Type
вapplication/x-www-form-urlencoded
. нашел его в этой теме: https://github.com/axios/axios/issues/475 Похоже, что это запускает "простой запрос" и поэтому избегает запуска CORS preflight. https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requestsHTH.