Простая и краткая клиентская библиотека 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 изменчивы и, следовательно, НЕ являются поточно- ориентированными.

Вот некоторые дополнительные ссылки, которые я нашел полезными:

Я сделал сравнение большинства основных доступных 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.

Плюс у этого есть несколько дополнительных уловок в рукаве:

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-клиент. Но на какое-то время он устарел, и в ветке 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
Другие вопросы по тегам