由于您无法在JSONP调用上应用自定义标头,因此如何发出跨域请求并使用jQuery应用自定义标头?
我基本上是想使用jQuery访问google文档,并且需要传递身份验证令牌:
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很简单,但是在服务器端始终解析提要会占用大量资源。
您可以使用Google的JavaScript客户端库来查询Docs API。尽管它没有专门为Docs提供的帮助程序,但仍可以与大多数API(包括Docs)一起使用。请参阅由Google员工撰写的此博客文章,其中显示了一个有效的示例。
如果您遇到无限的授权循环,请参阅Google网上论坛的相关问题。基本上,cookie的设置速度不够快,因此当JavaScript客户端库检查时,它什么也没找到,并重定向到OAuth授权页面。一种解决方案是在检查完成之前增加一小段延迟,或者使用启动授权的登录按钮,而不是在页面加载时进行授权。
您还需要将任何图像添加到同一域中的页面。只要在DOM中,就可以使用CSS将其隐藏。
使用以上博客文章中的示例,我能够仅使用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); } };