斯卡拉简洁明了HTTP客户端库(Simple and concise HTTP client lib

2019-06-28 01:30发布

我需要一个成熟的HTTP客户端库,惯用Scala的,简洁的使用,简单的语义。 我看着的Apache HTTP和Scala调度和承诺的习惯斯卡拉包装许多新库。 Apache的HTTP客户端肯定需要冗长,而调度很容易混淆。

什么是斯卡拉使用合适的HTTP客户端?

Answer 1:

我已经用最近开始调度 ,有点神秘(大将军介绍,严重缺乏基于详细的场景/用例文档的)。 调度0.9.1是围绕李宁的Scala的包装异步HTTP客户端 ; 要充分了解什么事情需要引入一个人的自我到库中。 在实践中,唯一的事情我真的看是RequestBuilder -一切很好地落入我的HTTP的理解。

我给0.9上得到实现很简单..一旦你过去,最初的学习曲线的工作释放了坚实的竖起大拇指(到目前为止)。

调度的HTTP“建设者”是不可改变的,而且似乎在多线程环境很好地工作。 虽然我无法找到任何文档,以说明它是线程安全的; 源的一般阅读表明,它是。

请注意, RequestBuilder的是可变的,因此不是线程安全的。

下面是我发现有用的一些额外的链接:

  • 我无法找到一个ScalaDoc链接为0.9 *释放,所以我浏览。 为0.9源代码*释放。 ;

  • ScalaDoc为0.8释放 ; 基本上不同的兽(今天)大于0.9。

  • 在“周期率”表的运营商,也是0.8有关。

  • 较老的0.8“调度经典”文档帮助我了解他们是如何使用的URL建设者,并就事情是如何连接在一起,这并发扬到0.9的一些提示。



Answer 2:

我做了一个最重要的HTTP客户端库的比较可

调度,和其他一些库, 不再被维护 。 唯一的严重的人目前是喷雾客户端播放! WS。

喷雾客户是它的语法有点神秘。 玩-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
}


Answer 3:

有点晚了这里的聚会,但我一直印象深刻喷雾客户端 。

它有用于建设请求一个很好的DSL,同时支持同步和异步执行,以及各种(UN)编组类型(JSON,XML形式)的。 它起着非常精美, 阿卡 ,太。



Answer 4:

六年后最初回应这篇文章中,我将有一个不同的答案。

我一直在使用阿卡-HTTP ,喷雾和阿卡团队之间的合作。 它是由Lightbend的支持下,与阿卡异步环境严格对齐......这是这个工作的工具。



Answer 5:

有过不愉快的一些经验与Apache客户端,我开始写我自己。 内置HttpURLConnection的广泛断言是马车。 但是,这不是我的体会吧。 事实上,反向已经如此,具有稍微有问题的线程模型Apache的客户端。 由于的Java6(或5?),HttpURLConnection类提供了高效的HTTP1.1连接与像保持活动正在兴建中的必需品,它处理并发使用没有大惊小怪。

所以,以补偿HttpURLConnection类提供的API不方便,我开始写作Scala中的一个新的API,作为一个开源项目。 它只是HttpURLConnection的包装,但不像HttpURLConnection类,它的目标是成为易于使用。 不同于Apache的客户端,它应该很容易融入现有的项目。 与调度,它应该是简单易学。

这就是所谓的蜜蜂客户端

  • 网站: httpwwwbigbeeconsultantscoukbeeclient
  • 文档上的API: httpwwwbigbeeconsultantscoukdocsbeeclientlatesthtml

我的道歉无耻的插头。 :)



Answer 6:

除了派遣没有太多的在那里。 scalaz曾在建设一个功能HTTP客户端尝试。 但它已经过时,对于没有版本的它在scalaz7分支存在一段时间。 此外,还有是一个有用的包装宁的playframework内异步HTTP客户端的。 在那里,你可以这样做呼叫:

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

您可以使用此API为灵感,如果你不使用游戏! 在您的项目和不喜欢的调度API。



Answer 7:

三聚磷酸钠是我们都一直在等待Scala的HTTP库!

它具有用于形成和执行(从它们的自述代码样本)请求一个流利DSL:

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)

它支持同步,异步和流通过可插拔后端呼叫,包括阿卡-HTTP(以前喷雾)和古老AsyncHttpClient(Netty的):

implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()

它支持scala.concurrent.Futurescalaz.concurrent.Taskmonix.eval.Taskcats.effect.IO -所有主要斯卡拉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:

import com.softwaremill.sttp.circe._ val response: Either[io.circe.Error, Response] = sttp .post(uri"...") .body(requestPayload) .response(asJson[Response]) .send()

最后,它是由在softwaremill可靠的人保持和它有很大的文档 。



Answer 8:

喷雾

你真的应该考虑使用喷雾 。 在我看来,它有一个有点棘手语法的,但如果你的目标是建立一个高性能的HTTP客户端仍然非常有用。 使用喷雾的主要优点是,它是基于阿卡演员库,这是非常可扩展性和强大。 您可以仅通过改变向外扩展您的HTTP客户端来几台机器conf文件。

此外几个月前喷雾加入类型安全,并按照我的理解将成为基本阿卡分布的一部分。 证明

Play2

另一种选择是Play2 WS的lib使用( DOC )。 据我所知,现在还没有从播放分布分离,但由于其非常简单这是值得花一些时间连接全剧框架得到的那部分。 有一些问题,它提供了配置,所以这不是伟大的下降和使用的情况。 然而,我们在几为主打非项目中使用它,一切都很好。



Answer 9:

ScalaJ-HTTP是一个非常简单的同步http客户端

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

如果你需要一个没有仪式准系统斯卡拉客户端我会推荐它。



Answer 10:

我用调度,喷雾客户端和播放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

libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"

该文档可在GitHub

https://github.com/Godis/Cirrus


Answer 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)
  })
}

请参阅快速启动GUID的更多详细信息: https://twitter.github.io/finagle/guide/Quickstart.html



文章来源: Simple and concise HTTP client library for Scala
标签: scala http