发送自定义用户代理字符串以及我的标头(获取)
Posted
技术标签:
【中文标题】发送自定义用户代理字符串以及我的标头(获取)【英文标题】:Sending a custom User-Agent string along with my headers (fetch) 【发布时间】:2017-08-06 12:09:12 【问题描述】:我在 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
因为我在每个请求中都输入了标头,所以我想我只需将 User-Agent
附加到标头对象中,就像它在 various places 在线中所说的那样:
fetch(url,
Accept: 'application/json',
'Content-Type': 'application/json',
'User-Agent': 'MY-UA-STRING' // <---
)
但这不起作用。据here 和here 和here 报告,我感觉这是因为fetch api 中的一个错误。
任何人都可以解决如何使用fetch
将UA 作为headers
的一部分传递?
【问题讨论】:
【参考方案1】:经过一些测试,Chrome 确实存在 User-Agent 标头的错误。
这很可能是由于不久前(2015 年中)User-Agent 标头在不允许的标头列表中。
由于这个特定的标头最近已从不允许的标头列表中删除,Firefox(从版本 43 开始)将允许您在 fetch 调用中更改 User-Agent,但 Chrome 不会。
这是Firefox bug 和Chromium bug
首先不允许它的原因是,确实没有充分的理由使用 User-Agent 标头发送任意数据,它应该用于发送实际的 User-Agent 和浏览器内请求,例如无论如何,XMLHttpRequest 的获取确实没有充分的理由来欺骗用户代理。
Chrome 什么时候会修复这个 bug 是任何人的猜测,但它确实是一个 bug,因为不允许的头列表不再列出 User-Agent 头,当在 Fetch 的选项对象中指定时它应该会改变。
作为旁注,您通常应该使用Headers Interface 创建标题,并将它们包含在headers
键下的options objects 中
let headers = new Headers(
"Accept" : "application/json",
"Content-Type" : "application/json",
"User-Agent" : "MY-UA-STRING"
);
fetch(url,
method : 'GET',
headers : headers
// ... etc
).then( ...
【讨论】:
这似乎不是一个错误,因为这并没有改变 回复:“没有好的理由”段落,一些freeAPIs 要求您设置User-Agent
标头以说明您的应用程序和联系电子邮件是什么,以防止滥用。我不确定这是对 User-Agent
的预期用途——也许这是这些 API 的一个错误——但这是我们在 fetch 中设置User-Agent
的正当理由。
谷歌浏览器不愿纠正这个错误可能在于它会严重阻碍browser fingerprinting;这恰好在广告行业中发挥了重要作用。其他涉及隐私的标头是 Referer
[原文如此] 和 Origin
。以上是关于发送自定义用户代理字符串以及我的标头(获取)的主要内容,如果未能解决你的问题,请参考以下文章