用于Scala的简单简洁的HTTP客户端库

用于Scala的简单简洁的HTTP客户端库,scala,http,Scala,Http,我需要一个成熟的HTTP客户机库,它对scala来说是惯用的,使用简洁,语义简单。我查看了ApacheHTTP和Scala调度,以及许许多多承诺使用惯用Scala包装的新库。ApacheHTTP客户端确实要求详细,而分派很容易混淆 什么是适合Scala使用的HTTP客户端?我最近开始使用,有点晦涩难懂(很好的一般介绍,严重缺乏详细的场景/基于用例的文档)。Dispatch 0.9.1是围绕Ning的Scala包装器;要完全理解正在发生的事情,需要向图书馆介绍自己。在实践中,我唯一真正需要看的是—

我需要一个成熟的HTTP客户机库,它对scala来说是惯用的,使用简洁,语义简单。我查看了ApacheHTTP和Scala调度,以及许许多多承诺使用惯用Scala包装的新库。ApacheHTTP客户端确实要求详细,而分派很容易混淆


什么是适合Scala使用的HTTP客户端?

我最近开始使用,有点晦涩难懂(很好的一般介绍,严重缺乏详细的场景/基于用例的文档)。Dispatch 0.9.1是围绕Ning的Scala包装器;要完全理解正在发生的事情,需要向图书馆介绍自己。在实践中,我唯一真正需要看的是——其他一切都很好地符合我对HTTP的理解

我对0.9发布版(到目前为止!)非常赞赏,因为它可以非常简单地完成任务。。一旦你通过了最初的学习曲线

Dispatch的Http“builder”是不可变的,在线程环境中似乎工作得很好。虽然我在文档中找不到任何声明它是线程安全的东西;对资料来源的通读表明它是正确的

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

以下是一些我发现有帮助的附加链接:

  • 我找不到0.9.*版本的ScalaDoc链接,所以我浏览了

  • );与0.9截然不同的野兽(今天)

  • 操作员的数量,也与0.8相关

  • 老一代帮助我了解了他们是如何使用url构建器的,并给出了一些关于如何将这些东西绑定在一起的提示,这些提示确实可以追溯到0.9


除了调度之外,外面的东西不多。试图构建一个功能正常的http客户端。但是它已经过时了一段时间,scalaz7分支中没有它的版本。此外,playframework中还提供了一个有用的异步http客户端。您可以在那里拨打以下电话:

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()