2013-08-24 56 views
2

我已經閱讀了幾篇關於如何做到這一點的文章,並且我可以讓它在中途工作。發送ajax json播放框架的正確方法

此作品(發送JSON對象爲文本):

  function go(itemid) 
      { 
       apiRoutes.controllers.Application.addItem(itemid).ajax({ 
        data: '{"reqid":0,"iid":2,"description":"adsf"}', 
        dataType: 'text', 
      contentType:'application/json', 
        success: function(reply) { 
         alert(reply) 
        } 
       }); 
      } 

這不(發送對象爲JSON):

  function go(itemid) 
      { 
       apiRoutes.controllers.Application.addItem(itemid).ajax({ 
        data: {"reqid":0,"iid":2,"description":"adsf"}, 
        dataType: 'text', 
      contentType:'application/json', 
        success: function(reply) { 
         alert(reply) 
        } 
       }); 
      } 

而且我真正想要做的就是這樣的事情(我已經設置了適當的組合子):

  function go(itemid) 
      { 
       apiRoutes.controllers.Application.addItem(itemid).ajax({ 
        data: @Html(Json.stringify(Json.toJson(item))), 
        dataType: 'text', 
      contentType:'application/json', 
        success: function(reply) { 
         alert(reply) 
        } 
       }); 
      } 

我的控制器看起來是這樣的:

def addItem(id: Long) = Action (parse.json) { implicit request => 
    Logger.info("add item") 
    request.body.validate(Item.itemReads).map { item => 
    thing.addItem(item) 
    Ok("Succesfully added item.") 
    }.recoverTotal{ 
     e => BadRequest("Detected error:"+ JsError.toFlatJson(e)) 
    } 
    } 

在第二種情況下,它永遠不會記錄到日誌代碼。相反,它會立即返回一個400錯誤請求(這可能是我認爲在Action(parse.json)位觸發的東西)。

我寧願發送對象作爲json,因爲當我轉換爲字符串和描述恰好有一個撇號('),弄亂了事情。我可能probaby逃避撇號,但希望我錯過了一些簡單的事情如何用一個對象而不是字符串做到這一點。

感謝

回答

1

正如APIdataType PARAM描述的是用於設置:

,你是從服務器期待後面的數據類型。

對於發送json使用你的第二種方法(不要把它作爲字符串發送)。使用Web瀏覽器檢查器驗證是否發送了正確的數據。據我所知,你不應該接受有效的JSON對象

+1

我做了一些修改的問題。我現在明白dataType與響應有關,但我仍然有問題發回JSON對象。它看起來像我有效的JSON,但我不斷收到「無效的JSON」400錯誤。這不是由我的控制器代碼直接引發的,因爲它從來沒有設法訪問日誌記錄語句。 – jb44

+0

我遇到了同樣的問題。答案是檢查,但我沒有看到任何不同。你是否仍然需要串化json對象? – Khanetor

0

如果您要發送jQuery的非字符串化JSON對象後有問題,Handling the JSON request,$就自動嘗試與$ .PARAM處理它,

如果您在Ajax調用的數據是這樣的:

data: {"reqid":0,"iid":2,"description":"adsf"} 

這是$就在引擎蓋下發之前做:

$.param({"reqid":0,"iid":2,"description":"adsf"}) 
// "reqid=0&iid=2&description=adsf" 

它接受JSON並將其序列化爲表單URL編碼格式。而你的服務器期待JSON。我建議最好的方式來解決這個問題是在發送前剛剛字符串化:

data: JSON.stringify({"reqid":0,"iid":2,"description":"adsf"}) 

來源:http://api.jquery.com/jQuery.ajax/#sending-data-to-server