Выполнение HTTP-запроса в Scala

Я пытаюсь выполнить простой запрос POST на веб-сервис, который возвращает некоторый XML в Scala.

кажется,отправка стандартная библиотека используется для этой задачи, но я не могу найти документацию на нее. Основной сайт, на который я ссылаюсь выше, подробно объясняет, что такое обещание и как делать асинхронное программирование, но на самом деле не документирует API. Есть периодическая таблица - который выглядит немного страшно - но это только кажется полезным люди, которые уже знают, что делать, и нуждаются только в напоминании для загадочного синтаксиса.

кажется, кто-то Scalaz имеет некоторые возможности для HTTP, но я не могу найти любую документацию на это.

7 ответов


Я использую следующее:https://github.com/scalaj/scalaj-http.

вот простой запрос GET:

import scalaj.http.Http

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

и пример поста:

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 доступен через SBT:

libraryDependencies += "org.scalaj" % "scalaj-http_2.11" % "2.3.0"

можно использовать спрей-клиент. Документация отсутствует (мне потребовалось некоторое копание, чтобы узнать как сделать запросы GET с параметрами запроса), но это отличный вариант, если вы уже используете спрей. И документация лучше, чем отправка.

мы используем его в в AI2 над отправка потому что операторы менее символичны, и мы уже используем спрей / актеров.

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)

Я использую dispatch:http://dispatch.databinder.net/Dispatch.html

они только что выпустили новую версию (0.9.0) с полным новым api, который мне очень нравится. И это асинхронно.

пример со страницы проекта:

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

for (c <- country)
  println(c)

edit: это может помочь вам https://github.com/dispatch/reboot/blob/master/core/src/main/scala/requests.scala


другой вариант-play-ws Typesafe, который является библиотекой Play Framework WS, разбитой как автономный lib:

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

Я не предлагаю это как лучший вариант, но стоит отметить.


Почему бы не использовать Apache HttpComponents ? Вот FAQ приложений, который охватывает широкий спектр сценариев.


Если я могу сделать бесстыдный плагин, у меня есть API под названием Bee-Client который является просто оболочкой в Scala для HttpUrlConnection Java.


мне пришлось сделать то же самое, чтобы проверить одну конечную точку (в тестовой интеграции). Таким образом, Ниже приведен код для получения ответа от запроса GET в Scala. Я использую scala.Ио.Источник для чтения из конечной точки и ObjectMapper для преобразования json в объект.

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)

и вот мой метод тестирования для того же

test("validate booksMasterData resource") {
    val booksMasterData = fetchBooksMasterData(Option(null))
    booksMasterData.size should be (740)
  }