注意:我不认为这是 Drupal 问题,所以我将其发布在 SO 上。
我们创建了一个应该返回 JSON 的 Drupal 模块。例如调用 /foo/json 返回 JSON。在 Chrome 中这一切都很好。但是,Firefox 只显示“null”。
JSON 的内容只是一个 PHP 数组,其中包含一些通过循环填充的信息
$someArray = array();
foreach(....) {
$someArray[] = array("foo" => "bar", ...);
}
echo json_encode($someArray);
到目前为止,我知道
- 这不是编码问题。如果我只从中返回一个元素
$someArray[0]["some_key"]
,Chrome 会显示"USA"
为5,所以我确信没有一个非 ASCII 字符。但是,Firefox 显示的内容长度为4。Content Length
null
- 做 a
wget
给我所有 JSON 的正确内容。由于我比浏览器更信任 wget,因此我认为这不是 Drupal/.htaccess 问题。 - 根据 jsonlint.com,JSON 格式正确,并且由于 PHP 函数进行转换,我认为它的格式确实正确。
- 权限(每个人都可以访问页面)或编码(发送 UTF-8)等其他内容不会改变结果。
- 这与 jQuery/跨域无关,因为我只想在浏览器中调用 URL 并希望查看 JSON 响应。
- 在另一台具有相同(Drupal)设置的机器上,结果是相同的。
- 我能够从与 Drupal 设置无关的其他目录返回 JSON。但是因为我只是做 a
json_encode
,所以我绕过了 Drupal 的所有可能输出,并且由于wget
我的工作,它与 Drupal IMO 无关。
根据评论更新
- 内容类型
application/json
具有适当的编码信息。将其更改为 text/html 或其他内容不会改变任何内容。使用这两者header
以及 Drupal 函数来设置标题。 - 我确信
null
响应是正确的,因为我使用 Firebug 对其进行了检查。 ini_set('default_charset', 'UTF-8');
不会改变任何东西,因为我已经在标题中提交了此信息。
来自带有 Firebug 的 Firefox 的响应标头
Cache-Control no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Language en
Content-Length 4
Content-Type application/json; charset=utf-8
Date Mon, 03 Sep 2012 12:16:58 GMT
Etag "1346674618"
Expires Sun, 19 Nov 1978 05:00:00 GMT
Keep-Alive timeout=5, max=100
Last-Modified Mon, 03 Sep 2012 12:16:58 +0000
Server Apache/2.2.22 (Ubuntu)
X-Powered-By PHP/5.3.10-1ubuntu3.2
请求头
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.7,de;q=0.3
Connection keep-alive
Cookie has_js=1; respimg_ratio=1; respimg=1000 //Drupal information
Host vie.local
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0
TL;DR
虽然 Chrome 显示正确(格式良好)的 JSON 输出,但 Firefox(并且也在 Opera 中测试过)仅显示null
最简单的字符串,例如"USA"
.