Выполнение 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)
}