状态200 OK,相同的域,有效的JSON数据,没有响应(Ajax)

Status 200 OK, same domain, valid JSON data and no response (Ajax)

本文关键字:响应 Ajax 数据 有效 OK 状态 JSON      更新时间:2023-09-26

这是我的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(错误),即使状态为OK,并且URL在同一域上(不需要JSONP)。我不知道为什么我达不到success

编辑:我已经设置了内容类型:

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 

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

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

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

编辑:正如jcaron善意地建议的那样,我必须修复这个答案:"1778"确实是一个有效的属性名称,但如果使用点表示法,则是无效的标识符。由于我不知道jQuery是如何管理这一点的,我建议如上所述进行测试,看看其中一个测试是否给出了结果。