2012-08-16 77 views
3

我正在使用Play 1.2.4。
我已經設置了路線是這樣的:播放控制器不接受JSON POST

POST /index Application.index(format:'json') 

控制器是這樣的:

public static void index(String json) { 

    Logger.info("content type: %s", request.contentType); 
    Logger.info("json string: %s", json); 
    MyObj obj = new Gson().fromJson(json, MyObj.class); 
    ... 
    ... 
} 

而且我捲曲的要求是這樣的:

curl -v -H "Content-Type: application/json" -X POST -d '{"name":"John Smith","email":"[email protected]","value1":"Value one","value2":"Value two","urls":[{"url":"http://www.google.ca"},{"url":"http://www.msn.ca"}]}' http://localhost:9000/index 

MyObj中具有以下字段:

public String name; 
public String email; 
public String value1; 
public String value2; 
public String[] urls; 

但是,控制器接收到NULL作爲輸入。我究竟做錯了什麼?有人可以告訴我如何使用JSON POST請求並將其轉換爲對象(特別是URL的數組)?謝謝!

回答

7

嘗試更改從json到body的方法參數中的變量名稱。

public static void index(String body) { 

    Logger.info("content type: %s", request.contentType); 
    Logger.info("json string: %s", body); 
    MyObj obj = new Gson().fromJson(body, MyObj.class); 
    ... 
    ... 
} 
+0

這工作。他們爲什麼這樣做? – 2012-08-16 20:14:04

+1

他們看你的方法參數,並試圖看看他們是否可以將它綁定到具有相同名稱的request.params。並且post主體以request.params.body的形式出現(我的想法與你一樣http://stackoverflow.com/questions/8154980/how-do-i-create-a-custom-binder-for -a-json-body) – 2012-08-17 14:35:31

+0

@Briggs:謝謝你。你拯救了我的一週。這個答案需要100個upvotes。 – Gugan 2013-01-15 07:38:27

1

我的假設是因爲您沒有訪問請求,並且您從不輸入您正在訪問的字符串的值,從而爲您提供NULL輸入。

嘗試通過request().body().asJson();調用訪問JSON請求。

也看看http://www.playframework.org/documentation/2.0.1/JavaJsonRequests

它應該給你如何操縱你的JSON請求了堅實的想法。

+0

糟糕,我應該注意到我m在Play 1.2.4上工作。 – 2012-08-16 20:12:51

2

您需要在您的要求來改變這一點:

[{"url":"http://www.google.ca"},{"url":"http://www.msn.ca"}] 

對於這一點:

["http://www.google.ca","http://www.msn.ca"] 

因爲你的對象有一個字符串數組,否則,它會假設中的每個元素該數組是一個對象,其中一個字段名爲「url」(顯然String沒有該字段)

+0

感謝您指出錯誤! – 2012-08-16 20:13:29