Android HttpURLConnection用法详解

HttpURLConnection 是 Android 进行网络请求的一个轻量级 HTTP 客户端,适用于简单的 GET 和 POST 请求。以下是 HttpURLConnection 的基本使用方法。


使用步骤

  1. 创建 URL 对象
  2. 打开连接并配置请求
  3. 发送请求
  4. 读取响应
  5. 关闭连接

示例代码

1. GET 请求

kotlin 复制代码
import java.net.HttpURLConnection
import java.net.URL
​
fun sendGetRequest(urlString: String): String? {
    var connection: HttpURLConnection? = null
    try {
        val url = URL(urlString)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "GET"
        connection.connectTimeout = 5000  // 超时时间
        connection.readTimeout = 5000
        connection.doInput = true  // 允许输入流
​
        if (connection.responseCode == HttpURLConnection.HTTP_OK) {
            return connection.inputStream.bufferedReader().use { it.readText() }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()  // 断开连接
    }
    return null
}
​
// 使用
val response = sendGetRequest("https://api.example.com/data")
println(response)

2. POST 请求

kotlin 复制代码
import java.io.OutputStream
import java.net.HttpURLConnection
import java.net.URL
​
fun sendPostRequest(urlString: String, postData: String): String? {
    var connection: HttpURLConnection? = null
    try {
        val url = URL(urlString)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "POST"
        connection.connectTimeout = 5000
        connection.readTimeout = 5000
        connection.doOutput = true  // 允许输出流
        connection.setRequestProperty("Content-Type", "application/json") // 发送 JSON 数据
​
        // 发送数据
        connection.outputStream.use { os: OutputStream ->
            os.write(postData.toByteArray())
            os.flush()
        }
​
        if (connection.responseCode == HttpURLConnection.HTTP_OK) {
            return connection.inputStream.bufferedReader().use { it.readText() }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()
    }
    return null
}
​
// 使用
val jsonBody = """{"username":"test","password":"123456"}"""
val postResponse = sendPostRequest("https://api.example.com/login", jsonBody)
println(postResponse)

注意事项

  1. 网络请求必须在子线程执行

    • 在 Android 9 及以上,主线程访问网络会抛出 NetworkOnMainThreadException。
    • 可以使用 Coroutine 或 Thread 处理。

    使用 Coroutine 进行网络请求

    kotlin 复制代码
    kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.withContext
    ​
    suspend fun fetchData(): String? {
        return withContext(Dispatchers.IO) { 
            sendGetRequest("https://api.example.com/data") 
        }
    }

    使用 fetchData()

    不能在主线程直接调用 fetchData(),需要在协程中调用,例如:

    kotlin 复制代码
    import kotlinx.coroutines.*
    ​
    fun main() {
        GlobalScope.launch {
            val result = fetchData()
            println(result)
        }
        Thread.sleep(6000) // 等待协程执行(仅示例用,实际开发不推荐)
    }
  2. 权限

    • 在 AndroidManifest.xml 中添加权限:
    ini 复制代码
    <uses-permission android:name="android.permission.INTERNET"/>
  3. 超时设置

    • connectTimeout 和 readTimeout 防止请求长时间挂起。

替代方案

在 Android 现代开发中,建议使用 OkHttp 或 Retrofit 进行网络请求,HttpURLConnection 适用于轻量级请求或对库依赖要求较高的项目。

🔄 对比:HttpURLConnection vs OkHttp vs Retrofit

特性 HttpURLConnection OkHttp Retrofit
原生支持 ✅ ❌(需导入库) ❌(需依赖 OkHttp)
简洁性 ❌ ✅ ✅✅
请求配置 繁琐 简单 非常简单(注解)
自动解析 JSON ❌ ❌(需手动) ✅(配合 Gson/Moshi)
拦截器支持 ❌ ✅ ✅
相关推荐
康小汪15 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南16 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
小满zs16 小时前
Go语言第十七章(反射)
后端·go
小满zs16 小时前
Go语言第十五章(JSON序列化)
后端·go
小满zs16 小时前
Go语言第十六章(自定义类型)
后端·go
金銀銅鐵17 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设17 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
白山编程大哥17 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt18 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn19 小时前
bundle优化
前端