我需要一个成熟的HTTP客户端库,惯用Scala的,简洁的使用,简单的语义。 我看着的Apache HTTP和Scala调度和承诺的习惯斯卡拉包装许多新库。 Apache的HTTP客户端肯定需要冗长,而调度很容易混淆。
什么是斯卡拉使用合适的HTTP客户端?
我需要一个成熟的HTTP客户端库,惯用Scala的,简洁的使用,简单的语义。 我看着的Apache HTTP和Scala调度和承诺的习惯斯卡拉包装许多新库。 Apache的HTTP客户端肯定需要冗长,而调度很容易混淆。
什么是斯卡拉使用合适的HTTP客户端?
我已经用最近开始调度 ,有点神秘(大将军介绍,严重缺乏基于详细的场景/用例文档的)。 调度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的一些提示。
我做了一个最重要的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
}
有点晚了这里的聚会,但我一直印象深刻喷雾客户端 。
它有用于建设请求一个很好的DSL,同时支持同步和异步执行,以及各种(UN)编组类型(JSON,XML形式)的。 它起着非常精美, 阿卡 ,太。
二六年后最初回应这篇文章中,我将有一个不同的答案。
我一直在使用阿卡-HTTP ,喷雾和阿卡团队之间的合作。 它是由Lightbend的支持下,与阿卡异步环境严格对齐......这是这个工作的工具。
有过不愉快的一些经验与Apache客户端,我开始写我自己。 内置HttpURLConnection的广泛断言是马车。 但是,这不是我的体会吧。 事实上,反向已经如此,具有稍微有问题的线程模型Apache的客户端。 由于的Java6(或5?),HttpURLConnection类提供了高效的HTTP1.1连接与像保持活动正在兴建中的必需品,它处理并发使用没有大惊小怪。
所以,以补偿HttpURLConnection类提供的API不方便,我开始写作Scala中的一个新的API,作为一个开源项目。 它只是HttpURLConnection的包装,但不像HttpURLConnection类,它的目标是成为易于使用。 不同于Apache的客户端,它应该很容易融入现有的项目。 与调度,它应该是简单易学。
这就是所谓的蜜蜂客户端
我的道歉无耻的插头。 :)
除了派遣没有太多的在那里。 scalaz曾在建设一个功能HTTP客户端尝试。 但它已经过时,对于没有版本的它在scalaz7分支存在一段时间。 此外,还有是一个有用的包装宁的playframework内异步HTTP客户端的。 在那里,你可以这样做呼叫:
WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")
您可以使用此API为灵感,如果你不使用游戏! 在您的项目和不喜欢的调度API。
三聚磷酸钠是我们都一直在等待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.Future
, scalaz.concurrent.Task
, monix.eval.Task
和cats.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"
import com.softwaremill.sttp.circe._ val response: Either[io.circe.Error, Response] = sttp .post(uri"...") .body(requestPayload) .response(asJson[Response]) .send()
最后,它是由在softwaremill可靠的人保持和它有很大的文档 。
喷雾
你真的应该考虑使用喷雾 。 在我看来,它有一个有点棘手语法的,但如果你的目标是建立一个高性能的HTTP客户端仍然非常有用。 使用喷雾的主要优点是,它是基于阿卡演员库,这是非常可扩展性和强大。 您可以仅通过改变向外扩展您的HTTP客户端来几台机器conf
文件。
此外几个月前喷雾加入类型安全,并按照我的理解将成为基本阿卡分布的一部分。 证明
Play2
另一种选择是Play2 WS的lib使用( DOC )。 据我所知,现在还没有从播放分布分离,但由于其非常简单这是值得花一些时间连接全剧框架得到的那部分。 有一些问题,它提供了配置,所以这不是伟大的下降和使用的情况。 然而,我们在几为主打非项目中使用它,一切都很好。
ScalaJ-HTTP是一个非常简单的同步http客户端
https://github.com/scalaj/scalaj-http
如果你需要一个没有仪式准系统斯卡拉客户端我会推荐它。
我用调度,喷雾客户端和播放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
惊讶的是,没有一个人提到这里欺骗。 这是超级简单的使用方法:
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