发送getJSON请求返回200正常无报错,但alert未触发如何解决?
问题原因及解决方案
核心问题定位
你的alert不弹出是因为$.getJSON要求响应内容必须是严格合法的JSON格式,且响应头符合JSON规范,只要出现以下任意一种情况就会静默失败,不会进入成功回调:
- PHP返回的内容中包含多余的空白、BOM头、报错信息等非JSON内容
- 你PHP代码中的错误判断逻辑存在语法问题,可能返回非JSON格式的纯文本
- 没有指定JSON响应头,jQuery无法正确识别返回内容类型
修改方案
前端代码修改
改用$.get先获取原始响应内容,同时完善错误提示,方便排查问题:
$.get('fetch.php', { getFiat: fiat, getCoin: coin, getLimit: limit, getAggregate: aggregate, getCall: 4 }, function(rawData) { // 弹出原始返回内容 alert(rawData); // 如需操作解析后的JSON,可手动解析 try { let parsedData = JSON.parse(rawData); alert(JSON.stringify(parsedData)); } catch (err) { alert('JSON解析错误:' + err.message); } }).fail(function (jqxhr, textStatus, error) { console.log('错误详情:', textStatus, error, jqxhr.responseText); alert('请求出错:' + error); });
后端PHP代码修改
修正逻辑判断,添加JSON响应头,确保输出内容完全符合JSON规范:
<?php // 注意:文件开头<?php前不能有任何空格、换行、BOM头,文件结尾建议删除?>避免多余空白输出 if($_GET['getCall'] == 4) { // 设置JSON响应头 header('Content-Type: application/json; charset=utf-8'); try { // 确认callAPI()无任何echo/print输出,否则会破坏JSON格式 callAPI(); $data = file_get_contents('https://min-api.cryptocompare.com/data/v2/histoday?fsym='.$_GET['getCoin'].'&tsym='.$_GET['getFiat'].'&limit='.$_GET['getLimit'].'&aggregate='.$_GET['getAggregate'].'&e=CCCAGG&api_key=[key]'); $json = json_decode($data); // 修正错误判断逻辑,原逻辑isset返回布尔值和字符串比较永远为真 if (isset($json->Response) && $json->Response === "Error") { echo json_encode(['status' => 'error', 'msg' => 'Broken duh..']); } else { echo $data; } } catch(Exception $e) { echo json_encode(['status' => 'error', 'msg' => $e->getMessage()]); } }
额外排查点
- 检查PHP是否开启了错误输出,所有warning、notice信息都会破坏JSON格式,建议测试阶段将错误信息写入日志,不输出到响应体
- 确认PHP文件中除了上述代码之外没有其他输出内容
内容的提问来源于stack exchange,提问作者dom_ahdigital
相关产品推荐
相关产品推荐

