简体   繁体   中英

How to implement Akka HTTP Request Post Client Headers Authorization

I'am trying to implement Akka http client for post request where Authorization will be given in header from postman. I am not able to authorize, following is my code

 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
    })

  }

Whatever value I give from postman. It serves the request. What I am skipping?

My use case is that result showed be displayed only after authorization

You are pattern matching on HttpRequest .

The requestHeader you use there is not the one you specified earlier but will be the headers from the HttpRequest itself.

One way to resolve it could be checking for the values in the headers:

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

Here is one problem:

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

This does not match the current value of requestHeader , it creates a new value requestHeader containing the current headers of the HttpRequest . So this match will not check the Authorization field of the header. You will have to do this manually.

More generally, it would be worth looking at the Route support in Akka HTTP as a cleaner and more powerful way of implementing a server.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM