上一篇
安卓开发发送请求数据
- 行业动态
- 2025-04-21
- 4
安卓开发中发送请求数据的方法与实践
使用原生 HttpURLConnection
发送请求
添加网络权限
在AndroidManifest.xml
中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
GET 请求示例
String url = "https://api.example.com/data"; new Thread(() -> { try { URL requestUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 读取响应 InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); connection.disconnect(); // 回到主线程处理结果 runOnUiThread(() -> { Log.d("Response", response.toString()); }); } catch (Exception e) { e.printStackTrace(); } }).start();
POST 请求示例
String url = "https://api.example.com/upload"; String jsonData = "{"key":"value"}"; new Thread(() -> { try { URL requestUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/json"); // 写入请求体 OutputStream outputStream = connection.getOutputStream(); outputStream.write(jsonData.getBytes()); outputStream.flush(); outputStream.close(); // 读取响应 InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); connection.disconnect(); // 回到主线程处理结果 runOnUiThread(() -> { Log.d("Response", response.toString()); }); } catch (Exception e) { e.printStackTrace(); } }).start();
使用第三方库 OkHttp 发送请求
添加依赖
在build.gradle
中添加:implementation 'com.squareup.okhttp3:okhttp:4.10.0'
GET 请求示例
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) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { final String responseBody = response.body().string(); runOnUiThread(() -> Log.d("Response", responseBody)); } } });
POST 请求示例
OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create( "{"key":"value"}", MediaType.parse("application/json")); Request request = new Request.Builder() .url("https://api.example.com/upload") .post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { final String responseBody = response.body().string(); runOnUiThread(() -> Log.d("Response", responseBody)); } } });
使用 Retrofit 发送请求
添加依赖
在build.gradle
中添加:implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
定义接口
public interface ApiService { @GET("data") Call<ResponseBody> getData(); @POST("upload") Call<ResponseBody> uploadData(@Body Map<String, String> data); }
创建 Retrofit 实例并调用
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // GET 请求 Call<ResponseBody> call = apiService.getData(); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccessful()) { try { Log.d("Response", response.body().string()); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { t.printStackTrace(); } }); // POST 请求 Map<String, String> data = new HashMap<>(); data.put("key", "value"); apiService.uploadData(data).enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccessful()) { try { Log.d("Response", response.body().string()); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { t.printStackTrace(); } });
注意事项
- 网络权限
必须声明<uses-permission android:name="android.permission.INTERNET" />
。 - 主线程限制
网络请求需在子线程执行,UI 更新需切回主线程。 - SSL 证书验证
- OkHttp 可配置忽略 SSL 验证(仅限测试环境):
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new TrustAllCertificates().sslSocketFactory(), new TrustAllCertificates().trustManager) .build();
- Retrofit 可通过 OkHttpClient 配置。
- OkHttp 可配置忽略 SSL 验证(仅限测试环境):
- 错误处理
需处理网络异常、超时、服务器错误等。
方法对比表
方法 | 优点 | 缺点 |
---|---|---|
HttpURLConnection |
原生支持,无需额外依赖;灵活性高 | 代码量大,API 繁琐;需手动处理线程和异常 |
OkHttp |
轻量级,支持缓存、拦截器;代码简洁 | 需手动管理线程;复杂功能需自定义 |
Retrofit |
基于 OkHttp,支持动态代理、注解;适合复杂 API 交互 | 学习成本较高;依赖较多 |
Volley |
适合小规模数据请求,内置缓存和队列管理 | 不支持 HTTP/2;不适合大文件上传下载 |
相关问题与解答
问题 1:如何选择适合的网络请求库?
- HttpURLConnection:适合简单场景或学习网络原理。
- OkHttp:适合需要高效、灵活控制的网络请求(如自定义拦截器)。
- Retrofit:适合复杂的 RESTful API 交互,尤其是结合 RxJava 或协程时。
- Volley:适合小数据量、短生命周期的请求(如 ListView 图片加载)。
问题 2:如何处理 HTTPS 证书验证?
- OkHttp:通过
SSLSocketFactory
和TrustManager
自定义验证逻辑,或临时忽略验证(仅限测试)。 - Retrofit:通过 OkHttpClient 配置 SSL 验证。
- 通用方案:将证书添加到应用信任库,或使用第三方库(如
TrustKit
)管理证书