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

a53*_*416 10 javascript header http fetch reactjs

fetch在React中使用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
Run Code Online (Sandbox Code Playgroud)

由于我在每个请求的标题中都有用,我想我只是附加User-Agent到header对象,就像它在网上各个 地方所说:

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

但这不起作用.我有一种感觉,这是因为fetch api中存在一个错误,正如此处以及此处此处所报告的那样.

任何人都有关于如何通过UA作为headers使用的一部分的工作fetch

ade*_*neo 9

经过一些测试,Chrome确实存在User-Agent标头的错误.

这很可能是因为User-Agent标头不久前(2015年中)位于不允许的标头列表中.

由于最近从不允许的标题列表中删除了此特定标题,因此Firefox(来自版本43)将允许您在提取调用中更改用户代理,但Chrome不会.

这是Firefox的bugChromium的bug

它首先被禁止的原因是,没有充分的理由使用User-Agent标头发送任意数据,它应该用于发送实际的User-Agent,以及浏览器内请求,如Fetch of XMLHttpRequest应该真的没有理由欺骗用户代理.

当任何人猜测错误将在Chrome中修复时,但它确实是一个错误,因为不允许的标头列表不再列出User-Agent标头,并且它应该在Fetch的options对象中指定时更改.

作为旁注,您通常应该使用Headers接口创建标题,并将它们包含在键下的选项对象中headers

let headers = new Headers({
    "Accept"       : "application/json",
    "Content-Type" : "application/json",
    "User-Agent"   : "MY-UA-STRING"
});

fetch(url, {
    method  : 'GET', 
    headers : headers 
    // ... etc
}).then( ...
Run Code Online (Sandbox Code Playgroud)

  • Google Chrome 不愿纠正此错误可能是因为它会严重阻碍[浏览器指纹识别](https://coveryourtracks.eff.org);这恰好在广告行业中发挥着重要作用。其他涉及隐私问题的标头是“Referer”[原文如此]和[“Origin”](/sf/ask/2956775041/)。 (5认同)
  • 2023 年 7 月 18 日 - Firefox:可以设置自定义用户代理,Chrome:不能 (5认同)
  • 看起来不像是一个错误,因为这没有改变 (2认同)
  • 回复:“没有充分理由”段落,一些[免费](https://rxivist.org/docs#Preprints-Details)[API](https://github.com/CrossRef/rest-api-doc#etiquette )要求您设置“User-Agent”标头来说明您的应用程序和联系电子邮件是什么,以防止滥用。我不确定这是否是“User-Agent”的正确使用,因为它的意图可能是这些 API 的错误——但这是在 fetch 中设置“User-Agent”的合理理由我们的部分。 (2认同)