Scala / Finch-除了本地主机,我如何指定IP地址?

时间:2019-06-21 19:59:57

标签: scala finch

我正在使用Scala和Finch迈出第一步,并开发一个非常简单的rest API。当前,一切正常,但是除了“ localhost”之外,我无法提供任何服务,并且我没有明显的方法来指定它。

我搜索了最后一个小时并整理了文档,但我无法确定我打算如何指定IP地址

object Main extends App with Endpoint.Module[IO] {
  val egService = new EgService
  val IPService = new IPService
  val hostIP = IPService.getIP

  def healthCheck: Endpoint[IO, String] = get(pathEmpty) { Ok("OK") }

  def helloWorld: Endpoint[IO, Message] = get("hello") {
    egService.getMessage().map(Ok)
  }

  def sayHello: Endpoint[IO, Message] = get("hello" :: path[String]) {
    s: String =>
      egService.getMessage(s).map(Ok)
  }

  def service: Service[Request, Response] =
    Bootstrap
      .serve[Text.Plain](healthCheck.handle {
        case e: Exception => InternalServerError(e)
      })
      .serve[Application.Json](helloWorld.handle {
        case e: Exception => InternalServerError(e)
      } :+: sayHello.handle {
        case e: Exception => InternalServerError(e)
      })
      .toService

  println(s"Trying to serve $hostIP on port 8080...")
  Await.ready(Http.server.serve(":8080", service))
}

正如我所说,上面的代码完全按我的预期工作,并且我可以卷曲localhost:8080来获得适当的响应,但除此之外,我感到很困惑。我尝试指定:

Http.server.serve(s"$hostIP:8080", service)

但这似乎被忽略了。除此之外,我完全感到困惑。使用http4s时很简单:

BlazeServerBuilder[IO]
  .bindHttp(8080, hostIP)

所以我觉得我必须缺少明显的东西。

1 个答案:

答案 0 :(得分:1)

有一个serve的{​​{1}}变体。它不会为您解析主机名(就像使用http4s一样),因此您需要将解析后的地址传递给它。

SocketAddress

请注意,默认情况下,当您简单地传递Http.server.serve(new java.net.InetSocketAddress("192.168.0.1", 8080), service) 时,服务器将侦听所有接口(包括本地主机)。