Akka HTTP将标头添加到带有正文的POST请求中

时间:2019-01-03 01:19:53

标签: scala unit-testing akka akka-http akka-testkit

我有一个akka http路由,该路由在请求正文中接受json。我正在尝试使用Akka http测试工具来测试该路由。

<?php include_once("../../../config.php");

$sql= "SELECT * FROM cpg"; $result=mysqli_query($conn,$sql);
    while($row = mysqli_fetch_array($result)){
        $rows[] = $row;
    }
    echo json_encode($rows); **}** ?>

此测试失败,并显示消息

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
  }

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

1 个答案:

答案 0 :(得分:0)

让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]

例如,如果您使用的是argonaut,则可以通过导入/扩展de.heikoseeberger.akkahttpargonaut.ArgonautSupport和argonaut CodecJson[Trigger]来以与路由定义相同的方式添加它。

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

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