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

Jes*_*ose 75 scala http

我需要一个成熟的HTTP客户端库,它是scala惯用的,简洁的用法,简单的语义.我查看了Apache HTTP和Scala Dispatch以及许多新的库,这些库承诺提供惯用的Scala包装.Apache HTTP客户端肯定需要冗长,而Dispatch很容易混淆.

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

Ric*_*tze 29

我最近开始使用Dispatch,有点神秘(很棒的一般介绍,严重缺乏详细的场景/基于用例的文档).Dispatch 0.9.1是Ning的Async Http Client的Scala包装器; 要完全理解发生了什么,需要将自己引入该库.在实践中,我唯一需要关注的是RequestBuilder - 其他一切都很好地融入了我对HTTP的理解.

我给0.9发布了一个坚定的大拇指(到目前为止!)非常简单地完成工作......一旦你超越了最初的学习曲线.

Dispatch的Http"builder"是不可变的,似乎在线程环境中运行良好.虽然我在文档中找不到任何说明它是线程安全的东西; 一般阅读来源表明它是.

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

以下是一些我发现有用的其他链接:

  • 我找不到0.9.*版本的ScalaDoc链接,所以我浏览0.9.*版本的源代码 ;

  • ScalaDoc为0.8版本 ; 一个基本上不同的野兽(今天)大于0.9.

  • 运营商的"周期性"表也与0.8相关.

  • 较早的0.8"发送 - 经典"文档帮助我理解了他们如何使用网址构建器,并提供了一些关于如何将事物捆绑在一起的提示,这些提示结果为0.9.

  • 为什么这么多人推荐它?DSL很难理解,文档很差,示例很少,我不能用它做一个最简单的工作演示. (12认同)
  • 请注意,运算符的周期表是指Dispatch的前一个版本,其中大部分已从0.9.x中删除,可能不会再回来. (2认同)

imp*_*def 27

对大多数可用的主要HTTP客户端库进行了比较

不再维护 Dispatch和其他一些库.目前唯一认真的是喷雾客户端Play!WS.

spray-client的语法有点神秘.play-ws很容易使用:

(build.sbt)

libraryDependencies += "com.typesafe.play" %% "play-ws" % "2.4.3"
Run Code Online (Sandbox Code Playgroud)

(基本用法)

val wsClient = NingWSClient()
wsClient
  .url("http://wwww.something.com")
  .get()
  .map { wsResponse =>
    // read the response
}
Run Code Online (Sandbox Code Playgroud)

  • Dispatch重新启动:https://github.com/dispatch/reboot所以它再次成为一个可行的候选人.如果你可以克服神秘的功能'名字',它是一个非常愉快的图书馆. (2认同)

Mar*_*Tye 21

这里的聚会有点晚了,但我对喷雾客户印象深刻.

它有一个很好的DSL用于构建请求,支持同步和异步执行,以及各种(非)编组类型(JSON,XML,表单).它也和Akka很好地配合.

  • 不幸的是,喷洒客户端表示不支持分块请求和响应.那么如何在内存有限的系统中下载或上传非常大的文件呢?(即android和scala) (4认同)
  • `spray-client`取决于`spray-can`,`spray-http`,`spray-httpx`,`spray-util`.很好,没有外部依赖,为什么我需要整个Spray堆栈.我在将其部署到OSGi容器时遇到了问题. (3认同)
  • 喷雾现在取决于Akka. (2认同)

Ric*_*tze 13

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

我一直在使用akka-http,喷雾和akka团队之间的合作.它受到Lightbend的支持,与akka异步环境紧密结合......它是这项工作的正确工具.


Ric*_*777 10

在与Apache客户端有过一些不愉快的经历后,我开始编写自己的.内置的HttpURLConnection被广泛认为是有缺陷的.但那不是我的体验.事实上,反过来一直如此,Apache客户端有一个有问题的线程模型.从Java6(或5?)开始,HttpURLConnection提供了高效的HTTP1.1连接,内置了keep-alive等基本功能,并且可以毫不费力地处理并发使用.

因此,为了弥补HttpURLConnection提供的不方便的API,我开始在Scala中编写一个新的API,作为一个开源项目.它只是HttpURLConnection的包装器,但与HttpURLConnection不同,它的目的是易于使用.与Apache客户端不同,它应该很容易适应现有项目.与Dispatch不同,它应该很容易学习.

它被称为蜜蜂客户端

我为无耻的插头道歉.:)


tks*_*sfz 7

sttp是我们一直在等待的Scala HTTP库!

它有一个流畅的DSL用于形成和执行请求(来自其README的代码示例):

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)
Run Code Online (Sandbox Code Playgroud)

它支持通过可插拔后端的同步,异步和流媒体调用,包括Akka-HTTP(以前的Spray)和古老的AsyncHttpClient(Netty):

implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()
Run Code Online (Sandbox Code Playgroud)

它支持scala.concurrent.Future,scalaz.concurrent.Task,monix.eval.Task,和cats.effect.IO-所有主要斯卡拉IO单子库.

此外,它还有一些额外的技巧:

val test = "chrab?szcz majowy" val testUri: Uri = uri"http://httpbin.org/get?bug=$test"

  • 它支持请求主体/响应的编码器/解码器,例如通过Circe的JSON:

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

最后,它由软件工厂的可靠人员维护,并且有很好的文档.


小智 5

除了Dispatch之外没有多少.scalaz试图建立一个功能强大的http客户端.但它已经过时了一段时间scalaz7分支中没有它的版本.另外,在playframework中有一个非常有用的ning async-http-client 包装器.你可以在那里打电话:

WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")
Run Code Online (Sandbox Code Playgroud)

如果您不使用游戏,可以使用此API作为灵感!在您的项目中,不喜欢Dispatch API.