Начальная загрузка веб-сервера в Scala - PullRequest
10 голосов
/ 12 ноября 2010

Возможно следующее с использованием Python:

$ apt-get install python
$ easy_install Flask
$ cat > hello.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
$ python hello.py

4 команды и 7 строк кода для запуска веб-сервера действительно впечатляют.

Что такое эквивалент Scala?

Ответы [ 8 ]

11 голосов
/ 22 июня 2011

Используется класс HttpServer, встроенный в JDK6. Не стесняйтесь предлагать улучшения, я новичок в Scala.

package org.test.simplehttpserver

import java.net.InetSocketAddress
import com.sun.net.httpserver.{HttpExchange, HttpHandler, HttpServer}
import collection.mutable.HashMap

abstract class SimpleHttpServerBase(val socketAddress: String = "127.0.0.1",
                                    val port: Int = 8080,
                                    val backlog: Int = 0) extends HttpHandler {
  private val address = new InetSocketAddress(socketAddress, port)
  private val server = HttpServer.create(address, backlog)
  server.createContext("/", this)

  def redirect(url: String) =
    <html>
      <head>
          <meta http-equiv="Refresh" content={"0," + url}/>
      </head>
      <body>
        You are being redirected to:
        <a href={url}>
          {url}
        </a>
      </body>
    </html>

  def respond(exchange: HttpExchange, code: Int = 200, body: String = "") {
    val bytes = body.getBytes
    exchange.sendResponseHeaders(code, bytes.size)
    exchange.getResponseBody.write(bytes)
    exchange.getResponseBody.write("\r\n\r\n".getBytes)
    exchange.getResponseBody.close()
    exchange.close()
  }

  def start() = server.start()

  def stop(delay: Int = 1) = server.stop(delay)
}

abstract class SimpleHttpServer extends SimpleHttpServerBase {
  private val mappings = new HashMap[String, () => Any]

  def get(path: String)(action: => Any) = mappings += path -> (() => action)

  def handle(exchange: HttpExchange) = mappings.get(exchange.getRequestURI.getPath) match {
    case None => respond(exchange, 404)
    case Some(action) => try {
      respond(exchange, 200, action().toString)
    } catch {
      case ex: Exception => respond(exchange, 500, ex.toString)
    }
  }
}

class HelloApp extends SimpleHttpServer {
  var count = 0

  get("/") {
    "There's nothing here"
  }

  get("/hello") {
    "Hello, world!"
  }

  get("/markup") {
    <html>
      <head>
        <title>Test Title</title>
      </head>
      <body>
        Test Body
      </body>
    </html>
  }

  def countPage = <html>
    <head>
      <title>Test Title</title>
    </head>
    <body>
      Count:
      {count}<a href="/increaseCount">++</a>
      <a href="/decreaseCount">--</a>
      <a href="/resetCount">Reset</a>
    </body>
  </html>

  get("/count") {
    countPage
  }

  get("/resetCount") {
    count = 0
    redirect("/count")
  }

  get("/increaseCount") {
    count = count + 1
    redirect("/count")
  }

  get("/decreaseCount") {
    count = count - 1
    redirect("/count")
  }

  get("/error") {
    throw new RuntimeException("Bad bad error occurred")
  }
}

object Main {

  def main(args: Array[String]) {
    val server = new HelloApp()
    server.start()
  }
}
10 голосов
/ 12 ноября 2010

Я знаю Макс уже упомянул это, но я не мог удержаться, указывая * * * * * * * * * * Скалатра * hello world:

import org.scalatra._

class ScalatraExample extends ScalatraServlet {
  get("/") {
    <h1>Hello, world!</h1>
  }
}

В любом случае, взгляните на доступные веб-фреймворки Scala .

РЕДАКТИРОВАТЬ

Есть некоторые дискуссии о том, как легко получить инструмент готов, особенно в отношении подъема.Итак, вот сессия по Ubuntu.Большая часть моего времени была потрачена на то, чтобы выяснить, куда делась Java Sun в менеджере пакетов.Как бы то ни было, после установки Java все прошло, и все сообщения были удалены, поэтому можно увидеть, что я на самом деле должен был набрать:

dcs@dcs-desktop:~$ wget -q -O bin/sbt-launch.jar http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.4.jar
dcs@dcs-desktop:~$ echo 'java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"' > bin/sbt
dcs@dcs-desktop:~$ chmod u+x bin/sbt
dcs@dcs-desktop:~$ mkdir app
dcs@dcs-desktop:~$ cd app
dcs@dcs-desktop:~/app$ sbt
Project does not exist, create new project? (y/N/s) s
> *lifty is org.lifty lifty 1.4
> lifty create project-blank sample 2.1
> reload
> update
> jetty-run

