I try to post a slack message via the fetch API in a browser:
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);
};
I get the following error message:
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.
What to do?
Open the "Apps & Custom Integrations" page in the Slack menu, enter "Incoming WebHooks" in the search box of the page, and click on the "Incoming WebHooks" item displayed.
The unique webhook URL is secret. The webhook only accepts data, and thus alone cannot expose sensitive data to third parties.
Your webhook URL contains a secret. Don't share it online, including via public version control repositories. Slack actively searches out and revokes leaked secrets.
That Slack API endpoint unfortunately appears to be broken in its handling of cross-origin requests from frontend JavaScript code—in that it doesn’t handle the CORS preflight OPTIONS
request as it should—so the only solution seems to be to omit the Content-Type
header.
So it looks like you need to remove the following from the headers
part of your request code:
'Content-type': 'application/json'
That part triggers your browser to do a CORS preflight OPTIONS
request. So, for your browser to allow your frontend JavaScript code to send the POST
request you’re trying to do, the https://hooks.slack.com/services
API endpoint must return an Access-Control-Allow-Headers
response header that contains Content-Type
in its value.
But that endpoint doesn’t return that, so the preflight fails and the browser stops right there.
Normally when posting from frontend JavaScript to an API endpoint that expects JSON, adding that Content-Type: application/json
header to the request is exactly what you need to do and should do. But not in this case—because that API endpoint doesn’t handle it properly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With