【问题标题】:How to fix Scala http request addHeader not working如何修复Scala http请求addHeader不起作用
【发布时间】:2021-05-03 22:28:53
【问题描述】:

我的用例是将当前 http 请求的一些标头复制到我正在发出的新请求中。但是它不起作用,你能告诉我是什么问题或任何替代方案吗?

  private def apiPostRequest(path:String, host: HostStoreInfo, byteString:ByteString , prevRequest:HttpRequest):Future[HttpResponse] = {
    val request = HttpRequest(HttpMethods.POST,s"http://${host.host}:${host.port}$path",Nil,HttpEntity.apply(byteString))
    logger.info("Previous request  "+prevRequest)
    if(prevRequest!=null) {
      for(h<-prevRequest.headers) { //Copying over to new request
        logger.info("header  "+h)
        request.addHeader(h)
      }
    }
    logger.info("Here are the headers "+request.headers). // coming as null
    Http().singleRequest(request)
  }

【问题讨论】:

    标签: scala http akka seq


    【解决方案1】:

    请求(就像 scala 中的大多数好东西一样)是不可变的。 .addHeader 返回一个新请求,并添加了标头。

    试试这个:

    val request = Option(prevRequest)// prevRequest should actually be Option[HttpRequest] to begin with. Using nulls is code smell!
      .toSeq
      .flatMap(_.headers)
      .foldLeft(
        HttpRequest(
          HttpMethods.POST,
          s"http://${host.host}:${host.port}$path",
          Nil,
          HttpEntity(byteString)
        )
       ) { _ addHeader _ }
    

    或者更好,就是这样:

       val request = HttpRequest(
          HttpMethods.POST,
          s"http://${host.host}:${host.port}$path",
          Option(prevRequest).toSeq.flatMap(_.headers),
          HttpEntity(byteString)
        )
    

    【讨论】:

    • [ERROR] found : Seq[akka.http.scaladsl.model.HttpHeader] [ERROR] required: scala.collection.immutable.Seq[akka.http.scaladsl.model.HttpHeader] [ERROR ] Option(prevRequest).toSeq.flatMap(_.headers), [ERROR] ^ [ERROR] 发现一个错误尝试第二个选项时出现以下错误
    • @hareendrareddy 我不知道...works for me
    猜你喜欢
    • 2021-03-23
    • 2018-04-24
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多