1. 序章

RESTful APIサービスは、Web上でサービスを構築する最も一般的な方法の1つです。 ほとんどのプログラミング言語には、RESTfulサービスを構築して利用するためのライブラリがあります。 同様に、Scalaは、 Akka-HTTP Play Framework http4s ZIO Http 、およびFinch。 さらに、他のクライアントライブラリを使用してRESTリクエストを呼び出すことができます。 前述のRESTフレームワークとは別に、 sttp async-http-client OkHttpなどの他の多くのJavaおよびScalaクライアントがあります。 ただし、多くの場合、単純なRESTサービスを呼び出すには、多くの定型コードまたは構成が必要になる可能性があります。 このチュートリアルでは、RESTリクエストを簡単に作成するためのリクエスト-Scalaを見ていきます。

2. リクエスト-Scala

Requests-Scalaは、人気のあるPythonライブラリRequestsScalaポートです。 これは、REST呼び出しを行うための簡単なAPIを提供します。 リクエストを使用する利点-Scalaには、ボイラープレートコードなし、簡単なセットアップ、直感的でシンプルなAPIが含まれます。

3. 設定

sbt-dependencyを使用してRequest-Scalaを追加することから始めましょう。

libraryDependencies += "com.lihaoyi" %% "requests" % "0.6.9"

4. HTTPリクエスト

それでは、Requests-Scalaを使用して基本HTTPメソッドを呼び出す方法を見てみましょう。

4.1. GETリクエスト

get メソッドを使用して、簡単なGETリクエストを行うことができます。

val r: Response = requests.get("https://api.github.com/users/baeldung")

これにより、textメソッドを使用してコンテンツを取得できるResponseインスタンスが返されます。

val responseText = r.text
assert(responseText.contains("http://www.baeldung.com"))
assert(r.statusCode == 200)
assert(r.contentType.exists(_.contains("application/json")))

get メソッドを使用すると、クエリパラメータをMapとして提供できます。

val r = requests.get("http://httpbin.org/get", params = Map("key1" -> "value1"))
assert(r.statusCode == 200)

4.2. 認証付きのGETリクエスト

リクエストの認証は非常に簡単に処理できます。 基本認証を使用してRESTAPIを呼び出しましょう。

val r = requests.get("https://postman-echo.com/basic-auth", auth = ("postman","password"))
assert(r.statusCode == 200)
assert(r.text().contains("true"))

この場合、 auth 引数を使用して、リクエストとともにユーザー名とパスワードを渡します。 同様に、 Requests-Scalaは、Proxy-Authorization、Bearer Token、Client Certificate、などの他の認証方法もサポートしています。

4.3. POSTリクエスト

post メソッドは、POSTリクエストを行うために使用できます。

val r = requests.post("http://httpbin.org/post", data = Map("key"->"value"))
assert(r.statusCode == 200)

必要なPOSTフォーム値は、dataパラメーターを使用してMapとして渡すことができます。 Map の代わりに、任意のString値を渡すこともできます。

val r = requests.post("http://httpbin.org/post", data = "StringBody")

POST要求の認証も、GET要求と同じ方法で適用できます。

4.4. その他のHTTPメソッド

メソッドput() delete() head()、および[を使用して、PUT、DELETE、HEAD、PATCHなどのHTTPメソッドでリクエストを行うことができます。 X146X] patch()GETリクエストの場合と同じ方法です。

5. ストリーミング

Requests-Scala を使用すると、応答を非常に簡単にストリーミングできます。 これは、応答が大きすぎて、一度にメモリにデータの一部のみをロードすることでパフォーマンスを向上させたい場合に特に役立ちます。 APIリクエストから大きな応答をストリーミングしてファイルに書き込む方法を見てみましょう。 簡単にするために、FileOutputStreamを使用してストリーミングコンテンツをファイルに書き込みましょう。

val out = new FileOutputStream("events.json")
val stream: geny.Readable = requests.get.stream("https://api.github.com/events")
stream.writeBytesTo(out)
out.close()

6. 圧縮

Requests-Scalaのもう1つの注目すべき機能は、GzipとDeflateを使用したリクエストの圧縮です。 リクエストを行う際に、compressパラメータを必要な圧縮モードに設定する必要があります。 Gzip圧縮の場合、次を使用できます。

requests.post(
  "https://httpbin.org/post",
  compress = requests.Compress.Gzip,
  data = "This is a gzipped post request"
)

Deflate compressの場合、compressrequests.Compress.Deflateに設定するだけで済みます。

7. マルチパートファイルのアップロード

マルチパートファイルアップロード機能を使用してファイルをアップロードするには、dataパラメーターをMultiPartオブジェクトで次のようにラップする必要があります。

val r = requests.post(
  "http://httpbin.org/post",
  data = requests.MultiPart(
    requests.MultiItem("name", new java.io.File("file.txt"), "myFile.txt"),
    // you can upload strings, and file name is optional
    requests.MultiItem("hint", "This is file upload"),
  )
)
assert(r.text contains("multipart/form-data"))

8. タイムアウト

HTTPリクエストを処理するときは常に、リクエストのタイムアウトを処理する必要があります。 タイムアウトの2つの主要なタイプは次のとおりです。

  • ConnectTimeout:クライアントがHTTP接続の確立を待機する最大時間
  • ReadTimeout:クライアントが応答データの受信を待機する最大時間

は、リクエストを行うときに上記のタイムアウト値を構成できます。パラメーターconnectTimeoutおよびreadTimeoutを使用して、目的のタイムアウト値を設定します。 まず、readTimeoutを設定する方法を見てみましょう。

val r1 = requests.get("https://httpbin.org/delay/1", readTimeout = 1500)

リクエストの応答に1500ミリ秒以上かかる場合、クライアントはTimeoutExceptionで接続を終了します。 同様に、connectTimeoutパラメーターを設定することもできます。 接続の確立に設定された時間を超える時間がかかる場合、TimeoutExceptionがスローされます。

val r2 = requests.get("https://httpbin.org/delay/3", connectTimeout = 1500)

9. 不足している機能

Requests-Scalaライブラリに欠けている機能がいくつかあります。 リクエスト-Scalaには非同期操作のサポートが組み込まれていません。 ただし、 Future でラップするか、他の同様のライブラリを使用することで、リクエストを簡単に非同期にすることができます。 リクエスト-ScalaにはJSON解析機能が組み込まれていません。 ただし、任意のJSONライブラリを使用してJSON値を解析できます。 これにより、ライブラリが軽量になり、ユーザーはお気に入りのJSONライブラリを使用してJSONを処理できます。

10. 結論

このチュートリアルでは、 Requests-Scala HTTPクライアントと、それを使用してHTTPリクエストを非常に簡単に作成する方法について説明しました。 いつものように、このチュートリアルで使用されている例は、GitHubから入手できます。