Einfache und übersichtliche HTTP-Client-Bibliothek für Scala

76

Ich benötige eine ausgereifte HTTP-Client-Bibliothek, die für Scala idiomatisch, präzise in der Verwendung und einfache Semantik ist. Ich habe mir das Apache HTTP und den Scala Dispatch sowie zahlreiche neue Bibliotheken angesehen, die eine idiomatische Scala-Verpackung versprechen. Der Apache HTTP-Client verlangt sicher Ausführlichkeit, während der Versand leicht verwirrend war.

Was ist ein geeigneter HTTP-Client für die Verwendung von Scala?

Jesvin Jose
quelle
1
Ich würde vorschlagen, bei Dispatch zu bleiben. Sicher, seine Bedienbarkeit ist nicht jedermanns Sache (es ist nicht meins), aber es ist nicht wirklich so schlecht, wie es zunächst aussieht, und ich würde vermuten, dass es für eine Weile die beliebteste Scala-Option bleiben wird.
Travis Brown
4
Dies mag ein wenig vom Thema abweichen, aber ich denke, wir sollten eine Versandgabel mit einfachen englischen Methodennamen haben. Dies wäre nicht schwer zu tun und zu warten
Kim Stebel
3
@KimStebel Dispatch 0.9.x kann nur mit einfachen englischen Methoden verwendet werden.
Daniel C. Sobral
1
Eine ähnliche Frage ist stackoverflow.com/questions/11719373/…
Rick-777

Antworten:

29

Ich habe kürzlich angefangen, Dispatch zu verwenden , ein bisschen arkan (großartiges allgemeines Intro, ernsthafter Mangel an detaillierten, auf Szenarien / Anwendungsfällen basierenden Dokumenten). Dispatch 0.9.1 ist ein Scala-Wrapper um Nings Async Http Client . Um vollständig zu verstehen, was vor sich geht, muss man sich in diese Bibliothek einführen. In der Praxis musste ich mir nur den RequestBuilder ansehen - alles andere passt gut zu meinem Verständnis von HTTP.

Ich gebe der Version 0.9 (bis jetzt!) Einen Daumen hoch, wenn es darum geht, die Arbeit ganz einfach zu erledigen. Sobald Sie diese anfängliche Lernkurve überwunden haben.

Der HTTP- "Builder" von Dispatch ist unveränderlich und scheint in einer Thread-Umgebung gut zu funktionieren. Obwohl ich in Dokumenten nichts finden kann, was besagt, dass es threadsicher ist; Das allgemeine Lesen der Quelle legt nahe, dass dies der Fall ist.

Beachten Sie, dass die RequestBuilder veränderbar und daher NICHT threadsicher sind.

Hier sind einige zusätzliche Links, die ich hilfreich fand:

Richard Sitze
quelle
2
Beachten Sie, dass sich das Periodensystem der Operatoren auf die vorherige Inkarnation von Dispatch bezieht und das meiste davon von 0.9.x abgeschnitten wurde und wahrscheinlich nicht zurückkommt.
Daniel C. Sobral
Vielen Dank für diese Klarstellung. Das Wenige, das ich verwendet habe, hat gut funktioniert: URL-Builder-Verknüpfungen, POST, '<<'
Richard Sitze
Ja, die Anfrage DSL ist da - es ist die Antwort, die ausgegeben wurde, abgesehen von Dingen wie as.Stringund as.xml.Elem, die keine Symbole sind.
Daniel C. Sobral
Bitte helfen Sie mir mit meiner neuen Frage stackoverflow.com/questions/12342062/…
Jesvin Jose
12
Warum empfehlen es so viele Leute? Das DSL ist schwer zu verstehen, das Dokument ist schlecht, es gibt nur wenige Beispiele, ich kann damit keine einfachste Arbeitsdemo erstellen.
Freilauf
29

Ich habe einen Vergleich der meisten verfügbaren HTTP-Client-Bibliotheken durchgeführt

Der Versand und einige andere Bibliotheken werden nicht mehr verwaltet . Die einzigen ernsthaften sind derzeit Spray-Client und Play! WS .

Spray-Client ist in seiner Syntax etwas arkan. play-ws ist recht einfach zu bedienen:

(build.sbt)

libraryDependencies += "com.typesafe.play" %% "play-ws" % "2.4.3"

(Grundgebrauch)

val wsClient = NingWSClient()
wsClient
  .url("http://wwww.something.com")
  .get()
  .map { wsResponse =>
    // read the response
}
implicitdef
quelle
2
Der Versand hatte einen Neustart: github.com/dispatch/reboot Es ist also wieder ein brauchbarer Kandidat. Wenn Sie über die kryptischen Funktionen 'Namen' hinwegkommen, ist dies eine sehr angenehme Bibliothek.
Mvherweg
Hängt das Spielen von WS nicht von Akka ab?
CDMckay
"Spray-Client ist ein bisschen arkan" - Ich persönlich grabe die arkane Syntax, aber es kann zu einigen IDE-Störungen kommen. Das heißt, ich bin mit IntelliJ IDEA und spray-canSpezifikationstests immer nur auf einen syntaktischen Fehler gestoßen .
Jonathan Neufeld
21

