76

scala に慣用的で、使用法が簡潔で、セマンティクスが単純な、成熟した HTTP クライアント ライブラリが必要です。私は、Apache HTTP と Scala Dispatch、そして慣用的な Scala ラッピングを約束する多数の新しいライブラリーに注目しました。Apache HTTP クライアントは確かに冗長性を要求しますが、Dispatch は簡単に混乱しました。

Scala の使用に適した HTTP クライアントは何ですか?

4

11 に答える 11

29

私は最近Dispatchの使用を開始しましたが、これは少し難解です (優れた一般的なイントロ、詳細なシナリオ/ユースケース ベースのドキュメントの深刻な不足)。Dispatch 0.9.1 は、Ning のAsync Http Clientの Scala ラッパーです。何が起こっているのかを完全に理解するには、そのライブラリに自己紹介する必要があります。実際には、私が実際に確認しなければならなかったのはRequestBuilderだけでした。それ以外はすべて、私の HTTP の理解にうまく当てはまります。

私は 0.9 のリリースに (これまでのところ!) 非常に簡単に仕事を終わらせることを高く評価します.. 最初の学習曲線を過ぎれば。

Dispatch の Http「ビルダー」は不変であり、スレッド化された環境でうまく機能するようです。スレッドセーフであると述べているドキュメントは見つかりませんが。ソースの一般的な読み取りは、そうであることを示唆しています。

RequestBuilderは可変であるため、スレッドセーフではないことに注意してください。

役立つと思われる追加のリンクを次に示します。

于 2012-09-08T21:44:52.953 に答える
21

ここでのパーティーには少し遅れましたが、私は、spray-clientに感銘を受けました。

リクエストを構築するための優れた DSL があり、同期と非同期の両方の実行をサポートし、さまざまな (非) マーシャリング タイプ (JSON、XML、フォーム) もサポートしています。Akkaとの相性も抜群です。

于 2013-05-30T20:39:07.187 に答える
11

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.Taskcats.effect.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()

最後に、softwaremill の信頼できる人々によって保守されており、優れたドキュメントがあります。

于 2017-09-08T16:36:11.097 に答える
10

Apache クライアントでいくつかの不幸な経験をしたので、私は自分自身のクライアントを書き始めました。組み込みの HttpURLConnection には、バグがあると広く主張されています。しかし、それは私の経験ではありません。実際、その逆で、Apache クライアントのスレッド モデルには多少問題があります。Java6 (または 5?) 以降、HttpURLConnection は、組み込みのキープアライブなどの必須機能を備えた効率的な HTTP1.1 接続を提供し、大騒ぎせずに同時使用を処理します。

そこで、HttpURLConnection によって提供される不便な API を補うために、オープンソース プロジェクトとして新しい API を Scala で作成することに着手しました。HttpURLConnection の単なるラッパーですが、HttpURLConnection とは異なり、使いやすいことを目指しています。Apache クライアントとは異なり、既存のプロジェクトに簡単に適合する必要があります。Dispatch とは異なり、簡単に習得できるはずです。

それはビークライアントと呼ばれています

恥知らずなプラグインで申し訳ありません。:)

于 2012-09-09T07:31:30.683 に答える
5

ディスパッチ以外にはあまり出回っていません。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 が嫌いです。

于 2012-09-08T22:00:16.927 に答える
4

噴射

Sprayの使用を検討する必要があります。私の意見では、これには少しトリッキーな構文がありますが、高性能の http クライアントを構築することを目的としている場合は、それでも十分に使用できます。スプレーを使用する主な利点は、非常にスケーラブルで強力なakkaアクター ライブラリに基づいていることです。ファイルを変更するだけで、http クライアントを複数のマシンにスケールアウトできconfます。

さらに、Spray は数か月前に Typesafe に参加しました。私が理解しているように、Spray は基本的な akka ディストリビューションの一部になります。証拠

Play2

別のオプションは、Play2 WS lib の使用 ( doc ) です。私が知る限り、それはまだ Play ディストリビューションから分離されていませんが、その非常にシンプルなため、その部分を取得するために Play フレームワーク全体をアタッチするのに時間を費やす価値があります。それに構成を提供することにはいくつかの問題があるため、これはドロップ アンド ユース ケースには適していません。ただし、Play ベースではないいくつかのプロジェクトで使用しましたが、すべて問題ありませんでした。

于 2014-07-17T04:42:29.273 に答える
3

ScalaJ-Http は非常に単純な同期 HTTP クライアントです。

https://github.com/scalaj/scalaj-http

セレモニーのないベアボーン Scala クライアントが必要な場合は、お勧めします。

于 2016-03-16T17:40:58.203 に答える
0

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
于 2016-06-01T19:31:40.410 に答える