【问题标题】: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' // <---
})

但这不起作用。据hereherehere 报告,我感觉这是因为fetch api 中的一个错误。

任何人都可以解决如何使用fetch 将UA 作为headers 的一部分传递?

【问题讨论】:

    标签: javascript http reactjs header fetch


    【解决方案1】:

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

    这很可能是由于不久前(2015 年中)User-Agent 标头在不允许的标头列表中。

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

    这是Firefox bugChromium 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多