当前位置:首页 > 行业动态 > 正文

HttpURLConnection和okHttp两种获取网络数据

HttpURLConnection是Java原生API,轻量但功能基础;okHttp为第三方库,性能更优且支持缓存、拦截等扩展

HttpURLConnection与OkHttp获取网络数据对比

基础概念

  1. HttpURLConnection

    • Java原生API,无需额外依赖
    • 基于java.net包,直接操作HTTP协议
    • 接口较为底层,需手动处理连接、流、异常等
  2. OkHttp

    • 第三方HTTP客户端(Square公司开发)
    • 基于okhttp库,需添加依赖
    • 提供更高层次的API,内置连接池、缓存、拦截器等功能

核心特性对比

特性 HttpURLConnection OkHttp
依赖 无(JDK自带) 需添加okhttp依赖(如Maven/Gradle)
API复杂度 代码量大,需手动配置 链式调用,代码简洁
连接复用 不支持(每次新建连接) 自动连接池复用
异步支持 需手动创建线程 内置enqueue异步方法
拦截器/拦截链 支持自定义拦截器(如日志、重试)
HTTP/2支持 仅HTTP/1.1 支持HTTP/2(需服务器支持)
GZIP压缩支持 需手动处理 自动处理(默认开启)
超时配置 需手动设置 可全局配置或单次请求覆盖

代码示例对比

GET请求

HttpURLConnection

HttpURLConnection和okHttp两种获取网络数据  第1张

URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
    InputStream is = conn.getInputStream();
    // 读取数据并解析
    is.close();
} else {
    // 处理错误
}
conn.disconnect();

OkHttp

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://api.example.com/data")
    .build();
client.newCall(request).enqueue(new Callback() {
    @Override public void onFailure(Call call, IOException e) {
        // 处理失败
    }
    @Override public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String data = response.body().string();
            // 解析数据
        } else {
            // 处理错误
        }
    }
});

POST请求(带JSON体)

HttpURLConnection

URL url = new URL("https://api.example.com/post");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
JSONObject json = new JSONObject();
json.put("key", "value");
OutputStream os = conn.getOutputStream();
os.write(json.toString().getBytes());
os.close();
int responseCode = conn.getResponseCode();
// 处理响应...
conn.disconnect();

OkHttp

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON, "{"key":"value"}");
Request request = new Request.Builder()
    .url("https://api.example.com/post")
    .post(body)
    .build();
client.newCall(request).enqueue(new Callback() {
    @Override public void onFailure(Call call, IOException e) { / 处理失败 / }
    @Override public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String result = response.body().string();
            // 解析结果
        }
    }
});

适用场景建议

场景 推荐方案 原因
简单请求/学习用途 HttpURLConnection 无需依赖,适合理解HTTP原理
复杂项目/高频请求 OkHttp 性能优化、连接复用、异步支持更完善
需要拦截器/日志 OkHttp 内置拦截器链,方便扩展功能
Android应用 OkHttp 社区支持广泛,与Retrofit等库深度集成

相关问题与解答

问题1:在Android中如何选择HttpURLConnection或OkHttp?

解答

  • 若项目简单或需减少依赖,可使用HttpURLConnection
  • 若涉及复杂网络操作(如文件上传、缓存、日志记录),优先选择OkHttp
  • OkHttpRetrofit兼容性更好,适合现代Android开发。

问题2:OkHttp如何配置超时和缓存?

解答

  • 超时配置
    OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS) // 连接超时
        .readTimeout(10, TimeUnit.SECONDS)    // 读取超时
        .writeTimeout(10, TimeUnit.SECONDS)   // 写入超时
        .build();
  • 缓存配置
    int cacheSize = 10  1024  1024; // 10MB
    Cache cache = new Cache(context.getCacheDir(), cacheSize);
    OkHttpClient client = new OkHttpClient.Builder()
        .cache(cache)
        .build
0