Arrancando un servidor web en Scala

Lo siguiente es posible usando 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 comandos y 7 líneas de código para que un servidor web funcione es realmente impresionante.

¿Cuál es el equivalente de Scala?

Esto utiliza la clase HttpServer que está integrada en JDK6. Siéntete libre de sugerir mejoras, soy nuevo en 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) =      You are being redirected to:  https://stackoverflow.com/questions/4161460/bootstrapping-a-web-server-in-scala/{url}    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") {   Test Title   Test Body   } def countPage =   Test Title   Count: {count}++ -- Reset   get("/count") { countPage } get("https://stackoverflow.com/resetCount") { count = 0 redirect("/count") } get("https://stackoverflow.com/increaseCount") { count = count + 1 redirect("/count") } get("https://stackoverflow.com/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() } } 

Sé que Max ya lo mencionó , pero no pude resistirme a señalar las 6 líneas del mundo de Scalatra :

 import org.scalatra._ class ScalatraExample extends ScalatraServlet { get("/") { 

Hello, world!

} }

De todos modos, eche un vistazo a los marcos web de Scala disponibles.

EDITAR

Existe una discusión acerca de lo fácil que es preparar las herramientas , particularmente con respecto a Lift. Entonces, aquí hay una sesión en Ubuntu. La mayor parte de mi tiempo lo pasé tratando de averiguar dónde estaba la Java de Sun en el administrador de paquetes. De todos modos, una vez que se instaló Java, así es como funcionó, con todos los mensajes ocultos, para que pueda ver lo que realmente tenía que escribir:

 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 

Allí, el servidor web en ejecución. Por supuesto, tienes que saber sobre SBT y Lifty de antemano, incluso para saber que los usarías para ejecutar un progtwig de Scala Lift, pero, por otro lado, nunca había oído hablar de Flask, por lo que sin duda pasaría mucho tiempo. más tiempo tratando de averiguar cómo hacer que una aplicación de servidor web funcione en Python que la que obtuve con Lift one.

Tampoco lo entendí bien en el primer bash. Intenté usar Scala 2.8.1 (la anterior usa una versión predeterminada 2.7.7, aunque 2.8.0 también funcionará), solo para descubrir que no hay una versión Lift. disponible para esa versión de Scala todavía. Por otro lado, ya tenía LifeTall instalado y lo desinstalé solo para mostrar el comando que lo instala.

Me gustaría que hubiera un paquete Debian / Ubuntu para SBT; después de todo, es solo un pequeño script de shell y un archivo jar, y se encarga de descargar Scala, Lift, etc., y en la versión que necesites.

Es un modelo diferente al de Python y Ruby, donde el lenguaje viene con un administrador de paquetes que maneja la mayoría de las cosas.

Podrías encontrar Unfiltered que vale la pena ver.

Bueno, está Scalatra , que pretende ser análogo al Sinatra de Ruby en términos de funcionalidad y facilidad de uso.

Esta solución utiliza un punto final 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("

Hello There!

")); } 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)

Puede copiarlo en un archivo WebServer.scala y ejecutarlo simplemente escribiendo:

 scala WebServer.scala 

Podría usar un servidor Jetty integrado:

 /* * 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) } } 

En caso de que busque una comparación de LOC, utilice el servidor HTTP integrado con Sun JDK. Otra solución podría ser utilizar javax.xml.ws.Endpoint y la API del proveedor.

El equivalente de Scala está en 6 comandos:

 $ 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 

Usando el juego,

 step #1 download Play, then $ play install scala $ play new myproject --with scala $ play run myproject 

Como mencionó David Winslow , fragmento de código de uso sin filtrar

INFO: capacidades API simples para el ejemplo de conteo de palabras de Apache Spark escrito en Scala usando Sin filtro.

 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() } 

El ejemplo completo está aquí