2017-03-13 7 views
-1

としてPlainObjectを受け付けていないI、次のコードを有する:jQueryのAjaxの方法は、データ

$.ajax({ 
    method: "POST", 
    url: "/handler", 
    contentType: "application/json", 
    data: data_all, 
    }) 
.done(function(r) { ...stuff... }) 
.fail(function(r) { ...stuff... }); 

data_allが辞書である(例えば、{"a":1, "b":2})。このコードを実行すると、現在400エラーが返されます(関連する場合はdjangoを使用)。 1つを変更した場合:

... 
    data: JSON.stringify(data_all), 
    ... 

すべてが動作します。

事はそうではありません。 jQuery AJAXのドキュメントには、data引数が文字列、配列、およびPlainObjectsを受け入れることが明確に記載されています。 (クロームdevのツールを使用して)デバッガモードでは、私はdata_allがPlainObjectであることを確認したら:

jQuery.isPlainObject(data_all) # returns "true" 

私はjQueryの2.1.4を使用していますので、これはあるはずです。なぜこれにstringify機能が必要なのでしょうか?

+0

@Mikey - ありがとう、固定 – eykanal

+0

右に、オブジェクトを付けることができます。しかし、jQueryは、指定されたコンテンツタイプに一致するようにオブジェクトを自動変換しません。 Objectがjsonでない場合、jqueryはそのオブジェクトをparam文字列に変換します。したがって、コンテンツタイプに無効なデータが与えられます。それはドキュメントのすべてです。 –

+0

ブラウザの開発者ツールの[ネットワーク]タブを見て、それぞれの場合に何がサービスに渡されるのかを確認します。また、ajaxオプションオブジェクトで 'processData:false'を設定することもできます。 –

答えて

0

jsonデータをjqueryで送信するには、オブジェクトをjQueryに渡す前にオブジェクトを文字列化する必要があります。 jQueryはあなたのためにそれをしません。

processDataパラメータがtrue(デフォルト)でdataパラメータに文字列が含まれていない場合、dataパラメータの値は$.param()に渡され、param文字列が作成されます。したがって、オブジェクトをデータパラメータに渡すと、リクエスト本体にa=1&b=2が含まれます。単にprocessDataをfalseに設定すると、jqueryは$.paramプロセスをスキップし、オブジェクトの.toString値をリクエスト本体に直接送信します。これはなので、どちらも機能しません。オブジェクトをJSONにストリング化すると、そのオブジェクトは文字列になり、jQueryはそれを変更せずに要求本体に渡します。

関連する問題