上一篇
HttpURLConnection和okHttp两种获取网络数据
- 行业动态
- 2025-04-30
- 3527
HttpURLConnection是Java原生API,轻量但功能基础;okHttp为第三方库,性能更优且支持缓存、拦截等扩展
HttpURLConnection与OkHttp获取网络数据对比
基础概念
HttpURLConnection
- Java原生API,无需额外依赖
- 基于
java.net
包,直接操作HTTP协议 - 接口较为底层,需手动处理连接、流、异常等
OkHttp
- 第三方HTTP客户端(Square公司开发)
- 基于
okhttp
库,需添加依赖 - 提供更高层次的API,内置连接池、缓存、拦截器等功能
核心特性对比
特性 | HttpURLConnection | OkHttp |
---|---|---|
依赖 | 无(JDK自带) | 需添加okhttp 依赖(如Maven/Gradle) |
API复杂度 | 代码量大,需手动配置 | 链式调用,代码简洁 |
连接复用 | 不支持(每次新建连接) | 自动连接池复用 |
异步支持 | 需手动创建线程 | 内置enqueue 异步方法 |
拦截器/拦截链 | 无 | 支持自定义拦截器(如日志、重试) |
HTTP/2支持 | 仅HTTP/1.1 | 支持HTTP/2(需服务器支持) |
GZIP压缩支持 | 需手动处理 | 自动处理(默认开启) |
超时配置 | 需手动设置 | 可全局配置或单次请求覆盖 |
代码示例对比
GET请求
HttpURLConnection
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
。 OkHttp
与Retrofit
兼容性更好,适合现代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