二十三、Android-使用HTTP访问网络

74 阅读1分钟

项目中访问网络,请求服务器数据是必不可少的模块,Android中也提供了访问网络的接口,但也有一些优秀的第三方库封装,方便我们使用。

23.1 HttpURLConnection

    private fun sendRequestWithHttpURLConnection() {
        // 开启线程发起网络请求
        thread {
            var connection: HttpURLConnection? = null
            try {
                val response = StringBuilder()
                val url = URL("https://juejin.cn/")
                connection = url.openConnection() as HttpURLConnection
                connection.connectTimeout = 8000
                connection.readTimeout = 8000
                val input = connection.inputStream
                // 下面对获取到的输入流进行读取
                val reader = BufferedReader(InputStreamReader(input))
                reader.use {
                    reader.forEachLine {
                        response.append(it)
                    }
                }
                showResponse(response.toString())
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                connection?.disconnect()
            }
        }
    }
    private fun showResponse(response: String) {
        runOnUiThread {
            viewBinding.responseText.text = response
        }
    }

当然也需要声明网络权限

    <uses-permission android:name="android.permission.INTERNET"/>

可以设置请求方式、参数。注意,每条数据都要以键值对的形式存在,数据与数据之间用“&”符号隔开

connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("username=admin&password=123456")

23.2 OkHttp-优秀的开源网络库

github仓库:github.com/square/okht…

  • 引用: 在app模块下的build.gradle文件中,dependencies
dependencies {
    implementation 'androidx.core:core-ktx:1.8.0'
    ...
    // okhttp
    implementation 'com.squareup.okhttp3:okhttp:4.1.0'
    implementation 'com.orhanobut:logger:2.2.0'
​
}

添加后点击Sync Now,然后可以在Android Studio底部工具栏Build中查看是否成功

  • 使用:可参考官方说明
  private fun useOkHttpGet() {
        val client = OkHttpClient()
        // 默认get请求
        val request = Request.Builder()
            .url("https://www.baidu.com")
            .build()
        val response = client.newCall(request).execute()
        val responseData = response.body?.string()
    }
    // Post请求
    private  fun useOkHttpPost() {
        val client = OkHttpClient()
        val requestBody = FormBody.Builder()
            .add("key1", "value1")
            .add("key2", "value2")
            .build()
        val request = Request.Builder()
            .url("https://www.baidu.com")
            .post(requestBody)
            .build()
        val response = client.newCall(request).execute()
        val responseData = response.body?.string()
    }

23.3 网络请求回调的实现方式

object HttpUtil {
    // okHttp请求封装
    fun sendOkHttpRequest(address: String, callback: okhttp3.Callback) {
        val client = OkHttpClient()
        val request = Request.Builder()
            .url(address)
            .build()
        client.newCall(request).enqueue(callback)
    }
}
// 使用
    private fun useOKHttpUtil() {
        val address = "https://www.baidu.com"
        HttpUtil.sendOkHttpRequest(address, object : Callback {
            override fun onResponse(call: Call, response: Response) {
                // 得到服务器返回的具体内容
                val responseData = response.body?.string()
            }
            override fun onFailure(call: Call, e: IOException) {
                // 在这里处理异常
            }
        })
    }

这只是网络的简单封装,应该在此基础上统一封装处理成功、失败情况,统一处理后,再回调。