2015-09-07 165 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)) 
    } 
    } 
}