5

由于您不能在 JSONP 调用上应用自定义标头,我如何进行跨域请求并使用 jQuery 应用自定义标头?

我基本上是在尝试使用 jQuery 访问谷歌文档,并且需要传递一个身份验证令牌:

var token = "my-auth-token";
$.ajax({
  url: "http://docs.google.com/feeds/documents/private/full?max-results=1&alt=json",
  dataType: 'json',
  beforeSend: function(xhr) {
    xhr.setRequestHeader("Authorization", "GoogleLogin auth=" + token);
  },
  success: function(data, textStatus, XMLHttpRequest) {
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
  }
});

注意:这样做的目的是完全绕过应用层。使用 ruby​​ 连接到 Google Data API 很简单,但它一直在服务器端解析提要占用大量资源。

4

3 回答 3

5

您可以使用 Google 的 JavaScript 客户端库来查询 Docs API。虽然它没有专门为 Docs 提供帮助程序,但它仍然可以与大多数 API 一起使用,包括 Docs。请参阅 Google 员工的这篇博客文章,其中显示了一个工作示例。

如果您最终陷入无限循环的授权,请参阅 Google 群组中的这个相关问题。基本上,cookie 的设置速度不够快,因此当 JavaScript 客户端库检查时,它什么也没找到并重定向到 OAuth 授权页面。一种解决方案是在检查完成之前添加一个小的延迟,或者使用一个登录按钮来启动授权,而不是在页面加载时进行。

您还需要将任何图像添加到位于同一域中的页面。它可以用 CSS 隐藏,只要在 DOM 中。

使用上面博客文章中的示例,我能够仅使用 JavaScript 检索我的文档列表。这是我用来摆脱无限授权循环的修改后的初始化函数:

function initialize() {
    var scope = 'http://docs.google.com/feeds/';

    if (google.accounts.user.checkLogin(scope)) {
        var service = new google.gdata.client.GoogleService('writely', 'DocList-App-v1.0');   
        service.getFeed(scope + 'documents/private/full/', handleFeed, handleError);  
    } else {
        var loginButton = $("<button>Click here to login</button>");
        loginButton.click(function() {
            var token = google.accounts.user.login(scope); // can ignore returned token  
        });
        $("body").append(loginButton);
    }
};  
​
于 2010-06-18T23:09:43.360 回答
3

考虑在服务器端编写一些用于代理的代码并让 jQuery 调用它。

于 2010-06-18T22:24:28.327 回答
0

您可以,只要外部域通过发送适当的Access-Control-Allow-Origin标头允许它。然后只需XMLHttpRequest在支持标准跨域 XHR API 的浏览器和XDomainRequestIE 中使用该 API。

于 2010-06-19T01:07:04.560 回答