Выполнение 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)).asStringScalaj HTTP доступен через SBT:
libraryDependencies += "org.scalaj" % "scalaj-http_2.11" % "2.3.0"
вы могли бы использовать спрей-клиент. Документация отсутствует (мне потребовалось некоторое копание, чтобы узнать как сделать запросы GET с параметрами запроса), но это отличный вариант, если вы уже используете спрей. И документация лучше, чем отправка.
мы используем его в AI2 over отправка потому что операторы менее символичны, и мы уже используем спрей/актеров.
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)изменить: это может помочь вам https://github.com/dispatch/reboot/blob/master/core/src/main/scala/requests.scala
другой вариант-это play-ws Typesafe, который является библиотекой WS Play Framework, разбитой как автономная lib:
http://blog.devalias.net/post/89810672067/play-framework-seperated-ws-library
Я не предлагаю это как лучший вариант, но стоит отметить.
Почему бы не использовать Apache HttpComponents ? Вот это часто задаваемые вопросы приложения, который охватывает широкий спектр сценариев.
Если я могу сделать бесстыдный плагин, у меня есть API под названием Bee-Client который является просто оболочкой в Scala для HttpUrlConnection Java.
Я должен был сделать то же самое, чтобы проверить одну конечную точку (в тесте интеграции). Итак, ниже приведен код для получения ответа от запроса GET в Scala. Я использую scala.io.Source для чтения из конечной точки и 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) }
Comments