Bootstrapping eines Webservers in Scala

Das folgende ist möglich mit 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 Befehle und 7 Zeilen Code, um einen Webserver zu bekommen, ist sehr beeindruckend.

Was ist das Scala-Äquivalent?

8 Solutions collect form web for “Bootstrapping eines Webservers in Scala”

Ich weiß, Max Alread erwähnt es, aber ich konnte nicht widerstehen, auf Scalatras 6 Zeilen Hallo Welt:

 import org.scalatra._ class ScalatraExample extends ScalatraServlet { get("/") { <h1>Hello, world!</h1> } } 

Wie auch immer, werfen Sie einen Blick auf verfügbare Scala Web Frameworks .

BEARBEITEN

Es gibt einige Diskussionen darüber, wie einfach ist es, die Werkzeuge bereit, vor allem in Bezug auf Lift. Also, hier ist eine Session auf Ubuntu. Die meiste Zeit wurde verbracht, um herauszufinden, woher Suns Java in den Paketmanager gegangen ist. Jedenfalls, sobald Java installiert wurde, ist es so, wie es ging, mit allen Nachrichten elft, so kann man sehen, was ich eigentlich geben musste:

 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 

Dort läuft der Webserver. Natürlich musst du vorher über SBT und Lifty Bescheid wissen, um zu wissen, dass du sie benutzen würdest, um ein Scala Lift Programm zu laufen, aber auf der anderen Seite hatte ich noch nie von Flask gehört, also würde ich sicherlich weg verbringen Mehr Zeit versucht, herauszufinden, wie man eine Web-Server-Anwendung geht in Python als ich ein Lift ein bekommen bekommen.

Ich habe es auch nicht richtig gemacht – ich habe versucht, für Scala 2.8.1 zu gehen (das obige verwendet eine Standard-Version 2.7.7, obwohl 2.8.0 auch funktioniert), nur um herauszufinden, dass es keine Lift-Version gibt Verfügbar für diese Version von Scala noch. Auf der anderen Seite war ich schon heftig installiert und habe es nur installiert, um den Befehl zu zeigen, der ihn installiert.

Ich wünschte, es gab ein Debian / Ubuntu-Paket für SBT – es ist nur ein kleines Shell-Skript und eine JAR-Datei, und es kümmert sich um das Herunterladen von Scala, Lift, etc und bei welcher Version Sie auch brauchen.

Es ist ein anderes Modell als Python und Ruby, wo die Sprache kommt mit einem Paket-Manager, die die meisten Dinge behandelt.

Dies verwendet die HttpServer-Klasse, die in JDK6 eingebaut ist. Fühlen Sie sich frei, Verbesserungen vorzuschlagen, ich bin neu in 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() } } 

Vielleicht findest du Ungefiltert einen Blick.

Nun, es gibt Scalatra , die analog zu Rubys Sinatra in Bezug auf Funktionalität und Benutzerfreundlichkeit ist.

Diese Lösung verwendet einen JAX-WS Endpunkt:

 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) 

Sie können es in eine Datei WebServer.scala kopieren und es einfach durch Eingabe von:

 scala WebServer.scala 

Du könntest einen eingebetteten Jetty Server benutzen:

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

Falls Sie auf einen LOC-Vergleich zielen, verwenden Sie den mit dem Sun JDK eingebetteten HTTP-Server. Eine andere Lösung könnte sein, javax.xml.ws.Endpoint und die Provider API zu verwenden.

Scala-Äquivalent ist in 6 Befehlen:

 $ 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 

Mit Play spielen,

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

Wie David Winslow erwähnt hat, ungefilterter Gebrauchscode-Snippet

INFO: Einfache API-Funktionen für Apache Spark Word Count Beispiel in Scala mit Unfiltered geschrieben.

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

Komplettes Beispiel hier

  • Wie benutzt man die JDBC-Quelle zum Schreiben und Lesen von Daten in (Py) Spark?
  • Eine Liste oder Karte als Funktionsargumente in Scala einpacken
  • Interpretation einer Benchmark in C, Clojure, Python, Ruby, Scala und andere
  • Was sind die Spark-Transformationen, die einen Shuffle verursachen?
  • Scala entspricht Python-Generatoren?
  • Slice Notation in Scala?
  • Wie man eine Textdatei in mehrere Spalten mit Spark aufteilt
  • Gibt es ein Scala / Java-Äquivalent von Python 3's Sammlungen.Counter
  • Mehrfach-Funken-Bewerbungsunterlagen im Standalone-Modus
  • Wie man zwei Dataframes vergleicht und zusätzliche Zeilen in einem der beiden Dataframs druckt und auch Spalten druckt, die sich in der Scala unterscheiden
  • Scala: Merkmal für ein Funktionsobjekt mit variablen Längenargumenten?
  • Python ist die beste Programmiersprache der Welt.