簡體   English   中英

如何實現 Akka HTTP Request Post Client Headers Authorization

[英]How to implement Akka HTTP Request Post Client Headers Authorization

我正在嘗試為發布請求實現 Akka http 客戶端,其中授權將在 header 中來自 Z03D476861AFCCFA85181 我無法授權,以下是我的代碼

 def main(args: Array[String]) {

    implicit val system: ActorSystem = ActorSystem()
    implicit val materializer: ActorMaterializer = ActorMaterializer()
    implicit val executionContext: ExecutionContextExecutor = system.dispatcher
    val requestHeader = scala.collection.immutable.Seq(RawHeader("Authorization", "admin"))

    val requestHandler: HttpRequest => HttpResponse = {

      case HttpRequest(POST, Uri.Path("/GetTrackerData"), requestHeader, entity, _) =>
        val chunk = Unmarshal(entity).to[DeviceLocationData]

        val deviceLocationData = Await.result(chunk, 1.second)

        val responseArray = "Authorized"
        HttpResponse(entity = HttpEntity(ContentTypes.`application/json`, responseArray)
        )

      case r: HttpRequest =>
        println(r.uri.toString())
        r.discardEntityBytes() // important to drain incoming HTTP Entity stream
        HttpResponse(404, entity = "Unknown resource!")
    }

    val bindingFuture = Http().bindAndHandleSync(requestHandler, "0.0.0.0", 7070)
    println(s"iot engine api live at 0.0.0.0:7070")
    sys.addShutdownHook({
      println("ShutdownHook called")
      bindingFuture
        .flatMap(_.unbind()) // trigger unbinding from the port
        .onComplete(_ => system.terminate()) // and shutdown when done
    })

  }

無論我從 postman 給出什么值。 它服務於請求。 我在跳過什么?

我的用例是僅在授權后顯示結果

您正在HttpRequest上進行模式匹配。

您在那里使用的requestHeader不是您之前指定的,而是來自 HttpRequest 本身的標頭

解決它的一種方法是檢查標頭中的值:

case HttpRequest(HttpMethods.POST, Uri.Path("/GetTrackerData"), headers, entity, _) 
  if (headers.exists(h => h.name == "Authorization" && h.value ==  "admin"))  =>

這是一個問題:

  case HttpRequest(POST, Uri.Path("/GetTrackerData"), requestHeader, entity, _) =>

這與requestHeader的當前值不匹配,它會創建一個新值requestHeader ,其中包含HttpRequest的當前標頭。 所以這個匹配不會檢查 header 的Authorization字段。 您必須手動執行此操作。

更一般地說,值得關注 Akka HTTP 中的Route支持,作為實現服務器的更清潔和更強大的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM