Простая и лаконичная клиентская библиотека HTTP для Scala
Мне нужна зрелая клиентская библиотека HTTP, которая является идиоматической для scala, краткой в использовании, простой семантикой. Я посмотрел на Apache HTTP и Scala Dispatch и многочисленные новые библиотеки, которые обещают идиоматическую упаковку Scala. Apache HTTP client уверен, что требует многословия, в то время как отправка была легко запутанной.
Что такое подходящий HTTP-клиент для использования Scala?
11 ответов:
Я недавно начал использовать Dispatch, немного загадочный (большое общее введение, серьезное отсутствие подробных сценариев/документов на основе прецедентов). Dispatch 0.9.1-это обертка Scala вокруг Ning's Асинхронный Http-Клиент; чтобы полностью понять, что происходит, требуется ввести себя в эту библиотеку. На практике, единственное, что я действительно должен был смотреть на RequestBuilder - все остальное прекрасно вписывается в мое понимание HTTP.
I дайте 0,9 отпустите твердые пальцы вверх (до сих пор!) на получение работы очень просто.. как только вы пройдете эту начальную кривую обучения.
Http "builder" Dispatch является неизменным и, похоже, хорошо работает в потоковой среде. Хотя я не могу найти ничего в документах, чтобы заявить, что это потокобезопасно; общее чтение источника предполагает, что это так.
имейте в виду, что RequestBuilder ' s изменчивы, и поэтому не являются поточно-ориентированный.
вот некоторые дополнительные ссылки, которые я нашел полезными:
Я не могу найти ссылку ScalaDoc для 0.9.* релиз, поэтому я просматриваю исходный код для 0.9.* отпустите;
ScalaDoc для выпуска 0.8; a существенно другой зверь (сегодня), чем 0.9.
"Периодическая" Таблица операторов, и 0.8 связанный.
старшего 0.8 "dispatch-classic" docs помог мне понять, как они использовали url-строители, и дал некоторые подсказки о том, как вещи связаны друг с другом, которые перенесли вперед до 0.9.
Я сравнение большинства основных доступных клиентских библиотек HTTP
Dispatch, и несколько других библиотек,больше не поддерживаются. Единственные серьезные из них в настоящее время являются спрей-клиент и играть! WS.
спрей-клиент немного загадочный в своем синтаксисе. play-ws довольно проста в использовании:
(build.sbt)
libraryDependencies += "com.typesafe.play" %% "play-ws" % "2.4.3"
(основное использование)
val wsClient = NingWSClient() wsClient .url("http://wwww.something.com") .get() .map { wsResponse => // read the response }
немного опоздала на вечеринку здесь, но я был впечатлен спрей-клиент.
Он имеет хороший DSL для построения запросов, поддерживает как синхронизацию, так и асинхронное выполнение, а также различные типы (un)маршалинга (JSON, XML, forms). Он играет очень хорошо с Акка тоже.
двачерез шесть лет после первоначального ответа на этот пост, у меня был бы другой ответ.Я использую акка-http, сотрудничество между командами спрей и акка. Он опирается на Lightbend, тесно связанных с акка среды асинхронность... это правильный инструмент для этой работы.
имея некоторые неприятные переживания с клиентом Apache,я приступил к написанию своего собственного. Встроенный HttpURLConnection широко утверждается, чтобы быть багги. Но это не мой опыт. На самом деле, обратное было так, клиент Apache, имеющий несколько проблемную потоковую модель. С Java6 (или 5?), HttpURLConnection обеспечивает эффективные соединения HTTP1.1 с такими необходимыми элементами, как keep-alive, и он обрабатывает одновременное использование без суеты.
так, чтобы компенсируя неудобный API, предлагаемый HttpURLConnection, я приступил к написанию нового API в Scala в качестве проекта с открытым исходным кодом. Это просто оболочка для HttpURLConnection, но в отличие от HttpURLConnection, он стремится быть простым в использовании. В отличие от клиента Apache, он должен легко вписываться в существующий проект. В отличие от отправки, это должно быть легко узнать.
Это называется Bee Client
- сайт: http://www.bigbeeconsultants.co.uk/bee-client
- API docs:http://www.bigbeeconsultants.co.uk/docs/bee-client/latest.html
мои извинения за промоушен. :)
кроме отправки там не так много. scalaz была попытка построить функциональный http-клиент. Но он устарел на некоторое время, и его версия не существует в ветке scalaz7. Кроме того, есть полезный фантик из Ning async-http-клиента в playframework. Там ваш может делать звонки, как:
WS.url("http://example.com/feed").get() WS.url("http://example.com/item").post("content")
вы можете использовать этот API в качестве вдохновения, Если вы не используете play! в вашем проекте и не нравится API отправки.
спрей
вы действительно должны рассмотреть возможность использования спрей. На мой взгляд, он имеет немного сложный синтаксис, но он все еще довольно удобен, если вы хотите построить высокопроизводительный http-клиент. Главным преимуществом использования спрея является то, что он основан на акка библиотека актеров, которая является чрезвычайно масштабируемой и мощной. Вы можете масштабировать свой http-клиент на несколько машин, только изменив
conf
файлы.несколько месяц назад спрей присоединился к Typesafe, и, как я понимаю, он станет частью основного дистрибутива akka. доказательство
методу play2
другой вариант-использование play2 WS lib (doc). Насколько я знаю, он все еще не отделен от дистрибутива Play, но из-за его чрезвычайной простоты стоит потратить некоторое время на прикрепление всей игровой структуры, чтобы получить эту часть. Есть некоторые проблемы с предоставлением конфигурации к нему, так что это не очень хорошо для падения и случаев. Тем не менее, мы использовали его в нескольких не игровых проектах, и все было в порядке.
sttp это библиотека HTTP Scala, которую мы все так долго ждали!
он имеет свободный DSL для формирования и выполнения запросов (примеры кода из их 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)
он поддерживает синхронные, асинхронные и потоковые вызовы через подключаемые бэкэнды, включая Akka-HTTP (ранее Spray) и почтенный AsyncHttpClient (Netty):
implicit val sttpHandler = AsyncHttpClientFutureHandler() val futureFirstResponse: Future[Response[String]] = request.send()
поддерживает
scala.concurrent.Future
,scalaz.concurrent.Task
,monix.eval.Task
иcats.effect.IO
- все основные Scala IO монады библиотеки.плюс у него есть несколько дополнительных трюков в рукаве:
он имеет представления класса case как для запросов, так и для ответов (хотя он не доходит до того, например, сильно типизирован заголовки): https://github.com/softwaremill/sttp/blob/master/core/src/main/scala/com/softwaremill/sttp/RequestT.scala https://github.com/softwaremill/sttp/blob/master/core/src/main/scala/com/softwaremill/sttp/Response.scala
обеспечивает интерполятор строк URI:
val test = "chrabąszcz majowy" val testUri: Uri = uri"http://httpbin.org/get?bug=$test"
- он поддерживает кодеры / декодеры для тел запросов / ответов, например, JSON через Цирцея:
import com.softwaremill.sttp.circe._ val response: Either[io.circe.Error, Response] = sttp .post(uri"...") .body(requestPayload) .response(asJson[Response]) .send()
наконец, он поддерживается надежными людьми в softwaremill, и у него есть отличный документация.
ScalaJ-Http - это очень простой синхронный http-клиент
https://github.com/scalaj/scalaj-http
Я бы рекомендовал его, если вам нужен клиент без церемонии barebones Scala.
я использовал Dispatch, Spray Client и клиентскую библиотеку Play WS...Ни один из них не был просто использовать или настроить. Поэтому я создал более простую клиентскую библиотеку HTTP, которая позволяет выполнять все классические HTTP-запросы в простых однострочных версиях.
пример:
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) }
... производит...
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB">...</html>
библиотека называется Cirrus и доступна через Maven Central
libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"
документация доступна на GitHub
https://github.com/Godis/Cirrus
удивлен, что никто не упомянул ренонс здесь. Это очень простой в использовании:
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) }) }
смотрите быстрый запуск guid для более подробной информации:https://twitter.github.io/finagle/guide/Quickstart.html