リクエストを使用した単純なRESTリクエスト-Scala
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ライブラリRequestsのScalaポートです。 これは、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の場合、compressをrequests.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でから入手できます。