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.