リクエスト本文に有効なjsonを投稿するjQuery


180

したがって、jQuery Ajax docsによると、リクエストを送信するときにクエリ文字列の形式でデータをシリアル化しますが、設定processData:falseにより、本文で実際のJSONを送信できます。残念ながら、これが発生していて、2番目のオブジェクトがサーバーに送信されているように見える場合は、最初に判断するのに苦労しています。私が知っているのは、サーバーが私が送信しているものを解析していないということだけです。

httpクライアントを使用してオブジェクトリテラルを投稿する{someKey:'someData'}と、機能します。しかし、jQueryをdata: {someKey:'someData'}で使用すると失敗します。残念ながら、Safariでリクエストを分析すると、メッセージのペイロードは[object Object]...すばらしい...と表示され、Firefoxでは投稿が空白になります...

Java側で本文のコンテンツをログに記録すると、文字どおりに取得される[object Object]ため、REAL JSONデータをどのように送信しますか?

jQueryから送信されたリクエストを使用して、リクエスト本文のJSONデータをシリアル化するJavaサービスの経験はありますか?

ところでここに完全な$ .ajaxリクエストがあります:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});

回答:


292

実際のJSONリクエストは次のようになります。

data: '{"command":"on"}',

実際のJSON文字列を送信する場所。より一般的な解決策として、次のようにJSON.stringify()を使用してオブジェクトをJSONにシリアル化します。

data: JSON.stringify({ "command": "on" }),

JSONオブジェクトを持たない古いブラウザをサポートするには、オブジェクトを追加するjson2.jsを使用します。


現在何が起こっているかは、あなたが持っているからですprocessData: false、それは基本的にこれを送信しています:({"command":"on"}).toString()これは[object Object]あなたがあなたのリクエストで見ているものです...


だから私はもはやprocessData:falseを使用する必要はありませんJSON.stringify()か?
ブラッド、

6
@brad-正解です。これは既に文字列であるため、この後は問題になりません。その場合、jQueryはそれ以上処理しません
Nick Craver

2
魅力のように働きました、本当にありがとう!それでは、すべてのリクエストボディが、反対側で解析される文字列であることが期待されているというのは本当ですか?
ブラッド、

jQueryがdataJSONとして送信するのではなく、なぜを文字列に解析するのですか?
Adam Zerner 2017

サイドノートでは:誰が代わりにフォームデータの「ボディ要求ペイロード」として、それを必要とする場合、含めることを忘れないでくださいcontentType: "application/json; charset=utf-8",:このスレッドで述べたように stackoverflow.com/questions/21201270/...
raydlevel5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.