scala に慣用的で、使用法が簡潔で、セマンティクスが単純な、成熟した HTTP クライアント ライブラリが必要です。私は、Apache HTTP と Scala Dispatch、そして慣用的な Scala ラッピングを約束する多数の新しいライブラリーに注目しました。Apache HTTP クライアントは確かに冗長性を要求しますが、Dispatch は簡単に混乱しました。
Scala の使用に適した HTTP クライアントは何ですか?
私は最近Dispatchの使用を開始しましたが、これは少し難解です (優れた一般的なイントロ、詳細なシナリオ/ユースケース ベースのドキュメントの深刻な不足)。Dispatch 0.9.1 は、Ning のAsync Http Clientの Scala ラッパーです。何が起こっているのかを完全に理解するには、そのライブラリに自己紹介する必要があります。実際には、私が実際に確認しなければならなかったのはRequestBuilderだけでした。それ以外はすべて、私の HTTP の理解にうまく当てはまります。
私は 0.9 のリリースに (これまでのところ!) 非常に簡単に仕事を終わらせることを高く評価します.. 最初の学習曲線を過ぎれば。
Dispatch の Http「ビルダー」は不変であり、スレッド化された環境でうまく機能するようです。スレッドセーフであると述べているドキュメントは見つかりませんが。ソースの一般的な読み取りは、そうであることを示唆しています。
RequestBuilderは可変であるため、スレッドセーフではないことに注意してください。
役立つと思われる追加のリンクを次に示します。
0.9.* リリースの ScalaDoc リンクが見つからないので、0.9.* リリースのソース コードを参照します。
0.8 リリースの ScalaDoc ; (今日の) 0.9 とはかなり異なる獣です。
古い0.8 の "dispatch-classic" ドキュメントは、URL ビルダーがどのように使用されているかを理解するのに役立ち、物事がどのように結び付けられているかについていくつかのヒントを与えてくれました。
ここでのパーティーには少し遅れましたが、私は、spray-clientに感銘を受けました。
リクエストを構築するための優れた DSL があり、同期と非同期の両方の実行をサポートし、さまざまな (非) マーシャリング タイプ (JSON、XML、フォーム) もサポートしています。Akkaとの相性も抜群です。
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)
Akka-HTTP (以前の Spray) や由緒ある AsyncHttpClient (Netty) などのプラグ可能なバックエンドを介して、同期、非同期、およびストリーミングの呼び出しをサポートします。
implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()
scala.concurrent.Future
、、、および- すべてscalaz.concurrent.Task
の主要な Scala IO モナド ライブラリをサポートします。monix.eval.Task
cats.effect.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 の信頼できる人々によって保守されており、優れたドキュメントがあります。
Apache クライアントでいくつかの不幸な経験をしたので、私は自分自身のクライアントを書き始めました。組み込みの HttpURLConnection には、バグがあると広く主張されています。しかし、それは私の経験ではありません。実際、その逆で、Apache クライアントのスレッド モデルには多少問題があります。Java6 (または 5?) 以降、HttpURLConnection は、組み込みのキープアライブなどの必須機能を備えた効率的な HTTP1.1 接続を提供し、大騒ぎせずに同時使用を処理します。
そこで、HttpURLConnection によって提供される不便な API を補うために、オープンソース プロジェクトとして新しい API を Scala で作成することに着手しました。HttpURLConnection の単なるラッパーですが、HttpURLConnection とは異なり、使いやすいことを目指しています。Apache クライアントとは異なり、既存のプロジェクトに簡単に適合する必要があります。Dispatch とは異なり、簡単に習得できるはずです。
それはビークライアントと呼ばれています
恥知らずなプラグインで申し訳ありません。:)
ディスパッチ以外にはあまり出回っていません。scalazは、機能する http クライアントを構築しようとしました。しかし、scalaz7 ブランチにはバージョンが存在しないため、しばらくの間は古くなっています。さらに、playframework 内に ning async-http-client の便利なラッパーがあります。そこでは、次のような呼び出しを行うことができます:
WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")
play を使用しない場合は、この API をインスピレーションとして使用できます。あなたのプロジェクトでは Dispatch API が嫌いです。
噴射
Sprayの使用を検討する必要があります。私の意見では、これには少しトリッキーな構文がありますが、高性能の http クライアントを構築することを目的としている場合は、それでも十分に使用できます。スプレーを使用する主な利点は、非常にスケーラブルで強力なakkaアクター ライブラリに基づいていることです。ファイルを変更するだけで、http クライアントを複数のマシンにスケールアウトできconf
ます。
さらに、Spray は数か月前に Typesafe に参加しました。私が理解しているように、Spray は基本的な akka ディストリビューションの一部になります。証拠
Play2
別のオプションは、Play2 WS lib の使用 ( doc ) です。私が知る限り、それはまだ Play ディストリビューションから分離されていませんが、その非常にシンプルなため、その部分を取得するために Play フレームワーク全体をアタッチするのに時間を費やす価値があります。それに構成を提供することにはいくつかの問題があるため、これはドロップ アンド ユース ケースには適していません。ただし、Play ベースではないいくつかのプロジェクトで使用しましたが、すべて問題ありませんでした。
ScalaJ-Http は非常に単純な同期 HTTP クライアントです。
https://github.com/scalaj/scalaj-http
セレモニーのないベアボーン Scala クライアントが必要な場合は、お勧めします。
Dispatch、Spray Client、Play WS Client Library を使用しましたが、どれも単純に使用または構成するものではありませんでした。そこで、単純なワンライナーですべての従来の 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 Central から入手できます。
libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"
ドキュメントは GitHub で入手できます
https://github.com/Godis/Cirrus