【问题标题】:jQuery, JSON and Apache problemjQuery、JSON 和 Apache 问题
【发布时间】:2010-03-08 19:40:37
【问题描述】:

我有一个 jQuery JSON 请求,它从另一台服务器(例如 foo.com)加载一些 JSON:

$.getJSON("http://foo.com/json.php",function(data) { alert(data); });

但我收到的数据为空。这不是跨域问题,我试过以下:

$.getJSON("http://twitter.com/users/usejquery.json?callback=?",
    function(data) { alert(data); });

并收到了不错的 JSON 对象。所以,我认为后端 Apache 2.2.14 存在问题。以下是从服务器发送的 HTTP 标头:

Date: Sun, 07 Mar 2010 16:08:38 GMT
Server: Apache/2.2.14 (CentOS)
X-Powered-By: PHP/5.3.1
Content-Length: 2
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: application/json; charset=UTF-8

每种情况下的标头都是相同的:常规 HTTP 请求或 AJAX。但是我收到了带有 AJAX 的空内容,以及带有浏览器请求的普通 JSON。我使用 Firebug 进行测试,使用 PHP5 形成 JSON。

有人有什么想法吗? 谢谢!

【问题讨论】:

  • 当您说数据为空时:您是否使用 Firebug 控制台检查过 HTTP 请求返回的内容?
  • 返回的数据长度只有2个字节。所以我猜像 {} 或 [] 之类的东西,可能评估为假。你确定你的脚本返回正确的数据吗?
  • 不重要:2 字节或更多。你是对的,它是 [] 字符。不要紧。当我说“null”时,我的意思是警报显示“null”和 Firebug 控制台返回的空字符串。

标签: ajax apache json jquery


【解决方案1】:

我很确定,为了进行这样的跨域调用,您必须有一个回调,这是执行 JSONP 所需要的。

这里有更多关于 jsonp 的信息 http://www.insideria.com/2009/03/what-in-the-heck-is-jsonp-and.html

要让 jsonp 工作,您必须有一个回调让服务器将 json 字符串包装进去。例如:

$.getJSON("http://foo.com/json.php?callback=?", function(data){});

这里的回调函数是由 jquery 生成并传递到请求中的,所以它会是这样的:

http://foo.com/json.php?callback=generatedFunction

那么服务器返回的应该是:

generatedFunction("{key:value, key2:value2}");

该函数中的参数是实际的 json 字符串。

在 php 中返回它会是这样的:

$callback = $_GET['callback'];
print($callback."(".json_encode($theobject).");");

【讨论】:

  • 如果您不提供回调函数,jQuery 会为您制作一个,并从中调用“getJSON”调用中提供的回调。这就是“getJSON” API 的重点:-)
  • 你还需要回调吗=?在网址中?否则服务器怎么知道怎么包装json对象?
  • jQuery 会自动为您设置所有这些。它创建了一个具有唯一名称的小函数(使用内部计数器),并在 URL 中使用它。该函数调用提供给“getJSON”的回调。 (我需要再次检查源代码,以确保我没有在这里自欺欺人,但我前几天刚刚在阅读代码。)
  • 服务器仍然需要使用生成的函数来处理请求,你不能只从服务器返回json,它必须被包装在那个函数中;
  • 尖尖的,你是对的,jQuery 会自动添加 smth lik ?_8567344543 到 URL。
【解决方案2】:

更多关于跨域 JSON throw JSONP and jQuery.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2010-10-10
    • 2016-01-19
    相关资源
    最近更新 更多