# How to send HTTP requests in scala?

  1. 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.

  2. Define a WebClient utility class with get & post apis:

    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
      }
    }
    
    
  3. 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