【问题标题】:Status 200 OK, same domain, valid JSON data and no response (Ajax)状态 200 正常,域相同,JSON 数据有效且无响应 (Ajax)
【发布时间】:2016-03-13 18:12:55
【问题描述】:

这是我的 ajax 调用:

    $.ajax({
        url : hostGlobal + "site/modulos/prefeitura/acoes-jquery.php",
        type: "POST",
        dataType : "JSON",
        data: {
            acao: "filtrarCidades",
            estado_id: $(".estados:chosen").val()
        },
        success: function(json) {
            console.log("worked");
            $(".cidades").html('');
            var options = "<option value=\"\"></option>";
            $.each(json, function(key, value) {
               options += '<option value="' + key + '">' + value + '</option>';
            });
            $(".cidades").html(options);
            if (!filterThroughCEP) { 
                $(".cidades").trigger("chosen:updated"); 
            }
        },
        error: function(e) {   
            console.log(e.responseText);
        }
    });

这是 php 操作:

if ($acao == 'filtrarCidades') {
    $estado_id = $_POST['estado_id'];
    $cidade->where = "estado_id = '".$_POST['estado_id']."'"; 
    $cidade->LoadFromDB();
    for ($c=0; $c<count($cidade->itens); $c++) {
        $cidades[$cidade->itens[$c]->id] = $cidade->itens[$c]->nome;
    }
    echo json_encode($cidades);
    die();
}

json_encode($cidades) 是有效的 json 数据 (UTF8),这是一个使用调试的示例:

{"1778":"Bras\u00edlia"}

这个{"1778":"Bras\u00edlia"} 会显示为 e.responseText(错误),即使状态正常,并且 URL 位于同一域中(不需要 JSONP)。我不知道为什么我无法联系到success

编辑:我已经设置了 contentType:

contentType: "application/json",

而且调用仍然无法“达到”成功。这是第三个错误参数:

SyntaxError: Unexpected token 
    at parse (native)
    at ajaxConvert (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7608:19)
    at done (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7363:15)
    at XMLHttpRequest.<anonymous> (http://localhost/sisconbr-sistema-novo/site/visual/js/jquery.js:7835:9)

确实与来自数据库的字符串中的 unicode 字符有关。

EDIT2:我又写了一遍,现在更清楚了:

function getCitiesByState() {
    $.ajax({
        url : hostGlobal + "site/estrutura/ajax.php",
        type: "POST",
        dataType : "text",
        data: {
            action: "getCitiesByState",
            state_id: $(".estados option:selected").val()
        },
        success: function(json, textStatus, jqXHR) {
            console.log($.parseJSON(json));
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(errorThrown); 
        }
    });
}

PHP:

if ($_POST["action"] == "getCitiesByState") {
    $cities = getResults("SELECT * FROM tbl_cidades WHERE estado_id = ".$_POST["state_id"]);
    echo json_encode($cities, JSON_UNESCAPED_UNICODE);
    die();
}

输出:

[{"id":"1778","estado_id":"7","nome":"Brasília","cep":"","loc_no_abrev":"Brasília"}]

错误:

Uncaught SyntaxError: Unexpected token 

【问题讨论】:

  • e的其余属性是什么?
  • 毫无疑问,您很容易受到sql injection attacks 的攻击,不要再假设成功了。 jquery 有一个用于 ajax 请求的 error 参数 - 如果未达到成功,则检查错误。
  • 您正在使用的错误处理程序具有三个参数。为我们记录第三个。
  • 设置标头,使其可以正确转换为 JSON 对象,即响应标头。 header('Content-Type: application/json');
  • 尝试摆脱'die()'

标签: javascript php jquery json ajax


【解决方案1】:

我认为问题在于对象属性 {"1778":"胸罩\u00edlia"} 表示属性名称无效的对象,因此 json 解码失败; 要证明这是否正确,请尝试

  1. 使用纯文本作为数据类型并记录它,它应该可以工作[但当然你将无法将其转换为 json]
  2. changeLoadFromDB 方法使属性名称有效[以字母、_ 或 $ 开头],您将获得有效的 JSON 响应,但您需要更改使用方式

它 1778 是一个 ID,应该是一个正确的结构 {id:"1778",property:"Bras\u00edlia"} 工作完美无瑕 试试看,让我们知道

编辑: 正如jcaron 好心建议的那样,我必须修复这个答案:“1778”确实是一个有效的属性名称,但如果使用点表示法,则标识符无效。 因为我不知道 jQuery 是如何管理这个的,所以我建议按照上面的方法进行测试,看看其中一项测试是否给出了结果。

【讨论】:

  • 您是否有说明属性名称应以字母、_ 或 $ 开头的参考? JSON spec 要求它们是字符串,即任何 Unicode 代码点序列。
  • "1778" 与对象属性名称的 id 一样有效。
  • stackoverflow.com/questions/16908476/…。关键不是一个有效的 JSON 属性,而是在 JSON 解码过程中使用它而不使用点符号,我会试一试,因为除此之外,一切似乎都很好
猜你喜欢
  • 2015-12-25
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多