33

私はRESTDELETE呼び出しを行っています。これは204を返します。jQuery1.8.3では、これは機能し、request.doneコールバックをヒットします。しかし、1.9を使用すると、textStatusにパーサーエラーがあり、errorThrownに「SyntaxError:Unexpectedendofinput」が含まれるrequest.failになります。

remove = function (complete) {
            var self = this;
            var request = $.ajax({
              context: self,
              url: "/v1/item/" + itemId,
              dataType: "json",
              type: "DELETE"
            });
            request.done(removeCallback);
            request.fail(function (xhr, textStatus, errorThrown) {
                alert(errorThrown);
            });
            
        },

1.9でこれが失敗する原因となる変更点と、それを修正するために何を変更する必要があるかを知っている人はいますか?

だから、私自身の質問に答えると、これが実際に問題であるように見えます:

jQueryアップグレードガイドから

空の文字列のJSON結果を返すjQuery.ajax

1.9より前では、JSONまたはJSONPの戻りデータ型を期待するajax呼び出しは、空の文字列の戻り値を成功の場合と見なしますが、成功ハンドラーまたはpromiseにnullを返します。1.9以降、JSONデータに対して返される空の文字列は不正な形式のJSONと見なされます(そうであるため)。これでエラーがスローされます。エラーハンドラを使用して、このようなケースをキャッチします。

したがって、dataTypeを削除すると

dataType: "json",

jQuery1.8.3および1.9で動作します。

4

3 に答える 3

21

HTTP 204応答は空の文字列ではありません。つまり、データがないことを意味します。これは、削除および更新操作に対する有効な応答です

これは、JQuery1.9で導入されたバグのようです。

dataTypeプロパティを削除すると、これが修正される理由は、「json」に設定されている場合、JQueryがJSON.parseを使用してコンテンツを解析しようとし、結果として失敗するためです。チケットから:

回帰はparseJSONとネイティブJSON.parseの再調整(null /未定義値の例外をスローする)が原因であるため、これは「json」以外のdataTypeでは失敗しません。

statusCodeプロパティを介して204のハンドラーを追加するというチケットで提案されている回避策を試さないでください。これは、そのハンドラーエラーハンドラーの両方がトリガーされるためです。考えられる解決策は次のとおりです。

    $.ajax(url, {
    type: "DELETE",
    dataType: "json",
    error: function (error) {
        if (error.status === 204) {
            // Success stuff
        }
        else {
            // fail
        }
    }});
于 2013-01-25T10:43:00.310 に答える
9

私は非常によく似た問題を抱えていました、そしてあなたは私の答えを見つけるのを手伝ってくれました-それでありがとう。ただし、私の解決策は少し異なるので、共有することにしました。

質問で述べられているように、JQueryのWebサイトには次のように書かれています。

1.9より前では、JSONまたはJSONPの戻りデータ型を期待するajax呼び出しは、空の文字列の戻り値を成功の場合と見なしますが、成功ハンドラーまたはpromiseにnullを返します。1.9以降、JSONデータに対して返される空の文字列は不正な形式のJSONと見なされます(そうであるため)。これでエラーがスローされます。エラーハンドラを使用して、このようなケースをキャッチします。

成功関数で返されたデータに対して何もする必要がなかったため、戻り型として「void」を使用してサーバー上のメソッドにJSONデータを渡していました。JQuery 1.9以降のAJAXリクエストでJSONを渡すときに、nullを返すことができなくなりました。ただし、これは以前のバージョンのJQueryでは可能でした。

エラーの発生を停止し、代わりに成功関数を起動するには、AJAXリクエストで有効なJSONを返す必要があります。(私の場合はとにかく)返されたデータを使用していないため、有効である限り、何を渡してもかまいません。

于 2013-02-14T20:14:29.993 に答える
2

問題は、jQueryが204応答の空の本文(Content-Lengthが0)を""として扱うことのようです。これは1つの解釈ですが、欠点は「」が他の応答文字列と同じように扱われることです。したがって、dataType:jsonオプションを指定してjQuery.ajax()を呼び出した場合、jQueryは ""をオブジェクトに変換しようとし、例外をスローします( ""は無効なJSONです)。

jQueryは例外をキャッチして回復しますが、(開発環境で)例外を完全に回避したい場合は、次のようなことを行うことができます。「converters」オプションをjQuery.ajax()に追加し、それを使用して「」応答をnullに変更します(dataTypeがjsonの場合にこれを行います)。何かのようなもの :

var ajax_options =
    {
        /* ... other options here */
        "converters" :
            {
                "text json" :
                    function( result )
                    {
                        if ( result === "" ) result = null;
                        return jQuery.parseJSON( result );
                    }
            }
    };

var dfd = jQuery.ajax( ajax_options );
于 2014-02-22T22:23:10.353 に答える