I\'m in a Google Chrome extension with permissions for \"*://*/*\"
and I\'m trying to make the switch from XMLHttpRequest to the Fetch API.
The extensio
Fetch does not show headers while debugging or if you console.log
response.
You have to use following way to access headers.
response.headers.get('x-auth-token')
From MDN
You can also get all the headers by accessing the entries Iterator.
// Display the key/value pairs
for (var pair of res.headers.entries()) {
console.log(pair[0]+ ': '+ pair[1]);
}
Also, keep in mind this part:
For security reasons, some headers can only be controlled by the user agent. These headers include the forbidden header names and forbidden response header names.
For us to fix this restriction issue, adding exposed header names is good enough.
access-control-expose-headers: headername1, headername2, ...
After setting this header, the client side script is able to read those headers (headername1, headername2, ...) from the response.
There is a restriction to access response headers when you are using Fetch API over CORS. Due to this restriction, you can access only following standard headers:
Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
When you are writing code for Google Chrome extension, you are using CORS, hence you can't access all headers. If you control the server, you can return custom information in the response body
instead of headers
More info on this restriction - https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types
Also remember you may need to pass the response to next .then()
after res.headers.get()
if you parse it. I keep forgetting about that...
var link
const loop = () => {
fetch(options)
.then(res => {
link = res.headers.get('link')
return res.json()
})
.then(body => {
for (let e of body.stuff) console.log(e)
if (link) setTimeout(loop, 100)
})
.catch(e => {
throw Error(e)
})
}
loop()
For backward compatibility with browsers that do not support ES2015 iterators (and probably also need fetch/Promise polyfills), the Headers.forEach function is the best option:
r.headers.forEach(function(value, name) {
console.log(name + ": " + value);
});
Tested in IE11 with Bluebird as Promise polyfill and whatwg-fetch as fetch polyfill. Headers.entries(), Headers.keys() and Headers.values() does not work.