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

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

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

Ответ 1

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

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

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

Помните, что RequestBuilder являются изменяемыми и, следовательно, НЕ являются потокобезопасными.

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

Ответ 2

Немного поздно на вечеринку здесь, но меня впечатлило spray-client.

Он получил хороший DSL для создания запросов, поддерживает как синхронизацию, так и асинхронное выполнение, а также множество (un) сортировочных типов (JSON, XML, forms). Он очень хорошо сочетается с Akka.

Ответ 3

Я сделал сравнение большинства основных доступных клиентских библиотек HTTP

Отправка и несколько других библиотек больше не поддерживаются. В настоящее время единственными серьезными являются спрей-клиент и 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
}

Ответ 4

Имея некоторые неприятные переживания с клиентом Apache, я начал писать свои собственные. Встроенное HttpURLConnection широко признано ошибочным. Но это не мой опыт. Фактически, обратное было так, клиент Apache имел несколько проблемную модель потоковой передачи. Поскольку Java6 (или 5?), HttpURLConnection обеспечил эффективные соединения HTTP1.1 с необходимыми функциями, такими как keep-alive, встроенный, и он обрабатывает одновременное использование без суеты.

Итак, чтобы компенсировать неудобный API, предлагаемый HttpURLConnection, я начал писать новый API в Scala, как проект с открытым исходным кодом. Это просто оболочка для HttpURLConnection, но, в отличие от HttpURLConnection, она проста в использовании. В отличие от клиента Apache, он легко вписывается в существующий проект. В отличие от Dispatch, это должно быть легко узнать.

Он назвал Bee Client

Мои извинения за бесстыдную вставку.:)

Ответ 5

Через два года после первоначального ответа на этот пост у меня был бы другой ответ.

Начну с того, что посмотрю akka-http, в котором происходит сотрудничество между командами спрей и аккой. На сегодняшний день он не дошел до версии 1.0; это скоро, опирается на типы и хорошо выглядит.

Ответ 6

Помимо Dispatch там не так много. scalaz попыталась создать функциональный http-клиент. Но он устарел на некоторое время, нет версии его в ветке scalaz7. Кроме того, в playframework есть полезная обертка nint async-http-client. Там вы можете звонить:

WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")

Вы можете использовать этот API в качестве вдохновения, если не используете игру! в вашем проекте и не нравится API-интерфейс отправки.

Ответ 7

Спрей

Вам действительно стоит использовать Spray. На мой взгляд, у этого есть немного сложный синтаксис, но он все еще довольно полезен, если вы нацелены на создание высокопроизводительного http-клиента. Основное преимущество использования Spray заключается в том, что он основан на akka актерской библиотеке, которая чрезвычайно масштабируема и мощна. Вы можете масштабировать свой http-клиент на несколько машин, только изменяя файлы conf.

Кроме того, несколько месяцев назад Spray присоединился к Typesafe, и, как я понял, он станет частью основного дистрибутива akka. доказательство

PLAY2

Другой вариант - использование Play2 WS lib (doc). Насколько я знаю, он все еще не отделен от дистрибутива Play, но из-за его чрезвычайно простоты стоит потратить некоторое время на создание всей платформы Play, чтобы получить эту часть. Есть некоторые проблемы с предоставлением конфигурации для него, поэтому это не очень удобно для случайных случаев. Однако мы использовали его в нескольких проектах, не связанных с Play, и все было в порядке.

Ответ 8

ScalaJ-Http - очень простой синхронный клиент http

https://github.com/scalaj/scalaj-http

Я бы порекомендовал его, если вам нужен бесконтактный barebones Scala клиент.

Ответ 9

sttp - это библиотека Scala HTTP, которую мы все ждали!

У него есть свободный DSL для формирования и выполнения запросов (образцы кода из README):

val request = sttp
  .cookie("session", "*[email protected]#[email protected]!$")
  .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()

Наконец, он поддерживается надежными людьми на программном сервере, и он получил отличную документацию.

Ответ 10

Я использовал 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

Ответ 11

Удивлен, что здесь никто не упоминается. Он очень прост в использовании:

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