用于Scala的简单简洁的HTTP客户端库
我需要一个成熟的HTTP客户机库,它对scala来说是惯用的,使用简洁,语义简单。我查看了ApacheHTTP和Scala调度,以及许许多多承诺使用惯用Scala包装的新库。ApacheHTTP客户端确实要求详细,而分派很容易混淆用于Scala的简单简洁的HTTP客户端库,scala,http,Scala,Http,我需要一个成熟的HTTP客户机库,它对scala来说是惯用的,使用简洁,语义简单。我查看了ApacheHTTP和Scala调度,以及许许多多承诺使用惯用Scala包装的新库。ApacheHTTP客户端确实要求详细,而分派很容易混淆 什么是适合Scala使用的HTTP客户端?我最近开始使用,有点晦涩难懂(很好的一般介绍,严重缺乏详细的场景/基于用例的文档)。Dispatch 0.9.1是围绕Ning的Scala包装器;要完全理解正在发生的事情,需要向图书馆介绍自己。在实践中,我唯一真正需要看的是—
什么是适合Scala使用的HTTP客户端?我最近开始使用,有点晦涩难懂(很好的一般介绍,严重缺乏详细的场景/基于用例的文档)。Dispatch 0.9.1是围绕Ning的Scala包装器;要完全理解正在发生的事情,需要向图书馆介绍自己。在实践中,我唯一真正需要看的是——其他一切都很好地符合我对HTTP的理解 我对0.9发布版(到目前为止!)非常赞赏,因为它可以非常简单地完成任务。。一旦你通过了最初的学习曲线 Dispatch的Http“builder”是不可变的,在线程环境中似乎工作得很好。虽然我在文档中找不到任何声明它是线程安全的东西;对资料来源的通读表明它是正确的 请注意,的是可变的,因此不是线程安全的 以下是一些我发现有帮助的附加链接:
- 我找不到0.9.*版本的ScalaDoc链接,所以我浏览了
- );与0.9截然不同的野兽(今天)
- 操作员的数量,也与0.8相关
- 老一代帮助我了解了他们是如何使用url构建器的,并给出了一些关于如何将这些东西绑定在一起的提示,这些提示确实可以追溯到0.9
WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")
如果不使用play,您可以使用此API作为灵感!在您的项目中,不喜欢Dispatch API 在使用Apache客户端时有过一些不愉快的经历,我开始编写自己的。人们普遍认为内置的HttpURLConnection存在缺陷。但这不是我的经验。事实上,情况恰恰相反,Apache客户端的线程模型有些问题。自Java6(或5?)以来,HttpURLConnection提供了高效的HTTP1.1连接,内置了keep alive之类的基本功能,并且可以轻松处理并发使用 因此,为了弥补HttpURLConnection提供的不方便的API,我开始在Scala中编写一个新的API,作为一个开源项目。它只是HttpURLConnection的包装器,但与HttpURLConnection不同,它的目标是易于使用。与Apache客户端不同,它应该可以轻松地适应现有项目。与Dispatch不同,它应该易于学习 这叫蜜蜂客户端
- 网站:
- API文档:
我为这个无耻的插头道歉。:) 来这里参加聚会有点晚了,但我对这件事印象深刻 它有一个很好的DSL用于构建请求,支持同步和异步执行,以及各种(非)编组类型(JSON、XML、表单)。它也能很好地与Spray配合使用。 你真的应该考虑使用。在我看来,它的语法有点棘手,但如果您打算构建一个高性能http客户机,它仍然非常有用。使用Spray的主要优点是它基于actor库,该库具有极高的可扩展性和强大的功能。只需更改
conf
文件,即可将http客户端扩展到多台计算机
此外,几个月前,Spray加入Typesafe,据我所知,它将成为基本akka发行版的一部分
播放2
另一个选项是play2ws-lib用法()。据我所知,它仍然没有与Play发行版分离,但由于其极其简单,值得花一些时间附加整个Play框架以获得该部分。为其提供配置时存在一些问题,因此这对于drop和用例来说不是很好。然而,我们在一些非游戏项目中使用了它,一切都很好。在最初回复这篇文章的两年后,我会有一个不同的答案
我一直在使用spray和akka团队之间的合作。它由Lightbend支持,与akka异步环境紧密结合。。。这是做这项工作的合适工具。我做了一个
Dispatch和其他一些库不再维护。
目前唯一严重的问题是喷雾客户端和游戏!WS
spray client的语法有点晦涩难懂播放ws非常容易使用:
(build.sbt)
(基本用法)
ScalaJ Http是一个非常简单的同步Http客户端
如果你需要一个无仪式的Scala客户端,我会推荐它 我使用过Dispatch、Spray客户端和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>
该文档可在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:是我们一直在等待的Scala HTTP库
它有一个流畅的DSL用于形成和执行请求(自述文件中的代码示例):
它通过可插拔的后端支持同步、异步和流式调用,包括Akka HTTP(以前的Spray)和著名的AsyncHttpClient(Netty):
它支持scala.concurrent.Future
,scalaz.concurrent.Task
,monix.eval.Task
和libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"
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)
})
}
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)
implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()