2015-09-07 163 views
10

我有一個路線如下:阿卡-HTTP:如何設置響應頭

val route = { 
    logRequestResult("user-service") { 
     pathPrefix("user") { 
     get { 
      respondWithHeader(RawHeader("Content-Type", "application/json")) { 
      parameters("firstName".?, "lastName".?).as(Name) { name => 
       findUserByName(name) match { 
       case Left(users) => complete(users) 
       case Right(error) => complete(error) 
       } 
      } 
      } 
     } ~ 
      (put & entity(as[User])) { user => 
      complete(Created -> s"Hello ${user.firstName} ${user.lastName}") 
      } ~ 
      (post & entity(as[User])) { user => 
      complete(s"Hello ${user.firstName} ${user.lastName}") 
      } ~ 
      (delete & path(Segment)) { userId => 
      complete(s"Hello $userId") 
      } 
     } 
    } 
    } 

我的迴應的內容類型應始終application/json,因爲我已經將它設置爲get請求。但是,我在測試中得到的是text/plain。如何在響應中正確設置內容類型?

在附註中,akka-http文檔是我見過的最無價值的垃圾之一。幾乎每個鏈接到示例代碼的鏈接都被打破,他們的解釋僅僅表明了明顯。 Javadoc沒有代碼示例,我無法在Github上找到它們的代碼庫,因此從單元測試中學習也不成問題。

+0

我同意你關於文檔的狀態。我會說雖然作爲一個社區項目,個人可以自由地主動幫助改善他們。 – acjay

+1

@acjay個人只有在掌握好代碼之後才能做出貢獻,這些代碼受到現有的窮人文檔的嚴重阻礙。是的,人們總是可以查看源代碼,但同樣,這不適合初學者,耗時且對大多數問題不應該是必需的。如果他們一直希望人們查看源代碼,他們不應該假裝有任何文檔。 –

回答

9

我發現this一個後,說:「在噴塗/阿卡-HTTP一些頭被視爲專門」。顯然,內容類型就是其中之一,因此不能像我上面的代碼那樣設置。人們必須改爲創建具有所需內容類型和響應主體的HttpEntity。有了這些知識,當我改變get指示如下,它的工作。

import akka.http.scaladsl.model.HttpEntity 
import akka.http.scaladsl.model.MediaTypes.`application/json` 

get { 
    parameters("firstName".?, "lastName".?).as(Name) { name => 
    findUserByName(name) match { 
     case Left(users) => complete(users) 
     case Right(error) => complete(error._1, HttpEntity(`application/json`, error._2)) 
    } 
    } 
}