我正在使用jQuery来建立对Twitter Search API的请求。我正在使用jsonp,因为跨域请求是必需的。但是,Twitter API指定您应该为这些请求设置唯一的用户代理,如果没有,则限制您的请求。问题是,我没有办法通过jquery设置这个头。
这是我使用的代码:
$.ajax({ url: 'http://search.twitter.com/search.json',dataType: 'jsonp',type: 'get',data: { q: 'twitter' },success: function(data) { alert(data.results); } });
我已经尝试使用beforeSend方法,但似乎这个事件没有触发。任何人都有办法解决这个问题吗?
谢谢。
解决方法
通过向页面添加脚本元素,JSON与Padding可以起作用,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。