2014-06-06 45 views
3

我面臨的問題與播放框架application/json發送內容類型標題返回BadRequest。 我有一個控制器POST方法,需要服務器的幾個標題來計算正確的hmac值,其中一個標題是內容類型 當我發送application/json作爲content-type我得到一個Badrequest,它適用於application\/json,但問題是我需要使用application/json來計算正確的hmac值。我有一個用Scala編寫的測試用例,它發送的應用程序/ json工作正常(但是這是針對MockController和FakeRequest運行的)。我試過用Curl,Poster和Java客戶端, )。PlayFramework返回BadRequest與內容類型的應用程序/ json

添加一些代碼

這是怎麼了添加Content-Type頭httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "\"application/json\"");httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application\/json"); 要麼兩個工作,但普通的應用程序/ JSON的不

這是控制器的方法我打電話

def test() = Action { 
implicit request => 
    Ok("yippiie") 
} 

另外我試着用一個有效的json體和一個空的json,在兩個場景都得到了BadRequest使用application/json作爲內容類型標頭的ios。

+0

請出示代碼被返回錯誤請求 – serejja

+0

你的控制器功能,特別是.. –

+0

控制器方法是一個純POST請求,通過操作{} – Sameer

回答

4

沒有看到你的代碼很難確定(你在標題中有Java,但用Scala標記了問題),但我懷疑這裏的問題是你沒有提供一個有效的JSON正文與POST請求。

如果您使用控制器動作的普通Action {...}形式,則Play將自動嘗試使用anyContentBodyParser解析正文,該正文使用內容類型標題來推斷格式。這意味着,如果你的內容類型爲application/json,那麼你必須有一個有效的JSON體

例如,對於這個動作的代碼(什麼都沒有,或者一個空字符串將足矣。):

def test = Action { 
    Ok("hello, world\n") 
} 

...用無效JSON體調用它(無數據)將失敗:

curl -X POST -H "Content-Type: application/json" http://localhost:9000/test 
< HTTP/1.1 400 Bad Request 

而提供有效的JSON體(空物體)會成功:

curl -d "{}" -X POST -H "Content-Type: application/json" http://localhost:9000/test 
< hello, world 

的原因與其他形式的application/json的「工作」是因爲就應用而言,他們只是一個隨機字符串,這意味着播放默認解析爲空集的URL編碼值,並該行動因此成功。

如果由於某種原因,你想用application/json作爲內容類型,但希望有一個空的身體,你可以使用parse.empty體解析器。如果你確實有一個有效的JSON體,最好是明確地說明它並使用parse.json

+0

即'動作(parse.json)'包圍。 –

+0

@LimbSoup:謝謝,我已經添加了一個說明。 – Mikesname

+0

@Mikesname我在最後的問題中添加了控制器方法代碼 – Sameer

相關問題