发送自定义 User-Agent 字符串以及我的 headers(获取)

Sending a custom User-Agent string along with my headers (fetch)

我在 React 中使用 fetch API,我正在从 JSON 端点提取一些数据。

作为我请求的一部分,我想发送自定义 User-Agent 字符串。目前,当我检查我的请求时,UA 字符串是:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

因为我在 headers 中传递每个请求,我想我只是将 User-Agent 附加到 headers object,就像它在 various places在线:

fetch(url, {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    'User-Agent': 'MY-UA-STRING' // <---
})

但这行不通。据报道 here and here and here.

,我感觉这是因为提取 api 中的错误

有人知道如何使用 fetch 作为 headers 的一部分传递 UA 吗?

经过一些测试,Chrome 确实存在 User-Agent header 的错误。

这很可能是因为 User-Agent header 不久前(2015 年年中)在不允许的 header 列表中。

由于这个特定的 header 最近已从不允许的 header 列表中删除,因此 Firefox(从版本 43 开始)将允许您在获取调用中更改 User-Agent,但是Chrome 不会。

这是Firefox bug, and the Chromium bug

它最初被禁止的原因是,确实没有充分的理由使用 User-Agent header 发送任意数据,它应该用于发送实际的 User-Agent,和 in-browser 像 Fetch of XMLHttpRequest 这样的请求应该真的没有充分的理由去欺骗用户代理。

这个错误何时会在 Chrome 中被修复是任何人的猜测,但它确实是一个错误,因为不允许的 header 列表不再列出 User-Agent header,并且在 Fetch.

的选项 object 中指定时应该更改

作为旁注,您通常应该使用 headers

下的 Headers Interface, and include them in the options objects 创建 header
let headers = new Headers({
    "Accept"       : "application/json",
    "Content-Type" : "application/json",
    "User-Agent"   : "MY-UA-STRING"
});

fetch(url, {
    method  : 'GET', 
    headers : headers 
    // ... etc
}).then( ...