2011-01-01 9 views
3

Javascriptから(Prototypeを使用して)JSON形式のデータをGrailsにPOSTしようとしています。AJAXがJavascriptからGrailsにJSONデータを投稿

var JSONObject = new Object; 
    JSONObject.id = "23"; 
    JSONObject.name = "Test 1"; 
    JSONstring = JSON.stringify(JSONObject); 



var url = "${createLink(controller:'testController', action:'receiveJson')}"; 
    new Ajax.Request(url, { 
     method:'post', 
     contentType:'application/json', 
     parameters:JSONstring, 
     asynchronous:true, 
     onSuccess: function (req) { 
     sendInfoResponse(req.responseText); 
     } 
    }); 

と私のGrailsコントローラのコードは次のとおりです:私のJavascriptのコードがある

def receiveJson = { 
    def json = request.JSON; 
} 

しかし、 'JSON' 変数は、私のテストでは、空のように見えます。誰かが私が間違っていることを説明できるなら、私はとても感謝しています。どうもありがとう。

+1

アプリケーションのマニュアルテストまたは適切なユニット/統合テストを意味しますか? – mfloryan

答えて

0

Ajax.Requestを正しく呼び出すとは思わないでしょう。ドキュメントから、パラメータオプション:

"リクエストのパラメータは、 'get'メソッドのURLにエンコードされるか、または他のメソッドのリクエストボディにエンコードされます。 URLエンコードされた文字列、またはパラメータを表すプロパティを持つ任意のハッシュ互換オブジェクト(基本的には何でも)として使用できます。

は、私はあなたが

... 
parameters: {json: JSONString} 
... 

ような何かをする必要があると思うと、あなたのコントローラに

request.json 

は、パラメータの形式を注意オブジェクトリテラル - それは、要求キーを作るためにPrototypeライブラリーに指示します'json'であり、要求値はjson文字列です。コントローラの要求オブジェクトからキーにアクセスします。

EDIT - 私はあなたがjavascriptブロックがジャックアップされていることを認識しました。

この:

var JSONObject = new Object; 

は、あなたも、単にオブジェクトリテラルを行うことができるかもしれないmfloryanので

var jsonObject = {}; 
.... 
1

良い質問

var JSONObject = new Object(); 
... 

のようなものでなければなりません - 私は手動でテストを行っていました。つまり、ユニットまたは統合の一部としてではありませんテスト。

ありがとうございます。hvgotcodesあなたが示唆したように私は自分のコードに変更を加えましたが、残念ながら役に立たなくなりました。興味深いことに、私がrequest.JSONを印刷すると{}が得られますが、request.jsonを印刷するとnullとなります。

EDIT:request.JSON.toString()

EDITを:: '印刷' とは、私が使用して意味のヘルプはとてもありがとうございました。いったん私が最終的な変更を行ったら、John Wagenleitneはコードが適切に機能し始めたことを示唆しました。私はあなたの助けを借りて本当に感謝しています。

+0

あなたが参照した答えが問題を解決した場合は、その答えに着目してマークする必要があります。 – JeffSea

5

あなたのAjaxで。

%7B%22id%22%3A%2223%22%2C%22name%22%3A%22Test%201%22%7D&_= 

の代わりに:リクエストのオプションパラメータを使用して

postBody:JSONstring, 

問題に

parameters:JSONstring, 

を変更するには、リクエストボディはこのように見て終わるように、それはURLがデータを符号化することです希望するもの(postBodyのものです):

{"id":"23","name":"Test 1"} 
+0

また、 'parameters:JSONObject 'を実行し、' JSONstring'を完全に省略すると、Prototypeはそれを正しくエンコードします。 – clockworkgeek

+0

@clockworkgeekこれはオブジェクトをキーと値のペアとしてエンコードします:id = 23&name = Test%201&_ =。これをコントローラのparams.idとparams.nameとしてアクセスできますが、オリジナルのポスターが望んだと思うrequest.JSONを介してJSONオブジェクトとして解析されることはありません。 –

+0

十分です。私はその要求を誤解した。 – clockworkgeek

関連する問題