修改JSONP请求的HTTP标头

时间:2010-07-28 07:32:05

标签: jquery http-headers jsonp user-agent

我正在使用jquery来构建对Twitter Search API的请求。我正在使用jsonp,这是跨域请求所需要的。但是,Twitter API指定您应为这些请求设置唯一的User-Agent,如果不这样做,则会限制您的请求。问题是,我认为无法通过jquery设置此标头。

这是我正在使用的代码:

$.ajax({
    url: 'http://search.twitter.com/search.json',
    dataType: 'jsonp',
    type: 'get',
    data: { q: 'twitter' },
    success: function(data) {
        alert(data.results);
    }
});

我已尝试使用beforeSend方法,但似乎此事件未触发。任何人都可以想出解决这个问题的方法吗?

感谢。

2 个答案:

答案 0 :(得分:55)

带填充的JSON通过向页面添加脚本元素来工作, src 属性指向Web服务的URL。然后,Web服务返回一个脚本,该脚本包含在回调函数中包含的数据,该函数在脚本完成解析时执行。它不是JSON(它甚至不一定是有效的JSON,一开始),因为它是纯JavaScript。

不幸的是,没有办法修改为添加到页面的脚本元素发送的标题。您唯一能做的就是检查检索数据的跨源兼容方法,例如:

  • XMLHttpRequest Level 2 - Chrome,Safari 4 +,Firefox 3.5 +,Opera

    // Is XMLHttpRequest Level 2 supported?
    if ("withCredentials" in new XMLHttpRequest()) 
  • XDomainRequest - 适用于IE 8,IE 9

    // Is XDomainRequest supported?
    if ("XDomainRequest" in window)

如果这些实现存在并且相应地使用它们,那么测试这些实现将是一个好主意,对于不支持的或旧版本的浏览器,回退到标准JSONP。

也可能(但不太可能,因为它很高调)Web服务未设置为允许跨源请求,因此如果请求失败,您可能仍然必须回退到JSONP。另请参阅Cross-Origin Resource Sharing

答案 1 :(得分:0)

试试这个:

// OAuth configurations   
    var config = {
      'client_id': 'xxxxxx.apps.googleusercontent.com',
      'scope': 'https://www.google.com/m8/feeds/contacts/default/full'          
    };

gapi.auth.authorize(config, function(data) {
      // login complete - now get token
      var token = gapi.auth.getToken();
      token.alt = 'json';
      // retrieve contacts
      jQuery.ajax({
        url: 'https://www.google.com/m8/feeds/contacts/default/full/?max-results=999999',
        dataType: 'jsonp',
        data: token,
        success: function(data) { successGmail(data); }
      });
    });

我在那里找到了它:https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J