要解决Akka Http中使用GET请求时抛出意外关闭服务器连接的问题,可以尝试以下解决方法:
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpRequest
import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.unmarshalling.Unmarshal
import scala.concurrent.duration._
implicit val system = ActorSystem()
implicit val executionContext = system.dispatcher
val request = HttpRequest(uri = "http://example.com")
val responseFuture = Http().singleRequest(request.withRequestTimeout(5.seconds))
responseFuture
.flatMap { response =>
if (response.status == StatusCodes.OK) {
Unmarshal(response.entity).to[String]
} else {
throw new Exception(s"Unexpected status code: ${response.status}")
}
}
.onComplete { result =>
system.terminate()
}
在上述代码中,我们使用了withRequestTimeout
方法将请求超时时间设置为5秒。根据实际情况,可以调整超时时间为合适的值。
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpRequest
import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.unmarshalling.Unmarshal
import scala.util.{Failure, Success}
implicit val system = ActorSystem()
implicit val executionContext = system.dispatcher
val request = HttpRequest(uri = "http://example.com")
val responseFuture = Http().singleRequest(request)
responseFuture
.onComplete {
case Success(response) =>
if (response.status == StatusCodes.OK) {
Unmarshal(response.entity).to[String].onComplete {
case Success(body) =>
println(body)
system.terminate()
case Failure(error) =>
println(s"Failed to unmarshal response body: $error")
system.terminate()
}
} else {
println(s"Unexpected status code: ${response.status}")
system.terminate()
}
case Failure(error) =>
println(s"Request failed: $error")
system.terminate()
}
在上述代码中,我们使用了try-catch块来捕获异常,并在失败的情况下打印错误消息。然后,我们使用system.terminate()
方法关闭ActorSystem。
通过设置超时时间和捕获异常,可以有效地解决Akka Http中使用GET请求时抛出意外关闭服务器连接的问题。根据具体的需求,可以选择适合的解决方案。