【问题标题】:How to add a value to User-Agent header in a .ajax request?如何在 .ajax 请求中向 User-Agent 标头添加值?
【发布时间】:2012-10-29 18:27:09
【问题描述】:

我正在尝试为 Chrome 创建一个插件,我可以在其中从多个页面检索信息,其中一些页面具有负载平衡器,并且需要特定的用户代理代码将我路由到正确的位置。

现在,我正在打一个.ajax() 电话,我已经尝试了一些方法,例如:

$.ajaxSetup({
    beforeSend: function(request) {
        request.setRequestHeader("User-Agent","MyAgentCode");
    }
});

但是它不起作用

我也试过了:

$.ajax({ 
    url: "http://blablabla.com/",
    dataType:'html', 
    beforeSend: function (req) {
        req.setRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1 MyAgentCode);
    },
    error: function() { alert("No data found");},
    success: parseResult
});

这也不起作用。

我只想为User-Agent 添加一个值(保持其余部分不变)。这将使我能够从正确的服务器获取正确的信息。

【问题讨论】:

标签: jquery ajax google-chrome-extension user-agent


【解决方案1】:

您可以使用 headers[],这比使用 beforeSend 更容易。只需 Ctrl-F '标题'here

【讨论】:

  • 从文档中它说“附加标头”,所以有人可以猜测它仅适用于尚未定义的标头,但实际上,这是有效的。
【解决方案2】:

如果我理解正确您的问题,您可以使用 webRequest Chrome API。 "使用 chrome.webRequest 模块拦截、阻止或修改正在进行的请求,并观察和分析流量。

http://developer.chrome.com/trunk/extensions/webRequest.html

这里有一个如何删除用户代理的示例。而不是删除,您可以将 requestHeader 的值更改为您的值。

 chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return {requestHeaders: details.requestHeaders};
  },
  {urls: ["<all_urls>"]},
  ["blocking", "requestHeaders"]);

【讨论】:

    【解决方案3】:

    注意事项:

    • 您必须从网络服务器打开 html,而不是 file:/// 处理程序。
    • 您必须确保您没有添加拼写错误,例如打开 User-Agent 字符串引号。
    • 删除/编辑type: "POST",以防您要发出 GET 请求。

    • 有两种方法可以编辑标题,使用BeforeSend 和使用headers。它们都适用于$.ajax()$.post() 方法。

    示例 1:

    $.post({
        url: "http://localhost:4000", 
        data: "we=1",
        headers: {"User-Agent": "user agent 1"}
        });
    

    示例 2:

    $.ajax({ 
        url: "http://localhost:4000",
        type: "POST",
        data: {we: "2"},
        dataType:'text', // case you wanna especify the return type
        headers: {"User-Agent": "user agent 2"}
    });
    

    使用 headers 似乎更容易,也许这只是 BeforeSend 方法的一个捷径:

    $.ajax({ 
        url: "http://localhost:4000",
        type: "POST",
        data: {we: "2"},
        dataType:'text',
        headers: {"User-Agent": "user agent 1"}
        beforeSend: function (req) {
            req.setRequestHeader('User-Agent', 'user agent changed to 2');
        }
    });
    

    如果您想检查结果...添加如下内容:

    error: function() { alert("No data found");},
    success: function() { alert("uh yead");}
    

    但是使用 Firefox/Chrome 开发工具(f12 -> 网络选项卡)就足够了。 在 zip 文件中,我包含 PHP 服务器启动命令和一个 index.php 文件以转储标题。

    在此处上传的完整工作示例文件集:https://files.fm/u/4x3fc8ru

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多