如何在 jQuery ajax 的 User-agent 中添加附加信息?

问题描述

我读过关于这个 herehere,但我仍然不知道如何在 jQuery ajax 中做到这一点。我尝试了我链接的问题的答案之一中的代码,但它丢弃了用户代理覆盖:

$.ajax({ 
    url: "http://blablabla.com/",dataType:'html',beforeSend: function (req) {
        req.setRequestHeader('User-Agent','https://graphicdesign.stackexchange.com/users/69916/vikas');
    },error: function() { alert("No data found");},success: parseResult
});

我当前正在发送的用户代理字符串是这样的:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/92.0.4515.40 Safari/537.36 Edg/92.0.902.9

而且我也想添加我的其他 SE 个人资料网址,其中 https://graphicdesign.stackexchange.com/users/69916/vikas

我想这样做是因为有人建议here,以防您参与聊天机器人。

关于如何在现有用户代理中放置附加信息(即我的个人资料 URL)并使用 ajax 将其发送到任何 api 的简单示例会有所帮助。

解决方法

jQuery 使用 XMLHttpRequest 发送请求,因此受到相同的限制和问题。特别是,当您调用 setRequestHeader 或提供 headers 配置选项时,会使用相应的 XMLHttpRequest 方法来设置标头。

这是 jQuery 在配置对象的情况下所做的under the hood

// Set headers
for ( i in headers ) {
    xhr.setRequestHeader( i,headers[ i ] );
}

您可能知道,setRequestHeader 方法的 the spec 中的算法的第 5 步说,如果标头在“禁止标头”列表中,它应该返回:

  1. 如果 name 是禁止的标题名称,则返回。

这很重要,因为 User-Agent 标头曾经在该列表中(使其被禁止的 draft 是 2008 年 9 月的标头)。这不再是这种情况(请参阅 Fetch 存储库上的 issue #37),但是,基于 Chromium 的浏览器(意味着您至少对 Chrome 和 Edge 不走运)要么默默地丢弃它(以防万一获取 API 或抛出错误:

拒绝设置不安全的标题“User-Agent”

请参阅 MDN 参考中的以下注释:

不再禁止 User-Agent 标头,根据规范 — 请参阅禁止标头名称列表(已在 Firefox 43 中实现)— 现在可以在 Fetch Headers 对象中或通过 XHR setRequestHeader() 设置它。但是,Chrome 会默默地从 Fetch 请求中删除标头(请参阅 Chromium 错误 571722)。

MDN 指的是被认为正在处理的错误 571722,因此在不久的将来事情可能会发生变化。