Там работает веб-сервер.Конечно, вы должны знать о SBT и Lifty заранее, чтобы даже знать, что вы будете использовать их для запуска программы Scala Lift, но, с другой стороны, я никогда не слышал о Flask, так что я бы наверняка потратилбольше времени пытаясь понять, как запустить приложение веб-сервера на Python, чем я получил Lift.

С первой попытки я тоже не понял - я пытался перейти на Scala 2.8.1 (в приведенном выше примере используется версия 2.7.7 по умолчанию, хотя также будет работать версия 2.8.0), только для того, чтобы узнать, что для этой версии Scala еще нет версии Lift.С другой стороны, у меня уже был установлен lifty, и я удалил его, просто чтобы показать команду, которая его устанавливает.

Хотелось бы, чтобы был пакет Debian / Ubuntu для SBT - это просто крошечная оболочкав конце концов, скрипт и файл jar, и он заботится о загрузке Scala, Lift и т. д. и в любой нужной версии.

Это модель, отличная от Python и Ruby, где язык поставляется сменеджер пакетов, который обрабатывает большинство вещей.

10 голосов
/ 12 ноября 2010

Вы можете найти Нефильтрованный , достойный внимания.

4 голосов
/ 12 ноября 2010

Ну, есть Scalatra , который стремится быть аналогом Sinatra Руби с точки зрения функциональности и простоты использования.

2 голосов
/ 13 ноября 2010

В этом решении используется конечная точка JAX-WS:

import java.io._
import javax.xml.ws._
import javax.xml.ws.http._
import javax.xml.transform._
import javax.xml.transform.stream._

@WebServiceProvider
@ServiceMode(value=Service.Mode.PAYLOAD)
class P extends Provider[Source] {
  def invoke(source: Source) = new StreamSource( new StringReader("<p>Hello There!</p>"));
}

val address = "http://127.0.0.1:8080/"
Endpoint.create(HTTPBinding.HTTP_BINDING, new P()).publish(address)

println("Service running at "+address)
println("Type [CTRL]+[C] to quit!")

Thread.sleep(Long.MaxValue)

Вы можете скопировать его в файл WebServer.scala и запустить его, набрав:

scala WebServer.scala
1 голос
/ 29 сентября 2011

Эквивалент Scala состоит из 6 команд:

$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
$ ~/bin/cs n8han/giter8
$ ~/bin/g8 scalatra/scalatra-sbt --name=scalatra-example
$ cd scalatra-example
$ wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.0/sbt-launch.jar
$ java -Xmx512M -jar sbt-launch.jar ~jetty-run

Использование Play,

step #1 download Play, then
$ play install scala
$ play new myproject --with scala
$ play run myproject
1 голос
/ 13 ноября 2010

Вы можете использовать встроенный Jetty Server:

/*
 * Required Libs: Jetty, Servlet API
 *
 * Compile:
 *   scalac -cp jetty-6.1.14.jar:jetty-util-6.1.14.jar:servlet-api-2.5-6.1.14.jar WebServer.scala
 *
 * Run:
 *  scala -cp .:jetty-6.1.14.jar:jetty-util-6.1.14.jar:servlet-api-2.5-6.1.14.jar WebServer
 */
import org.mortbay.jetty.Server
import org.mortbay.jetty.servlet.Context
import javax.servlet.http.{HttpServlet,
                       HttpServletRequest, 
                       HttpServletResponse}

class HelloServlet extends HttpServlet {
  override def doGet(req : HttpServletRequest, resp : HttpServletResponse) =
    resp.getWriter().print("Hello There!")
}

object WebServer {
  def main(args: Array[String]) {
    val server = new Server(8080)
    val root = new Context(server, "/", Context.SESSIONS)
    root.addServlet(classOf[HelloServlet], "/*")
    server.start()

    println("Point your browser to http://localhost:8080/")
    println("Type [CTRL]+[C] to quit!")

    Thread.sleep(Long.MaxValue)
  }
}

Если вы хотите сравнить LOC, вы используете HTTP-сервер, встроенный в Sun JDK.Другим решением может быть использование javax.xml.ws.Endpoint и API провайдера.

0 голосов
/ 11 февраля 2017

Как упомянуто Дэвид Уинслоу , Нефильтрованный Фрагмент кода использования

ИНФОРМАЦИЯ: Простые возможности API для Apache Spark Пример подсчета слов, написанный на Scala с использованием неотфильтрованного.

object SimplePlan extends Plan {
  def intent = {
  case req @ GET(Path("/get")) => {
    Ok ~> ResponseString(WordCount.count("Test #1: Test the Default word count program").mkString("\n"));
  }

  case req @ POST(Path("/get_custom")) => {
    val custom_string = Body.string(req)
    Ok ~> ResponseString(WordCount.count(custom_string).mkString("\n"))
  }
 }
}

object SimpleServer extends App {
  val bindingIP = SocketPortBinding(host = "localhost", port = 8080)
  unfiltered.jetty.Server.portBinding(bindingIP).plan(SimplePlan).run()
}

Полный пример: здесь

...