【问题标题】:Why this JQuery Ajax call is not working?为什么这个 JQuery Ajax 调用不起作用?
【发布时间】:2011-02-17 17:55:11
【问题描述】:
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript" language="javascript">
$.ajax({
    type: "GET",
    cache: false,
    url: 'http://ajax.googleapis.com/ajax/services/search/local?v=1.0&q=school',
    contentType: "application/json; charset=utf-8",
    success: function(msg) {
    alert(""+msg.length);
  },
  error: function (e) {
            alert("Failed to Get declassification details");
        }});
</script>
</body>
</html>

我无法弄清楚这个 AJAX 调用出了什么问题。WENT 通过这个论坛上的几个SIMILAR 问题,但没有一个对我有用。
我必须以 JSON 格式从 Google 搜索中获取结果集。

【问题讨论】:

  • 它的长度为 0(零),我猜这可以暗示至少这个 ajax 调用已经被调用了。
  • JSONP 工作正常,但为什么会这样?
  • 我用使 JSONP 工作的基本步骤更新了我的答案。

标签: jquery simpletest google-search


【解决方案1】:

由于跨域安全策略,浏览器正在丢弃请求。 尝试使用 JSONP(数据类型:“jsonp”)。 由于安全限制,对第三方网站的 Ajax 请求通常是不可能的。但是有几种客户端技术可以解决这个限制,其中之一是 JSONP。 您不会从 JSONP 获得的一件事是网络错误通知或任何对格式错误的响应做出良好响应的通知,因此您必须接受它作为权衡在其他域上调用服务的能力。

JSONP 的工作原理和方式:

  1. 浏览器允许您让脚本元素从另一个域获取其源代码。
  2. 如果在 url 的参数(通常名为“回调”)中提供了函数名称,则请求的页面已设置为将 JSON 响应包装在函数调用中。
  3. 当 dataType 为 'jsonp' 时,JQuery 创建包装函数,在 url 中添加回调参数,并在 DOM 中插入一个 script 标签,指向您请求的 URL。
  4. 浏览器将响应作为脚本加载并执行,从而调用 JQuery 提供的函数。

查看响应的差异: http://ajax.googleapis.com/ajax/services/search/local?v=1.0&q=school

http://ajax.googleapis.com/ajax/services/search/local?v=1.0&q=school&callback=jquery_created_function

【讨论】:

    【解决方案2】:

    您应该使用dataType 而不是“contentType”。这是代码:

    $.ajax({
        type: "GET",
        cache: false,
        url: 'http://ajax.googleapis.com/ajax/services/search/local?v=1.0&q=school',
        dataType: "jsonp",
        success: function(msg) {
            alert("" + msg.responseData.results.length);
        },
        error: function(e) {
            alert("Failed to Get declassification details");
        }
    });
    

    这里正在工作example

    来自文档:

    内容类型字符串 向服务器发送数据时,使用此内容类型。

    数据类型字符串 您期望从服务器返回的数据类型。

    【讨论】:

    • 你能告诉我dataType和contentType有什么区别吗?这会像往常一样使用 JSON 吗?
    • 感谢您的精彩解释,但为什么它使用 JSONP 而不是 JSON?
    • @Sam Rudolph。 JSONP 是一种非官方协议,允许通过在当前文档中生成脚本标签并期望返回结果来调用指定的回调处理程序来进行跨域调用。
    • @gor:工作示例的链接不再起作用。仅返回错误 404。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多