Простая и лаконичная клиентская библиотека HTTP для Scala


Мне нужна зрелая клиентская библиотека HTTP, которая является идиоматической для scala, краткой в использовании, простой семантикой. Я посмотрел на Apache HTTP и Scala Dispatch и многочисленные новые библиотеки, которые обещают идиоматическую упаковку Scala. Apache HTTP client уверен, что требует многословия, в то время как отправка была легко запутанной.

Что такое подходящий HTTP-клиент для использования Scala?

11 70

11 ответов:

Я недавно начал использовать Dispatch, немного загадочный (большое общее введение, серьезное отсутствие подробных сценариев/документов на основе прецедентов). Dispatch 0.9.1-это обертка Scala вокруг Ning's Асинхронный Http-Клиент; чтобы полностью понять, что происходит, требуется ввести себя в эту библиотеку. На практике, единственное, что я действительно должен был смотреть на RequestBuilder - все остальное прекрасно вписывается в мое понимание HTTP.

I дайте 0,9 отпустите твердые пальцы вверх (до сих пор!) на получение работы очень просто.. как только вы пройдете эту начальную кривую обучения.

Http "builder" Dispatch является неизменным и, похоже, хорошо работает в потоковой среде. Хотя я не могу найти ничего в документах, чтобы заявить, что это потокобезопасно; общее чтение источника предполагает, что это так.

имейте в виду, что RequestBuilder ' s изменчивы, и поэтому не являются поточно-ориентированный.

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

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

мои извинения за промоушен. :)

кроме отправки там не так много. 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 монады библиотеки.

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

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