Biblioteca cliente HTTP simple y concisa para Scala

76

Necesito una biblioteca cliente HTTP madura que sea idiomática para scala, concisa en el uso, semántica simple. Miré el HTTP Apache y el Scala Dispatch y numerosas bibliotecas nuevas que prometen una envoltura idiomática de Scala. El cliente HTTP Apache ciertamente exige verbosidad, mientras que Dispatch se confunde fácilmente.

¿Qué es un cliente HTTP adecuado para el uso de Scala?

Jesvin José
fuente
1
Sugeriría seguir con Dispatch. Claro, su operatividad no es del gusto de todos (no es del mío), pero en realidad no es tan malo como parece al principio, y supongo que seguirá siendo la opción más popular de Scala por un tiempo.
Travis Brown
4
Esto puede estar un poco fuera de tema, pero creo que deberíamos tener una bifurcación de envío con nombres de métodos en inglés simple. Esto no sería difícil de hacer y mantener
Kim Stebel
3
@KimStebel Dispatch 0.9.x se puede usar solo con métodos en inglés simple.
Daniel C. Sobral
1
Una pregunta similar es stackoverflow.com/questions/11719373/…
Rick-777

Respuestas:

29

Recientemente comencé a usar Dispatch , un poco arcano (gran introducción general, grave falta de documentos detallados basados ​​en escenarios / casos de uso). Dispatch 0.9.1 es una envoltura de Scala alrededor del Async Http Client de Ning ; para comprender completamente lo que está sucediendo requiere presentarse a esa biblioteca. En la práctica, lo único que realmente tenía que mirar era el RequestBuilder : todo lo demás encajaba muy bien en mi comprensión de HTTP.

Le doy a la versión 0.9 un sólido pulgar hacia arriba (¡hasta ahora!) Para hacer el trabajo de manera muy simple ... una vez que supere la curva de aprendizaje inicial.

El "constructor" Http de Dispatch es inmutable y parece funcionar bien en un entorno con subprocesos. Aunque no puedo encontrar nada en los documentos que indique que es seguro para subprocesos; la lectura general de la fuente sugiere que sí.

Tenga en cuenta que los RequestBuilder son mutables y, por lo tanto, NO son seguros para subprocesos.

Aquí hay algunos enlaces adicionales que me han resultado útiles:

Richard Sitze
fuente
2
Tenga en cuenta que la tabla periódica de operadores se refiere a la encarnación anterior de Dispatch, y la mayor parte se ha cortado de 0.9.xy probablemente no volverá.
Daniel C. Sobral
Gracias por esa aclaración. Lo poco que he usado ha funcionado bien: accesos directos del constructor de URL, POST, '<<'
Richard Sitze
Sí, la solicitud DSL está ahí, es la respuesta que se descartó, aparte de cosas como as.Stringy as.xml.Elem, que no son símbolos.
Daniel C. Sobral
Ayúdame con mi nueva pregunta stackoverflow.com/questions/12342062/…
Jesvin Jose
12
¿Por qué tanta gente lo recomienda? El DSL es difícil de entender, el documento es pobre, los ejemplos son pocos, no puedo hacer una demostración funcional más simple con él.
Freewind
29

Hice una comparación de la mayoría de las principales bibliotecas de cliente HTTP disponibles

Dispatch y algunas otras bibliotecas ya no se mantienen . Los únicos serios actualmente son spray-client y Play! WS .

spray-client es un poco arcano en su sintaxis. play-ws es bastante fácil de usar:

(build.sbt)

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

(uso básico)

val wsClient = NingWSClient()
wsClient
  .url("http://wwww.something.com")
  .get()
  .map { wsResponse =>
    // read the response
}
implícitadef
fuente
2
Dispatch se reinició : github.com/dispatch/reboot Entonces, es un candidato viable nuevamente. Si puede superar los 'nombres' de las funciones crípticas, es una biblioteca muy agradable.
mvherweg
¿Play WS no depende de Akka?
cdmckay
"spray-client es un poco arcano" : personalmente me gusta la sintaxis arcana, pero puede provocar algunos fallos en el IDE. Dicho esto, solo me he encontrado con una falla sintáctica con IntelliJ IDEA y las spray-canpruebas de especificaciones.
Jonathan Neufeld
21

Un poco tarde para la fiesta aquí, pero me ha impresionado spray-client .

Tiene un buen DSL para crear solicitudes, admite ejecución sincronizada y asíncrona, así como una variedad de tipos de (des) ordenación (JSON, XML, formularios). También juega muy bien con Akka .

Mark Tye
fuente
4
El cliente spray lamentablemente afirma que las solicitudes y respuestas fragmentadas no son compatibles. Entonces, ¿cómo podría descargar o cargar archivos muy grandes en un sistema con memoria limitada? (es decir, android y scala)
George Pligoropoulos
3
spray-clientdepende spray-can, spray-http, spray-httpx, spray-util. Es bueno que no haya dependencias externas por qué necesito toda la pila de Spray. También tuve problemas para implementarlo en el contenedor OSGi.
Andrii Nemchenko
2
Spray ahora depende de Akka.
Derecha
14

Dos Seis años después de responder originalmente a esta publicación, tendría una respuesta diferente.

He estado usando akka-http , una colaboración entre los equipos spray y akka. Está respaldado por Lightbend, estrechamente alineado con el entorno asíncrono akka ... es la herramienta adecuada para este trabajo.

