# How to send HTTP requests in scala?
Add the dependency on okhttp client library:
libraryDependencies in ThisBuild += "com.squareup.okhttp3" % "okhttp" % "3.9.1"Steps to add a 3rd party dependency here.
Define a
WebClientutility class withget&postapis:import java.util.concurrent.TimeUnit import okhttp3._ import scala.collection.mutable import scala.collection.JavaConverters._ class WebClient(urlFirstPart:String) { private val client = new OkHttpClient().newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .cookieJar(new SimpleOkHttpCookieJar) .build() def post(urlLastPart: String, json: String):(Int, String) = { val url = urlFirstPart + urlLastPart val JSON = MediaType.parse("application/json; charset=utf-8") val headers = Headers.of("Accept", "application/json") val body = RequestBody.create(JSON, json) val request = new Request.Builder().url(url).headers(headers).post(body).build val response = client.newCall(request).execute val code = response.code() val responseString = response.body().string() response.close() code -> responseString } def get(urlLastPart: String):(Int, String) = { val url = urlFirstPart + urlLastPart val headers = Headers.of("Accept", "application/json") val request = new Request.Builder().url(url).headers(headers).get().build val response = client.newCall(request).execute val code = response.code() val responseString = response.body().string() response.close() code -> responseString } } class SimpleOkHttpCookieJar extends CookieJar { private val storage = mutable.Map.empty[String, Cookie] override def saveFromResponse(url: HttpUrl, cookies: java.util.List[Cookie]): Unit = { val cookieList = cookies.asScala storage ++= cookieList.map(c => c.name -> c) } override def loadForRequest(url: HttpUrl): java.util.List[Cookie] = { storage --= storage.filter(_._2.expiresAt() < System.currentTimeMillis()).keySet storage.filter(_._2.matches(url)).values.toList.asJava } }Usage sample:
lazy val at: String = "https://httpbin.org/" val client = new WebClient(at) //GET calls val (code, body) = client.get("get") if (code == 200) { //logic to parse the response body can go here.. //maybe converting the String to JSON helps: body.parseToJsObject Success(()) } else Failure(new RuntimeException(s"$code: $body")) //POST calls val userName = "seetha" val password = "Welcome" val json = s"""{ | "userName" : "$userName", | "password" : "$password" |}""".stripMargin val (responseCode, respnseBody) = client.post("post", json) if (responseCode == 200) Success(()) else Failure(new RuntimeException(s"$responseCode: $respnseBody"))
REFERENCES