HTTP Request in Kotlin

后端 未结 11 2435
不知归路
不知归路 2020-11-28 06:59

I\'m completely new to Kotlin. I want to do a login validation using POST method and to get some information using GET method. I\'ve URL, server Username and Password alread

相关标签:
11条回答
  • 2020-11-28 07:30

    If you are using Kotlin, you might as well keep your code as succinct as possible. The run method turns the receiver into this and returns the value of the block. this as HttpURLConnection creates a smart cast. bufferedReader().readText() avoids a bunch of boilerplate code.

    return URL(url).run {
            openConnection().run {
                this as HttpURLConnection
                inputStream.bufferedReader().readText()
            }
    }
    

    You can also wrap this into an extension function.

    fun URL.getText(): String {
        return openConnection().run {
                    this as HttpURLConnection
                    inputStream.bufferedReader().readText()
                }
    }
    

    And call it like this

    return URL(url).getText()
    

    Finally, if you are super lazy, you can extend the String class instead.

    fun String.getUrlText(): String {
        return URL(this).run {
                openConnection().run {
                    this as HttpURLConnection
                    inputStream.bufferedReader().readText()
                }
        }
    }
    

    And call it like this

    return "http://somewhere.com".getUrlText()
    
    0 讨论(0)
  • 2020-11-28 07:30
    import java.io.IOException
    import java.net.URL
    
    fun main(vararg args: String) {
        val response = try {
            URL("http://seznam.cz")
                    .openStream()
                    .bufferedReader()
                    .use { it.readText() }
        } catch (e: IOException) {
            "Error with ${e.message}."
        }
        println(response)
    }
    
    0 讨论(0)
  • 2020-11-28 07:32

    Have a look at Fuel library, a sample GET request

    "https://httpbin.org/get"
      .httpGet()
      .responseString { request, response, result ->
        when (result) {
          is Result.Failure -> {
            val ex = result.getException()
          }
          is Result.Success -> {
            val data = result.get()
          }
        }
      }
    
    // You can also use Fuel.get("https://httpbin.org/get").responseString { ... }
    // You can also use FuelManager.instance.get("...").responseString { ... }
    

    A sample POST request

    Fuel.post("https://httpbin.org/post")
        .jsonBody("{ \"foo\" : \"bar\" }")
        .also { println(it) }
        .response { result -> }
    

    Their documentation can be found here ​

    0 讨论(0)
  • 2020-11-28 07:37

    Send HTTP POST/GET request with parameters using HttpURLConnection :

    POST with Parameters:

    fun sendPostRequest(userName:String, password:String) {
    
        var reqParam = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(userName, "UTF-8")
        reqParam += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8")
        val mURL = URL("<Your API Link>")
    
        with(mURL.openConnection() as HttpURLConnection) {
            // optional default is GET
            requestMethod = "POST"
    
            val wr = OutputStreamWriter(getOutputStream());
            wr.write(reqParam);
            wr.flush();
    
            println("URL : $url")
            println("Response Code : $responseCode")
    
            BufferedReader(InputStreamReader(inputStream)).use {
                val response = StringBuffer()
    
                var inputLine = it.readLine()
                while (inputLine != null) {
                    response.append(inputLine)
                    inputLine = it.readLine()
                }
                println("Response : $response")
            }
        }
    }
    

    GET with Parameters:

    fun sendGetRequest(userName:String, password:String) {
    
            var reqParam = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(userName, "UTF-8")
            reqParam += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8")
    
            val mURL = URL("<Yout API Link>?"+reqParam)
    
            with(mURL.openConnection() as HttpURLConnection) {
                // optional default is GET
                requestMethod = "GET"
    
                println("URL : $url")
                println("Response Code : $responseCode")
    
                BufferedReader(InputStreamReader(inputStream)).use {
                    val response = StringBuffer()
    
                    var inputLine = it.readLine()
                    while (inputLine != null) {
                        response.append(inputLine)
                        inputLine = it.readLine()
                    }
                    it.close()
                    println("Response : $response")
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-28 07:40

    You can use kohttp library. It is a Kotlin DSL HTTP client. It supports the features of square.okhttp and provides a clear DSL for them. KoHttp async calls are powered by coroutines.

    httpGet extension function

    val response: Response = "https://google.com/search?q=iphone".httpGet()
    

    you can also use async call with coroutines

    val response: Deferred<Response> = "https://google.com/search?q=iphone".asyncHttpGet()
    

    or DSL function for more complex requests

    val response: Response = httpGet {
        host = "google.com"
        path = "/search"
        param {
           "q" to "iphone"
           "safe" to "off"
       }
    }
    

    You can find more details in docs

    To get it with gradle use

    implementation 'io.github.rybalkinsd:kohttp:0.12.0'
    
    0 讨论(0)
提交回复
热议问题