簡體   English   中英

PlayFramework使用content-type application / json返回BadRequest

[英]PlayFramework returns BadRequest with content-type application/json

我在播放框架面臨問題,在content-type標頭中發送application/json返回BadRequest 我有一個控制器POST方法,需要一些標頭供服務器計算正確的hmac值,其中一個標題是內容類型當我發送application/json作為content-type我得到Badrequest時,它適用於application\\/json ,但問題是我需要讓application / json來計算正確的hmac值。

我已經嘗試過使用Curl,Poster和Java客戶端,我在任何地方都面臨同樣的問題,我有一個用Scala編寫的測試用例,它發送的application / json可以工作(但這是針對MockController和FakeRequest運行的)。

添加一些代碼

這就是我添加內容類型頭httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "\\"application/json\\""); httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application\\/json"); 兩個工作中的任何一個,但普通的應用程序/ json沒有

這是我調用的控制器方法

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

此外,我嘗試使用有效的json主體和空的json,在兩個場景中都使用application / json作為內容類型標頭獲得了BadRequest。

沒有看到你的代碼,很難確定(你在標題中有Java,但用Scala標記了問題),但我懷疑這里的問題是你沒有提供有效的JSON主體和POST請求。

如果對控制器操作使用簡單的Action {...}表單,那么Play將自動嘗試使用anyContent BodyParser解析正文,該使用內容類型標頭來推斷格式。 這意味着,如果你的內容類型為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 “工作”的原因是因為就應用程序而言,它們只是一個隨機字符串,這意味着Play默認解析為一組空的URL編碼值,因此操作成功。

如果由於某種原因,您確實希望將application/json用作內容類型但希望擁有一個空體,則可以使用parse.empty體解析器。 如果你肯定有一個有效的JSON主體,最好明確它並使用parse.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM