2010-06-18 64 views
5

Since you can't apply custom headers on JSONP calls,我如何制作跨域请求并使用jQuery应用自定义标头?是否有可能在Javascript中创建跨域请求并设置自定义标头?

基本上我试图用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非常简单,但是它始终需要大量资源解析源服务器端的资源。

+3

您不能出于同样的原因,因为您不能对myBank.com执行相同类型的请求,该请求会获取我的信息或锁定我的帐户,但任何一个都是非常不受欢迎的...并且确切地说为什么不允许这样的跨域请求。 – 2010-06-18 22:08:41

回答

5

您可以使用Google的JavaScript客户端库来查询Docs API。尽管它没有专门针对Docs的助手,但它仍可以用于大多数API,包括Docs。 Google员工看到此blog post,该员工显示了一个工作示例。

如果最终发生无限循环授权,请参阅Google群组中的此related question。基本上,cookies的设置速度不够快,所以当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); 
    } 
}; 
​ 
+0

几乎在那里!现在,我在通话服务中收到此错误。getFeed':“未捕获错误:在此页面上需要同一个域的图像以进行已认证的读取和所有写入操作。”有任何想法吗??? – 2010-06-19 01:32:36

+1

@viatropos - 你快到了。将任何图像放在页面上,但它必须驻留在同一个域中。例如,我把这个临时图像放在页面上,并用样式表隐藏起来 - ''。 – Anurag 2010-06-19 01:39:04

+0

真棒!这正是我所期待的,非常感谢Anurag。 – 2010-06-19 01:39:36

3

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

+0

你可以。许多新版本的浏览器都支持跨域XHR,包括IE8。 – 2010-06-19 01:07:52

+0

@Eli - 不,你不能,不是OP原来的方式......这不是“支持它”的问题,而是完全相反,他们正在积极地阻止它作为安全措施。 – 2010-06-19 02:11:36

+0

@Eli:我更新了答案,删除了“你不行”。如果你纠正了失望,我会很感激。 – BalusC 2010-06-19 02:47:22

0

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

相关问题