Ein bisschen spät zur Party hier, aber ich war beeindruckt von Spray-Client .

Es verfügt über ein nettes DSL zum Erstellen von Anforderungen, unterstützt sowohl die synchrone als auch die asynchrone Ausführung sowie eine Vielzahl von (un) Marshalling-Typen (JSON, XML, Formulare). Es spielt auch sehr gut mit Akka .

Mark Tye
quelle
4
Der Spray Client gibt leider an, dass die blockierten Anfragen und Antworten nicht unterstützt werden. Wie können Sie also sehr große Dateien in einem System mit begrenztem Speicher herunterladen oder hochladen? (dh Android & Scala)
George Pligoropoulos
3
spray-clienthängt davon ab spray-can, spray-http, spray-httpx, spray-util. Gut, dass es keine externen Abhängigkeiten gibt, warum brauche ich den gesamten Spray-Stack? Außerdem hatte ich Probleme bei der Bereitstellung im OSGi-Container.
Andrii Nemchenko
2
Spray hängt jetzt von Akka ab.
Rechtsfalte
14

Zwei Sechs Jahre nachdem ich ursprünglich auf diesen Beitrag geantwortet hatte, hätte ich eine andere Antwort.

Ich habe akka-http verwendet , eine Zusammenarbeit zwischen dem Spray- und dem akka-Team. Es wird von Lightbend unterstützt und ist eng an die asynchrone Akka-Umgebung angepasst. Es ist das richtige Werkzeug für diesen Job.

Richard Sitze
quelle
1
Leider ist die Client- API-
Waldemar Wosiński
Hier ist das offizielle clientseitige Dokument für akka-http: doc.akka.io/docs/akka-http/10.0.11/scala/http/client-side/…
Andrew Norman
Der akka-http-Client wird als Teil der akka-http-core-Bibliothek bereitgestellt. Der experimentelle Link von @ WaldemarWosiński war ein erstes Prototypprojekt für den offiziellen Kunden von akka-http. Aus diesem Grund möchten Sie den akka-http-Link und nicht den früheren Link zum verwaisten "experimentellen" Projekt verwenden.
Andrew Norman
Dieser Artikel zum Vergleich einiger Lösungen stammt aus dem November 2015: implicitdef.com/2015/11/19/…
Jesse Chisholm
10

Nachdem ich einige unglückliche Erfahrungen mit dem Apache-Client gemacht hatte, begann ich, meine eigenen zu schreiben. Die eingebaute HttpURLConnection wird allgemein als fehlerhaft eingestuft. Aber das ist nicht meine Erfahrung damit. In der Tat war das Gegenteil der Fall, da der Apache-Client ein etwas problematisches Threading-Modell hatte. Seit Java6 (oder 5?) Hat HttpURLConnection effiziente HTTP1.1-Verbindungen bereitgestellt, bei denen wichtige Funktionen wie Keep-Alive integriert sind, und die gleichzeitige Verwendung ist unkompliziert.

Um die unbequeme API von HttpURLConnection zu kompensieren, habe ich mich daran gemacht, eine neue API in Scala als Open-Source-Projekt zu schreiben. Es ist nur ein Wrapper für HttpURLConnection, aber im Gegensatz zu HttpURLConnection soll es einfach zu bedienen sein. Im Gegensatz zum Apache-Client sollte es problemlos in ein vorhandenes Projekt passen. Im Gegensatz zum Versand sollte es leicht zu erlernen sein.

Es heißt Bee Client

Ich entschuldige mich für den schamlosen Stecker. :) :)

Rick-777
quelle
Ich versuche es als Maven-Abhängigkeit hinzuzufügen, kein Glück. Vielleicht muss ich zuerst ein anderes Repository hinzufügen?
Anzeigename
Konnten Sie aus Neugier Keep-Alive HttpUrlConnectionfür jede Verbindung verwenden, oder gibt es wirklich keinen anderen Weg als die globale Systemeigenschaft?
Nicolas Rinaudo
Das ConfigObjekt hat einen keepAliveBooleschen Wert: Es steuert, ob die Verbindungen pro Verbindung geschlossen oder am Leben gehalten werden sollen ( bigbeeconsultants.co.uk/docs/bee-client/latest/… ).
Rick-777
Wird diese Bibliothek noch gepflegt? Der Link zum Quell-Repo ist kaputt und es scheint keinen Build für Scala-Versionen nach 2.11 zu geben.
Martin Gladdish
10

sttp ist die Scala HTTP-Bibliothek, auf die wir alle gewartet haben!

Es verfügt über ein fließendes DSL zum Bilden und Ausführen von Anforderungen (Codebeispiele aus der README-Datei):

