Haciendo solicitud HTTP en Scala


Estoy tratando de emitir una simple solicitud POST a un servicio web que devuelve algo de XML en Scala.

Parece que Dispatch es la biblioteca estándar utilizada para esta tarea, pero no puedo encontrar documentación para ella. El sitio principal, que enlazo arriba, explica en detalle qué es una promesa y cómo hacer programación asíncrona, pero en realidad no documenta la API. Hay una tabla periódica - que parece un poco aterradora - pero solo parece útil para las personas que ya saben qué hacer y solo necesita un recordatorio para la sintaxis críptica.

También parece que Scalaz tiene alguna facilidad para HTTP, pero tampoco puedo encontrar ninguna documentación para ello.

Author: Andrea, 2012-07-30

7 answers

Utilizo lo siguiente: https://github.com/scalaj/scalaj-http .

Aquí hay una simple solicitud GET:

import scalaj.http.Http

Http("http://foo.com/search").param("q", "monkeys").asString

Y un ejemplo de un POST:

val result = Http("http://example.com/url").postData("""{"id":"12","json":"data"}""")
  .header("Content-Type", "application/json")
  .header("Charset", "UTF-8")
  .option(HttpOptions.readTimeout(10000)).asString

Scalaj HTTP está disponible a través de SBT:

libraryDependencies += "org.scalaj" % "scalaj-http_2.11" % "2.3.0"
 110
Author: kulikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 13:30:51

Puede usar spray-client. La documentación es deficiente (me tomó un poco de investigación para averiguar cómo hacer peticiones GET con parámetros de consulta), pero es una gran opción si ya está utilizando spray. Y la documentación es mejor que el despacho.

Lo estamos usando en AI2 sobre dispatch porque los operadores son menos simbólicos y ya estamos usando spray/actors.

import spray.client.pipelining._

val url = "http://youruri.com/yo"
val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

// Post with header and parameters
val responseFuture1: Future[String] = pipeline(Post(Uri(url) withParams ("param" -> paramValue), yourPostData) map (_.entity.asString)

// Post with header
val responseFuture2: Future[String] = pipeline(Post(url, yourPostData)) map (_.entity.asString)
 6
Author: schmmd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:56

Estoy usando despacho: http://dispatch.databinder.net/Dispatch.html

Acaban de lanzar una nueva versión (0.9.0) con una api completamente nueva que me gusta mucho. Y es asíncrona.

Ejemplo de la página del proyecto:

import dispatch._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc OK as.String)

for (c <- country)
  println(c)

Editar: Esto podría ayudarte https://github.com/dispatch/reboot/blob/master/core/src/main/scala/requests.scala

 5
Author: drexin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 13:06:46

Otra opción es play-ws de Typesafe, que es la biblioteca WS de Play Framework dividida como una librería independiente:

Http://blog.devalias.net/post/89810672067/play-framework-seperated-ws-library

No necesariamente ofrecería esto como la mejor opción, pero vale la pena mencionarlo.

 3
Author: tksfz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 01:32:45

¿Por qué no usar Apache HttpComponents? Aquí está la aplicación FAQ , que cubre una amplia gama de escenarios.

 2
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 10:16:18

Si puedo hacer un plug desvergonzado, tengo una API llamada Bee-Client que es simplemente un wrapper en Scala para HttpURLConnection de Java.

 1
Author: Rick-777,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-10 18:56:32

Tuve que hacer lo mismo para probar un punto final (en la prueba de integración). Lo que sigue es el código para obtener la respuesta de la solicitud GET en Scala. Estoy haciendo uso de scala. io. Source para leer desde endpoint y ObjectMapper para la conversión de json a objeto.

private def buildStockMasterUrl(url:String, stockStatus:Option[String]) = {
      stockStatus match  {
        case Some(stockStatus) => s"$url?stockStatus=${stockStatus}"
        case _ => url
    }
  }

    private def fetchBooksMasterData(stockStatus:Option[String]):  util.ArrayList[BooksMasterData] = {
    val url: String = buildBooksMasterUrl("http://localhost:8090/books/rest/catalogue/booksMasterData",stockStatus)
    val booksMasterJson : String = scala.io.Source.fromURL(url).mkString
    val mapper = new ObjectMapper()
    apper.readValue(booksMasterJson,classOf[util.ArrayList[BooksMasterData]])
}

case class BooksMasterData(id:String,description: String,category: String)

Y aquí está mi método de prueba para el mismo

test("validate booksMasterData resource") {
    val booksMasterData = fetchBooksMasterData(Option(null))
    booksMasterData.size should be (740)
  }
 0
Author: Sanjay Bharwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 09:22:48