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

安卓开发发送请求数据包

Android网络请求工具类选择

工具类 特点 适用场景
HttpURLConnection 原生API,需手动处理连接、流操作 简单请求,学习底层原理
OkHttp 第三方库,支持连接池、缓存、自动压缩 复杂网络请求,高性能
Retrofit 基于OkHttp,通过注解生成接口,支持数据转换(Gson/XML等) RESTful API对接
Volley Google官方推荐,适合小数据量、频繁网络请求(如列表加载) 轻量级网络操作

发送GET请求数据包

使用HttpURLConnection发送GET请求

// 1. 创建URL对象
URL url = new URL("https://api.example.com/data?param1=value1&param2=value2");
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法
connection.setRequestMethod("GET");
// 4. 设置请求头(可选)
connection.setRequestProperty("Accept", "application/json");
// 5. 发起请求并获取响应码
int responseCode = connection.getResponseCode();
// 6. 读取响应数据
if (responseCode == HttpURLConnection.HTTP_OK) {
    InputStream inputStream = connection.getInputStream();
    // 解析输入流(如JSON/XML)
} else {
    // 处理错误响应
}
// 7. 关闭连接
connection.disconnect();

使用OkHttp发送GET请求

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://api.example.com/data?param1=value1&param2=value2")
    .addHeader("Accept", "application/json")
    .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 jsonData = response.body().string();
            // 解析JSON数据
        } else {
            // 处理错误响应
        }
    }
});

发送POST请求数据包

使用HttpURLConnection发送POST请求(带参数)

// 1. 创建URL对象
URL url = new URL("https://api.example.com/data");
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法为POST
connection.setRequestMethod("POST");
// 4. 启用输出流
connection.setDoOutput(true);
// 5. 设置请求头
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 6. 写入参数数据
String params = "param1=value1&param2=value2";
OutputStream os = connection.getOutputStream();
os.write(params.getBytes());
os.flush();
os.close();
// 7. 获取响应码并处理响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    // 读取响应数据
} else {
    // 处理错误响应
}
connection.disconnect();

使用OkHttp发送POST请求(带JSON数据)

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
String json = "{"param1":"value1","param2":"value2"}";
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
    .url("https://api.example.com/data")
    .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 responseData = response.body().string();
            // 解析响应数据
        } else {
            // 处理错误响应
        }
    }
});

异步处理与线程管理

方式 说明
AsyncTask 已过时,但仍可用于简单异步任务(Android 11+需注意限制)
Handler+Thread 手动管理线程,适用于简单场景
RxJava 响应式编程,适合复杂异步链式调用
Kotlin Coroutine 协程,轻量级线程管理,推荐现代开发方式(需Kotlin语言)

Kotlin协程示例(发送网络请求)

// 在ViewModel或LifecycleScope中调用
viewModelScope.launch {
    try {
        val response = withContext(Dispatchers.IO) {
            client.newCall(request).execute() // OkHttp同步调用
        }
        if (response.isSuccessful) {
            // 处理UI更新(需切换到主线程)
        }
    } catch (e: Exception) {
        // 处理异常
    }
}

数据解析与封装

数据类型 解析工具 示例代码
JSON Gson/Moshi/Jackson Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class);
XML XmlPullParser/Simple 使用XmlPullParser逐行解析或Simple框架映射对象
Protobuf Google Protocol Buffer 定义.proto文件后生成Java类,直接序列化/反序列化

常见问题与解决方案

问题描述 解决方案
网络权限未声明 AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>
主线程网络操作导致ANR 使用异步任务(如协程、AsyncTaskHandler)处理网络请求
SSL证书验证失败 信任所有证书(开发环境):client.sslSocketFactory(trustAllCertificates())
POST请求参数丢失 确保Content-Type正确(如application/jsonx-www-form-urlencoded
大文件上传失败 使用MultipartBody分片上传,或开启ChunkedEncoding

相关问题与解答

问题1:如何选择HTTP客户端库(OkHttp vs Retrofit)?

解答

  • OkHttp:适合需要精细控制连接、拦截器、缓存的场景,灵活性高。
  • Retrofit:基于OkHttp,通过注解自动生成接口,适合RESTful API快速开发,减少模板代码。
    建议:若API接口固定且需要数据转换(如JSON),优先使用Retrofit;若需要自定义连接逻辑,选择OkHttp。

问题2:如何处理网络请求的超时和重试?

解答

  • 超时设置
    OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS) // 连接超时
        .readTimeout(10, TimeUnit.SECONDS)    // 读取超时
        .build();
  • 重试机制
    • 使用Interceptor实现自动重试:
      client.interceptors().add(chain -> {
          Response response = chain.proceed(chain.request());
          if (!response.isSuccessful()) { // 根据需求判断是否重试
              return chain.proceed(chain.request()); // 重试一次
          }
          return response;
      });
    • 或使用RetryHelper(第三方库)统一管理重试策略