Простая и краткая клиентская библиотека HTTP для Scala
Мне нужна зрелая клиентская библиотека HTTP, которая идиоматична для scala, лаконична в использовании, простой семантикой. Я посмотрел на Apache HTTP и Scala Dispatch и многочисленные новые библиотеки, которые обещают идиоматическую упаковку Scala. HTTP-клиент Apache, безусловно, требует многословия, а Dispatch легко сбивает с толку.
Что такое подходящий HTTP-клиент для использования Scala?
11 ответов
Недавно я начал использовать Dispatch, немного загадочно (отличное общее введение, серьезное отсутствие подробных документов по сценариям / сценариям использования). Dispatch 0.9.1 - это оболочка Scala для Nyn's Async Http Client; чтобы полностью понять, что происходит, нужно представить себя в этой библиотеке. На практике единственное, на что я действительно должен был смотреть - это RequestBuilder - все остальное хорошо вписывалось в мое понимание HTTP.
Я даю выпуску 0.9 большие пальцы (пока!) О том, чтобы выполнить работу очень просто... как только вы пройдете эту начальную кривую обучения.
Http "строитель" Dispatch является неизменным и, похоже, хорошо работает в многопоточной среде. Хотя я не могу найти ничего в документах, чтобы утверждать, что это потокобезопасно; общее чтение источника предполагает, что это так.
Имейте в виду, что RequestBuilder изменчивы и, следовательно, НЕ являются поточно- ориентированными.
Вот некоторые дополнительные ссылки, которые я нашел полезными:
Я не могу найти ссылку ScalaDoc для выпуска 0.9.*, Поэтому я просматриваю исходный код для выпуска 0.9.*;
ScalaDoc для версии 0.8; существенно другой зверь (сегодня), чем 0,9.
С "Периодической" таблицей операторов, также 0,8 связаны.
Старые 0,8 "классические" документы помогли мне понять, как они использовали построители URL, и дали некоторые подсказки о том, как все связано, что привело к 0,9.
Я сделал сравнение большинства основных доступных HTTP-клиентских библиотек.
Dispatch и несколько других библиотек больше не поддерживаются. Единственными серьезными на данный момент являются спрей-клиент и Play! 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 для построения запросов, поддерживает синхронное и асинхронное выполнение, а также различные (не) типы сортировки (JSON, XML, формы). С Аккой тоже очень хорошо играет.
sttp - это библиотека Scala HTTP, которую мы все ждали!
Он имеет свободный 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.
Плюс у этого есть несколько дополнительных уловок в рукаве:
Он имеет представления классов дел для запросов и ответов (хотя он не идет, например, со строго типизированными заголовками): 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 через Circe:
import com.softwaremill.sttp.circe._
val response: Either[io.circe.Error, Response] =
sttp
.post(uri"...")
.body(requestPayload)
.response(asJson[Response])
.send()
Наконец, он поддерживается надежными сотрудниками Softwaremill и имеет отличную документацию.
Через два шесть лет после первоначального ответа на этот пост у меня был бы другой ответ.
Я использовал akka-http, сотрудничество между командами спрея и akka. Он поддерживается Lightbend, тесно связан с асинхронной средой akka... это правильный инструмент для этой работы.
После нескольких неудачных попыток с клиентом Apache я начал писать свой собственный. Встроенный HttpURLConnection, как утверждают, часто глючит. Но это не мой опыт. На самом деле, наоборот, клиент Apache имеет несколько проблемную модель потоков. Начиная с Java6 (или 5?), HttpURLConnection предоставляет эффективные HTTP1.1-соединения с основами, такими как встроенные средства поддержки активности, и обрабатывает одновременное использование без суеты.
Итак, чтобы компенсировать неудобный API, предлагаемый HttpURLConnection, я приступил к написанию нового API в Scala, как проекта с открытым исходным кодом. Это просто оболочка для HttpURLConnection, но, в отличие от HttpURLConnection, она проста в использовании. В отличие от клиента Apache, он должен легко вписываться в существующий проект. В отличие от Dispatch, это должно быть легко учиться.
Это называется Bee Client
- Веб-сайт: http://www.bigbeeconsultants.co.uk/bee-client
- Документы API: http://www.bigbeeconsultants.co.uk/docs/bee-client/latest.html
Мои извинения за бесстыдную вилку.:)
Помимо отправки там не так много. Скалац попытался построить функциональный http-клиент. Но на какое-то время он устарел, и в ветке scalaz7 его нет. Кроме того, в игровой структуре есть полезная оболочка ning async-http-client. Там вы можете делать звонки, как:
WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")
Вы можете использовать этот API в качестве вдохновения, если вы не используете игру! в вашем проекте и не нравится Dispatch API.
Спрей
Вы действительно должны рассмотреть возможность использования спрей. На мой взгляд, у него немного хитрый синтаксис, но он все еще довольно полезен, если вы хотите создать высокопроизводительный http-клиент. Основным преимуществом использования Spray является то, что он основан на библиотеке актеров akka, которая является чрезвычайно масштабируемой и мощной. Вы можете масштабировать ваш http-клиент на несколько машин, только изменив conf
файлы.
Более того, несколько месяцев назад Spray присоединился к Typesafe, и, насколько я понимаю, он станет частью основного дистрибутива akka. доказательство
pLAY2
Другой вариант - использование библиотеки Play2 WS ( doc). Насколько я знаю, он до сих пор не отделен от дистрибутива Play, но из-за его чрезвычайно простоты стоит потратить некоторое время на установку всей платформы Play, чтобы получить эту часть. Есть некоторые проблемы с предоставлением конфигурации для него, так что это не очень хорошо для случаев удаления и использования. Тем не менее, мы использовали его в нескольких проектах, не основанных на Play, и все было хорошо.
ScalaJ-Http - очень простой синхронный http-клиент
https://github.com/scalaj/scalaj-http
Я бы порекомендовал это, если вам нужен клиент для Scala без церемоний.
Удивило, что здесь никто не упомянул фингла. Это супер просто в использовании:
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)
})
}
Смотрите руководство по быстрому старту для более подробной информации: https://twitter.github.io/finagle/guide/Quickstart.html
Я использовал Dispatch, Spray Client и Play WS Client Library... Ни один из них не был просто для использования или настройки. Поэтому я создал более простую библиотеку 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