Scala / Finch - как я могу указать IP-адрес помимо localhost? - PullRequest
0 голосов
/ 21 июня 2019

Я делаю первые шаги с Scala и Finch и работаю над очень простым 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 Ответ

1 голос
/ 27 июня 2019

Существует вариант serve, который принимает SocketAddress.Он не разрешит имя хоста для вас (как это происходит с http4s), поэтому вам нужно будет передать ему разрешенный адрес.

Http.server.serve(new java.net.InetSocketAddress("192.168.0.1", 8080), service)

Обратите внимание, что по умолчанию, когда вы просто передаете ":8081", сервер будет прослушивать все интерфейсы (включая localhost).

...