Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 指令在akka http中同时使用请求头和请求体_Scala_Akka_Akka Http - Fatal编程技术网

Scala 指令在akka http中同时使用请求头和请求体

Scala 指令在akka http中同时使用请求头和请求体,scala,akka,akka-http,Scala,Akka,Akka Http,对于某些API调用中的签名验证,我必须计算来自请求体的签名,并将其与标头中的签名进行比较。由于我找不到任何预定义的指令可以完成这项工作,因此我推出了如下自定义指令: def verifySignature(channelSecret: String): Directive0 = headerValueByName("X-Line-Signature").flatMap { signature => entity(as[String]).flatMap { bodyString =>

对于某些API调用中的签名验证,我必须计算来自请求体的签名,并将其与标头中的签名进行比较。由于我找不到任何预定义的指令可以完成这项工作,因此我推出了如下自定义指令:

def verifySignature(channelSecret: String): Directive0 =
headerValueByName("X-Line-Signature").flatMap { signature =>
  entity(as[String]).flatMap { bodyString =>
    if (computeSignature(channelSecret, bodyString) == signature) pass
    else reject
  }
}
这正如预期的那样有效

所以我只是想知道它是否能更好。 是否有指令可以更好地完成这项工作?
使用传球是否正确?

我觉得这很好
pass
是结束
Directive0
的正确方法,更复杂的Akka HTTP指令(一个随机示例,该指令)使用它

AFAIK没有可用于执行所需任务的特定指令。这是一个非常简单的定制指令,可能不应该有

您可以做一些小小的改进:

  • 您应该使用适当的拒绝来拒绝-以便更容易使用适当的响应+状态代码来处理它们

  • 您可以使用
    &


  •   def verifySignature(channelSecret: String): Directive0 =
        (headerValueByName("X-Line-Signature") & entity(as[String])).tflatMap{
          case (signature, body) if computeSignature(channelSecret, body) == signature => pass
          case _ => reject(ValidationRejection("Invalid signature"))
        }