Richard Sitze
fuente
1
Lamentablemente, la documentación de Client Api todavía está vacía doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/…
Waldemar Wosiński
aquí está el documento oficial del lado del cliente para akka-http: doc.akka.io/docs/akka-http/10.0.11/scala/http/client-side/…
Andrew Norman
el cliente akka-http se proporciona como parte de la biblioteca akka-http-core. el enlace experimental proporcionado por @ WaldemarWosiński fue un proyecto prototipo inicial para lo que se convirtió en el cliente oficial en akka-http. Por eso querrá usar el enlace akka-http y no el enlace anterior al proyecto "experimental" huérfano.
Andrew Norman
Este artículo que compara algunas soluciones proviene de noviembre de 2015: implicitdef.com/2015/11/19/…
Jesse Chisholm
10

Habiendo tenido algunas experiencias desagradables con el cliente Apache, me puse a escribir la mía propia. Se afirma ampliamente que la HttpURLConnection incorporada tiene errores. Pero esa no es mi experiencia al respecto. De hecho, lo contrario ha sido así, el cliente Apache tiene un modelo de subprocesamiento algo problemático. Desde Java6 (¿o 5?), HttpURLConnection ha proporcionado conexiones HTTP1.1 eficientes con elementos esenciales como mantener vivo integrado, y maneja el uso concurrente sin problemas.

Entonces, para compensar la API inconveniente que ofrece HttpURLConnection, me puse a escribir una nueva API en Scala, como un proyecto de código abierto. Es solo un contenedor para HttpURLConnection, pero a diferencia de HttpURLConnection, su objetivo es ser fácil de usar. A diferencia del cliente Apache, debería encajar fácilmente en un proyecto existente. A diferencia de Dispatch, debería ser fácil de aprender.

Se llama Bee Client

Mis disculpas por el enchufe desvergonzado. :)

Rick-777
fuente
Estoy tratando de agregarlo como dependencia de Maven, sin suerte. ¿Quizás debo agregar otro repositorio primero?
Nombre
Por curiosidad, ¿ha podido utilizar Keep-Alive con HttpUrlConnectionpor conexión, o realmente no hay otra forma que la propiedad del sistema global?
Nicolas Rinaudo
El Configobjeto tiene un valor keepAlivebooleano: controla si las conexiones deben cerrarse o mantenerse vivas por conexión ( bigbeeconsultants.co.uk/docs/bee-client/latest/… ).
Rick-777
¿Esta lib aún se mantiene? El enlace al repositorio de origen está roto y no parece haber una compilación para ninguna versión de scala posterior a la 2.11.
Martin Gladdish
10

sttp es la biblioteca HTTP de Scala que todos estábamos esperando.

Tiene un DSL fluido para formar y ejecutar solicitudes (ejemplos de código de su README):

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)

Admite llamadas síncronas, asíncronas y de transmisión a través de backends conectables, incluidos Akka-HTTP (anteriormente Spray) y el venerable AsyncHttpClient (Netty):

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

Es compatible con scala.concurrent.Future, scalaz.concurrent.Task, monix.eval.Task, y cats.effect.IO- todos los principales Scala mónada IO bibliotecas.

Además, tiene algunos trucos adicionales bajo la manga:

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

  • Admite codificadores / decodificadores para cuerpos de solicitud / respuestas, por ejemplo, JSON a través de Circe:

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

Finalmente, es mantenido por la gente confiable de softwaremill y tiene una excelente documentación .

tksfz
fuente
5

Además de Dispatch, no hay mucho por ahí. scalaz intentó construir un cliente http funcional. Pero está desactualizado por un tiempo y no existe ninguna versión en la rama scalaz7. Además, hay un contenedor útil de ning async-http-client dentro del playframework. Allí puedes hacer llamadas como:

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

¡Puedes usar esta API como inspiración si no usas el juego! en su proyecto y no le gusta la API de envío.

opeth
fuente
4

Rociar

Realmente deberías considerar usar Spray . En mi opinión, tiene una sintaxis un poco complicada, pero sigue siendo bastante útil si se pretende crear un cliente http de alto rendimiento. La principal ventaja de usar Spray es que se basa en la biblioteca de actores akka , que es extremadamente escalable y potente. Puede escalar su cliente http a varias máquinas cambiando solo los confarchivos.

Además, hace unos meses, Spray se unió a Typesafe y, según tengo entendido, se convertirá en parte de la distribución básica de akka. prueba

Play2

Otra opción es el uso de la biblioteca Play2 WS ( doc ). Por lo que sé, todavía no está separado de la distribución de Play, pero debido a su extrema simplicidad, vale la pena dedicar un tiempo a adjuntar todo el marco de Play para obtener esa parte. Hay algunos problemas al proporcionarle configuración, por lo que esto no es bueno para casos de uso y caída. Sin embargo, lo hemos usado en algunos proyectos que no están basados ​​en Play y todo estuvo bien.

Alex Povar
fuente
1

Sorprendido de que nadie mencionara nada aquí. Es súper simple de usar:

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

Consulte la guía de inicio rápido para obtener más detalles: https://twitter.github.io/finagle/guide/Quickstart.html

Yuchen Zhong
fuente
0

He usado Dispatch, Spray Client y Play WS Client Library ... Ninguno de ellos era simplemente para usar o configurar. Así que creé una biblioteca de cliente HTTP más simple que le permite realizar todas las solicitudes HTTP clásicas en simples frases.

Vea un ejemplo:

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

... produce ...

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

La biblioteca se llama Cirrus y está disponible a través de Maven Central

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

La documentación está disponible en GitHub

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