Akka http 使用 body 添加 header 到 POST 请求

Akka http add header to POST request with body

我有一个 akka http 路由,它在请求的 body 中接受 json。我正在尝试使用 akka http 测试套件测试该路由。

val header = RawHeader("Content-Type", "application/json")
Post("/tasks", trigger.asJson.noSpaces) ~> addHeader(header) ~>
    addCredentials(OAuth2BearerToken(VALID_TOKEN)) ~> Route.seal(route) ~> check {
    status shouldBe StatusCodes.OK
  }

此测试失败并显示消息

415 Unsupported Media Type was not equal to 200 OK 

如何正确地将内容类型 header 添加到请求中?

让 akka-http 自己创建 RequestEntity 而不是自己将 json 作为 String 传递。

您只需将 trigger 作为 Post.apply 的第二个参数按原样传递即可。

Post("/tasks", trigger) ~> addCredentials(OAuth2BearerToken(VALID_TOKEN)) ~> Route.seal(route) ~> check {
  status shouldBe StatusCodes.OK
}

这将需要在您的隐式上下文中提供 ToEntityMarshaller[Trigger]

你可以像在路由定义中一样添加它 importing/extending de.heikoseeberger.akkahttpargonaut.ArgonautSupport 和 argonaut CodecJson[Trigger] 例如,如果你使用 argonaut。

如果您想传递任意字符串值,请执行

Post("/tasks").withEntity(ContentTypes.`application/json`, someJsonAsString) ~> addCredentials(OAuth2BearerToken(VALID_TOKEN)) ~> Route.seal(route) ~> check {
   status shouldBe StatusCodes.OK
}