Android 使用 HTTP 访问网络
使用 HttpURLConnection
在過去,Android 上發(fā)送 HTTP 請求一般有兩種方式:HttpURLConnection 和 HttpClient,不過在 Android 6.0 系統(tǒng)中,HttpClient 被完全移除了,因此推薦使用 HttpURLConnection
// 創(chuàng)建一個 URL 對象,并傳入目標(biāo)網(wǎng)絡(luò)地址 val url = URL("https://www.baidu.com") // 調(diào)用 openConnection() 方法即可獲取 HttpURLConnection 實(shí)例 val connection = url.openConnection() as HttpURLConnection // 設(shè)置 HTTP 請求所使用的方法 connection.requestMethod = "GET" // 連接超時毫秒數(shù) connection.connectTimeout = 8000 // 讀取超時毫秒數(shù) connection.readTimeout = 8000 // 獲取服務(wù)器返回的輸入流 val input = connection.inputStream // 關(guān)閉 HTTP 連接 connection.disconnection()另外,還需要聲明網(wǎng)絡(luò)權(quán)限,修改 AndroidManifest.xml 中的代碼
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.networktest"><uses-permission android:name="android.permission.INTERNET" />... </manifest>如果想要提交數(shù)據(jù)給服務(wù)器,只需將 HTTP 請求的方法改成 POST,并在獲取輸入流之前把要提交的數(shù)據(jù)寫出即可。每條數(shù)據(jù)都要以鍵值對的形式存在,數(shù)據(jù)與數(shù)據(jù)之前用 & 符號隔開
connection.requestMethod = "POST" val output = DataOutputStream(connection.outputStream) output.writeBytes("username=admin&password=123")使用 OkHttp
OkHttp 是由大名鼎鼎的 Square 公司開發(fā)的,在接口封裝上做得簡單易用,足以替代原生的 HttpURLConnection
在使用 OkHttp 之前,我們需要先在項(xiàng)目中添加 OkHttp 庫的依賴,編輯 app/build.gradle 文件,在 dependencies 閉包中添加如下內(nèi)容:
dependencies {...implementation 'com.squareup.okhttp3:okhttp:4.1.0' }看一下 OkHttp 的用法
// 創(chuàng)建 OkHttpClient 實(shí)例 val client = OkHttpClient() // 創(chuàng)建 Request 對象 val request = Request.Builder().url("https://www.baidu.com").build() // 調(diào)用 newCall() 方法創(chuàng)建 Call 對象,并調(diào)用 execute() 方法發(fā)送請求并獲取響應(yīng) val response = client.newCall(request).execute() // 得到具體的返回內(nèi)容 val responseData = response.body?.string()如果是發(fā)起一條 POST 請求,會比 GET 請求稍微復(fù)雜一點(diǎn)
// 構(gòu)建一個 RequestBody 對象存放待提交的參數(shù) val requestBody = FormBody.Builder().add("username", "admin").add("password", "123").build() // 調(diào)用 post 方法,并將 RequestBody 對象傳入 val request = Request.Builder().url("https://www.baidu.com").post(requestBody).build()網(wǎng)絡(luò)請求回調(diào)
在獲取到服務(wù)器響應(yīng)的數(shù)據(jù)后,我們就需要對它進(jìn)行解析和處理。OkHttp 提供了一個自帶的回調(diào)接口,它會幫助我們開啟一個子線程,然后在子線程中執(zhí)行 HTTP 請求,并將最終的請求結(jié)果回調(diào)到 okhttp3.Callback
object HttpUtil {...fun sendOkHttpRequest(address: String, callback: okhttp3.Callback) {val client = OkHttpClient()val request = Request.Builder().url(address).build()client.newCall(request).enqueue(callback)} }我們在調(diào)用 sendOkHttpRequest() 方法的時候就可以這么寫
HttpUtil.sendOkHttpRequest(address, object : Callback {// 得到服務(wù)器返回的具體內(nèi)容override fun onResponse(call: Call, response: Response) {...}// 對異常情況進(jìn)行處理override fun onFailure(call: Call, e: IOException) {...} })總結(jié)
以上是生活随笔為你收集整理的Android 使用 HTTP 访问网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机专业可以考天文学研究生吗,天文学专
- 下一篇: 使用字节流和字符流向浏览器输出数据