val request = sttp
  .cookie("session", "*!@#!@!$")
  .body(file) // of type java.io.File
  .put(uri"http://httpbin.org/put")
  .auth.basic("me", "1234")
  .header("Custom-Header", "Custom-Value")
  .response(asByteArray)

Es unterstützt synchrone, asynchrone und Streaming-Anrufe über steckbare Backends, einschließlich Akka-HTTP (ehemals Spray) und des ehrwürdigen AsyncHttpClient (Netty):

implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()

Es unterstützt scala.concurrent.Future, scalaz.concurrent.Task, monix.eval.Task, und cats.effect.IO- alle wichtigen Scala IO Monade Bibliotheken.

Außerdem hat es ein paar zusätzliche Tricks im Ärmel:

val test = "chrabąszcz majowy" val testUri: Uri = uri"http://httpbin.org/get?bug=$test"

  • Es unterstützt Encoder / Decoder für Anforderungskörper / Antworten, z. B. JSON über Circe:

import com.softwaremill.sttp.circe._ val response: Either[io.circe.Error, Response] = sttp .post(uri"...") .body(requestPayload) .response(asJson[Response]) .send()

Schließlich wird es von den zuverlässigen Mitarbeitern von softwaremill gepflegt und verfügt über eine hervorragende Dokumentation .

tksfz
quelle
5

Außer Versand gibt es da draußen nicht viel. Scalaz hatte den Versuch, einen funktionierenden http-Client zu erstellen . Aber es ist für eine Weile veraltet, es gibt keine Version davon im scalaz7-Zweig. Zusätzlich gibt es einen nützlichen Wrapper des ning async-http-clients im playframework. Dort können Sie Anrufe tätigen wie:

WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")

Sie können diese API als Inspiration verwenden, wenn Sie kein Spiel verwenden! in Ihrem Projekt und die Dispatch-API nicht mögen.

opeth
quelle
4

Sprühen

Sie sollten wirklich in Betracht ziehen, Spray zu verwenden . Meiner Meinung nach hat es eine etwas knifflige Syntax, aber es ist immer noch ziemlich brauchbar, wenn Sie einen leistungsstarken http-Client erstellen möchten. Der Hauptvorteil von Spray besteht darin, dass es auf der akka - Akteursbibliothek basiert , die extrem skalierbar und leistungsstark ist. Sie können Ihren http-Client auf mehrere Computer skalieren, indem Sie nur confDateien ändern .

Darüber hinaus ist Spray vor einigen Monaten Typesafe beigetreten, und soweit ich weiß, wird es Teil der grundlegenden Akka-Distribution. Beweis

Play2

Eine weitere Option ist die Verwendung der Play2 WS-Bibliothek ( doc ). Soweit ich weiß, ist es immer noch nicht von der Play-Distribution getrennt, aber aufgrund seiner extrem einfachen Einfachheit lohnt es sich, einige Zeit damit zu verbringen, das gesamte Play-Framework anzuhängen, um diesen Teil zu erhalten. Es gibt einige Probleme bei der Bereitstellung der Konfiguration, daher eignet sich dies nicht für Drop-and-Use-Fälle. Wir haben es jedoch in einigen nicht auf Play basierenden Projekten verwendet und alles war in Ordnung.

Alex Povar
quelle
1

Überrascht, dass hier niemand Finagle erwähnte. Es ist super einfach zu bedienen:

import com.twitter.finagle.{Http, Service}
import com.twitter.finagle.http
import com.twitter.util.{Await, Future}

object Client extends App {
  val client: Service[http.Request, http.Response] = Http.newService("www.scala-lang.org:80")
  val request = http.Request(http.Method.Get, "/")
  request.host = "www.scala-lang.org"
  val response: Future[http.Response] = client(request)
  Await.result(response.onSuccess { rep: http.Response =>
    println("GET success: " + rep)
  })
}

Weitere Informationen finden Sie in der Kurzanleitung: https://twitter.github.io/finagle/guide/Quickstart.html

Yuchen Zhong
quelle
0

Ich habe Dispatch, Spray Client und die Play WS Client Library verwendet ... Keiner von ihnen war einfach zu verwenden oder zu konfigurieren. Deshalb habe ich eine einfachere HTTP-Client-Bibliothek erstellt, mit der Sie alle klassischen HTTP-Anforderungen in einfachen Einzeilern ausführen können.

Siehe ein Beispiel:

import cirrus.clients.BasicHTTP.GET

import scala.concurrent.Await
import scala.concurrent.duration._

object MinimalExample extends App {

  val html = Await.result(Cirrus(GET("https://www.google.co.uk")), 3 seconds)

  println(html)
}

... produziert ...

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB">...</html>

Die Bibliothek heißt Cirrus und ist über Maven Central erhältlich

libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"

Die Dokumentation ist auf GitHub verfügbar

https://github.com/Godis/Cirrus
Abimbola Esuruoso
quelle