【问题标题】:Data inserted successful but jquery still returning error数据插入成功但jquery仍然返回错误
【发布时间】:2010-02-10 00:23:34
【问题描述】:

我使用以下 jQuery 通过数据服务插入数据。 事件虽然我得到status-response 201并且数据成功插入到我的数据库中,但系统仍然认为它是一个错误并给我“失败”警报?

我在这里错过了什么?

$.ajax({
    type: "POST",
    url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/",
    data: JSON.stringify(record),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function() {
        alert("Success");
    },
    error: function(xhr) {
        alert("fail");
    }
});

更新:

来自 Fire Bug 的调试消息:

Preferences

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

jquery....min.js (line 127)
POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created 6.7s

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created


get readyState 4

get responseText "{ "d" : {\r\n"__metadata"...\')/XMLForm"\r\n}\r\n}\r\n} }"

get responseXML null

get status 201

get statusText "Created"

【问题讨论】:

  • 尝试使用 Firebug 查看来自服务器的 http 响应。这可能会告诉您失败的原因。
  • 您能否建议我在哪里查看我是在 Ajax 中使用 ADO.Net 的新手。我使用了萤火虫,但在那里我没有发现任何错误。我从 fireBug 更新了日志
  • 奇怪。据我所知,201 在 JQuery 中被认为是成功的。
  • 我也一样。 201失败,奇怪

标签: jquery ajax wcf-data-services


【解决方案1】:

您必须发送 { dataType: 'text' } 以使成功函数与 jQuery 和空响应一起使用。

【讨论】:

  • 谢谢 - 我有 dataType: "json" 并且对此感到困惑。
  • 也为我工作。我花了几天的时间!我想知道这是为什么。
  • 如果你查看源代码github.com/jquery/jquery/blob/master/src/ajax.js#L706 - jquery 正在检查状态是否是第一个 204,然后是 304,否则它会尝试使用通过转换器运行响应的结果。 .. JSON转换器显然会在空字符串/无内容上引发异常,即使状态为成功也会返回错误。假设使用文本转换器,jQuery 解析空响应体没有问题。看起来像一个愚蠢的黑客 - 可以说 jQuery 在这种情况下没有按预期运行
  • 这对我也有用,虽然我发送的是 Content("Success", "application/json") 但更改 dataType:text 使一切正常。
  • 好的,它的 2018 年,这个解决方案是最有创意和最简单的一个!谢谢。
【解决方案2】:

解决方案:

尽管我仍然无法弄清楚我是如何从以前的代码中得到错误的,但我得到了这个对我有用的替代解决方案。 (至少现在)。

希望听到更多的想法

谢谢大家

$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/",
            data: JSON.stringify(record),
            complete: function(xhr) {
                if (xhr.readyState == 4) {
                    if (xhr.status == 201) {
                        alert("Created");
                    }
                } else {
                    alert("NoGood");
                }
            }
            //                
            //                success: function(data) {
            //                    alert("Success");
            //                },
            //                error: function(xhr) {
            //                    alert("fail" + xhr);
            //                }
        });

【讨论】:

  • 我也遇到了同样的问题....原来是下面“YourParadigm”所说的......
  • 我也有同样的问题。奇怪的是它工作了一段时间。然后在服务调用中添加了一个自定义标头,从那时起我就无法使用“成功”属性。现在真正的诀窍是传入一个自定义函数以获得成功,而不必在每个函数中进行 xhr.readystate 检查。
  • 这不应该是公认的答案,因为这个解决方案实际上是通过手动处理来绕过错误消息。 IMO,接受的答案应该是 Ruben Stolk 的。
【解决方案3】:

发生这种情况并不是因为没有内容的 201 必然被视为无效,而是因为解析空字符串 ("") 是 JSON 解析错误。

可以通过设置 dataFilter 全局或按请求更改此行为。

$.ajaxSetup({
    dataFilter: function(data, dataType) {
        if (dataType == 'json' && data == '') {
            return null;
        } else {
            return data;
        }
    }
});

【讨论】:

    【解决方案4】:

    我之前也遇到过这种情况。我的问题是我的查询字符串末尾没有包含“.json”扩展名,所以我得到了 XML。 jQuery 在尝试将 xml 解析为 json 时窒息,导致错误处理程序被调用。

    【讨论】:

    • 我有一个如下所示的查询字符串:/self-service/api/v1/user/ - 将?format=json 添加到末尾不起作用,即使这会使 Web 服务 api 返回 json 而不是 xml。
    【解决方案5】:

    我使用 jQuery_2.1.1 并且有类似的问题 PUT 到 error() 处理程序。我的 REST api 调用主体是

    • PUT 到命名键路径 (/rest/properties/mykey1):204=更新现有对象,201=创建新对象并返回 Location 标头,XXX=其他最像错误的内容
    • POST 到未知键路径 (/rest/properties):201=创建新对象并返回 Location 标头,XXX=其他最像错误的内容

    Http 状态 204 是 NoContent,所以 jQuery 很好,但是 201=Created 期待 json 主体对象,但我返回了零长度的主体部分。资源地址在位置响应标头中给出。

    我可能会根据少数极端情况返回 json 对象,因此必须使用 datatype:"json" 属性。我的 jQuery 解决方案是 error() 检查 201 状态并调用 success() 函数。

    $.ajax({
        url: "/myapp/rest/properties/mykey1",
        data: jsonObj, 
        type: "PUT",
        headers: { "Accept":"application/json", "Content-Type":"application/json" },
        timeout: 30000,
        dataType: "json",
        success: function(data, textStatus, xhr) {
            data="Server returned " + xhr.status;
            if (xhr.status==201) data+=" "+xhr.getResponseHeader("location");
            $("#ajaxreply").text(data);
        },
        error: function(xhr, textStatus, ex) {
            if (xhr.status==201) { this.success(null, "Created", xhr); return; }
            $("#ajaxreply").text( textStatus + "," + ex + "," + xhr.responseText );
        }
    });     
    

    【讨论】:

      【解决方案6】:

      我已经在其他 similar thread 上回答过这个问题:

      我遇到了同样的问题,为我解决的一件事是未设置“dataType”。当您执行此操作时,jQuery 将尝试猜测服务器返回的数据类型,并且当您的服务器返回没​​有内容的 201 时不会抛出错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 2016-09-26
        • 2018-01-19
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多