无法从前端 JavaScript 访问 cross-origin 响应 header
Can’t access cross-origin response header from frontend JavaScript
我正在使用 ReactJS 和 create-react-app.
构建一个简单的网络应用程序
我在 Heroku 上设置了一个后端 API,我可以在其中发出 POST 请求。一切正常,除了:
当我使用 fetch API 发出 POST 请求时,响应是 100% 正确的,但它只给了我 2 个标准 header。我想得到我的自定义 header。我在我的回复中添加了 expose header,这里是情节转折:当我从 Chrome Inspection Tool 或 Postman(API 工具查看 headers 时), 它显示了所有的 headers,包括我自定义的。 这是我正在使用的获取代码 -
fetch(theUrl, {
method: 'POST',
body: JSON.stringify({
"placeholder": "placeholder"
})
})
.then(function(res) {
console.log(res.headers.get('CUSTOM_HEADER_NAME'));
})
如果有任何区别,这个 fetch 方法是从 ReactJS 组件的主要 body 之外的函数调用的。
自定义header的名称是Image-Identification-Path
,我的回复header中的header是Access-Control-Expose-Headers
for Image-Identification-Path
。
总结:如何使用 fetch 获取自定义 header?
您必须配置将请求发送到的服务器,使其响应具有 Access-Control-Expose-Headers
header,其中包含您自定义响应的名称 header。
否则,如果您的浏览器在 Access-Control-Expose-Headers
header 中看不到自定义 header 的名称,它不会让您访问自定义 header 的值=25=].
在这种情况下,如果您在 Postman 甚至浏览器开发工具中查看响应,预计您仍然能够看到自定义 header。
但仅仅因为浏览器在响应中获得自定义 header 并不意味着浏览器会将其公开给您的前端 JavaScript 代码。
对于 cross-origin 请求,如果 header 名称在 Access-Control-Expose-Headers
值中,浏览器只会将自定义响应 header 暴露给您的前端代码。
我知道这个问题很老,但我昨天 运行 解决了这个问题,给出的答案对我不起作用。
我找到的解决方案在这个article中给出。基本上:
You can’t directly access the headers on the response to a fetch call - you have to iterate through after using the entries() method on the headers.
因此,在您的特定情况下,您应该能够使用以下代码实现目标:
fetch(theUrl, {
method: 'POST',
body: JSON.stringify({
"placeholder": "placeholder"
})
})
.then(response => {
for (var pair of response.headers.entries()) { // accessing the entries
if (pair[0] === 'CUSTOM_HEADER_NAME') { // key you're looking for, in your case Image-Identification-Path
let imagePath = pair[1]; //// saving that value
}
}
.... })
我正在使用 ReactJS 和 create-react-app.
构建一个简单的网络应用程序我在 Heroku 上设置了一个后端 API,我可以在其中发出 POST 请求。一切正常,除了:
当我使用 fetch API 发出 POST 请求时,响应是 100% 正确的,但它只给了我 2 个标准 header。我想得到我的自定义 header。我在我的回复中添加了 expose header,这里是情节转折:当我从 Chrome Inspection Tool 或 Postman(API 工具查看 headers 时), 它显示了所有的 headers,包括我自定义的。 这是我正在使用的获取代码 -
fetch(theUrl, {
method: 'POST',
body: JSON.stringify({
"placeholder": "placeholder"
})
})
.then(function(res) {
console.log(res.headers.get('CUSTOM_HEADER_NAME'));
})
如果有任何区别,这个 fetch 方法是从 ReactJS 组件的主要 body 之外的函数调用的。
自定义header的名称是Image-Identification-Path
,我的回复header中的header是Access-Control-Expose-Headers
for Image-Identification-Path
。
总结:如何使用 fetch 获取自定义 header?
您必须配置将请求发送到的服务器,使其响应具有 Access-Control-Expose-Headers
header,其中包含您自定义响应的名称 header。
否则,如果您的浏览器在 Access-Control-Expose-Headers
header 中看不到自定义 header 的名称,它不会让您访问自定义 header 的值=25=].
在这种情况下,如果您在 Postman 甚至浏览器开发工具中查看响应,预计您仍然能够看到自定义 header。
但仅仅因为浏览器在响应中获得自定义 header 并不意味着浏览器会将其公开给您的前端 JavaScript 代码。
对于 cross-origin 请求,如果 header 名称在 Access-Control-Expose-Headers
值中,浏览器只会将自定义响应 header 暴露给您的前端代码。
我知道这个问题很老,但我昨天 运行 解决了这个问题,给出的答案对我不起作用。
我找到的解决方案在这个article中给出。基本上:
You can’t directly access the headers on the response to a fetch call - you have to iterate through after using the entries() method on the headers.
因此,在您的特定情况下,您应该能够使用以下代码实现目标:
fetch(theUrl, {
method: 'POST',
body: JSON.stringify({
"placeholder": "placeholder"
})
})
.then(response => {
for (var pair of response.headers.entries()) { // accessing the entries
if (pair[0] === 'CUSTOM_HEADER_NAME') { // key you're looking for, in your case Image-Identification-Path
let imagePath = pair[1]; //// saving that value
}
}
.... })