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

安卓向服务器发送请求

安卓通过HTTP/HTTPS协议,使用OkHttp等网络库,向服务器发起请求并解析响应

安卓网络请求基础

  1. 权限配置
    AndroidManifest.xml中声明网络权限:

    <uses-permission android:name="android.permission.INTERNET" />
  2. 网络线程要求
    Android禁止在主线程(UI线程)中执行网络请求,需通过子线程或异步任务处理。


常用网络请求方式对比

方式 特点 适用场景
HttpURLConnection 原生API,需手动管理连接、参数、流操作 简单请求,无第三方库依赖
OkHttp 高效、支持缓存、拦截器、自动重试 复杂请求,性能优先
Retrofit 基于OkHttp,通过注解生成接口,支持JSON转换、协程 RESTful API,快速开发
Volley 轻量级,支持JSON、图像加载,内置缓存机制 小型项目,简单数据交互

OkHttp实现示例

添加依赖

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) {
        // 处理失败(如网络错误)
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String jsonData = response.body().string();
            // 解析JSON数据
        }
    }
});

POST请求带参数

RequestBody body = new FormBody.Builder()
    .add("username", "test")
    .add("password", "123456")
    .build();
Request postRequest = new Request.Builder()
    .url("https://api.example.com/login")
    .post(body)
    .build();

Retrofit实现示例

添加依赖

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

定义接口

public interface ApiService {
    @GET("users/{id}")
    Call<User> getUser(@Path("id") int userId);
    @POST("login")
    Call<Token> login(@Field("username") String username, @Field("password") String password);
}

创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();
ApiService apiService = retrofit.create(ApiService.class);

异步调用

apiService.getUser(123).enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        if (response.isSuccessful()) {
            User user = response.body();
            // 处理数据
        }
    }
    @Override
    public void onFailure(Call<User> call, Throwable t) {
        // 处理失败
    }
});

数据解析与错误处理

  1. JSON解析

    • 使用GsonMoshi将JSON映射为Java对象。
    • Retrofit内置GsonConverterFactory,自动完成解析。
  2. 错误处理

    • 网络错误:捕获IOException,提示用户检查网络。
    • 服务器错误:检查response.code(),如404500
    • 数据解析错误:捕获JsonSyntaxException,提示数据格式异常。

常见问题与优化

问题 解决方案
内存泄漏 使用静态单例OkHttpClient,避免频繁创建;Retrofit Service建议短生命周期
SSL证书验证 配置OkHttpClientSSLSocketFactory,或信任特定证书
大文件下载 使用OkHttpStream分块读取,避免一次性加载到内存
并发请求管理 通过OkHttpDispatcher限制并发数,或使用RetrofitCallAdapter

相关问题与解答

问题1:如何选择OkHttp和Retrofit?

  • OkHttp:适合需要精细控制请求的场景(如自定义拦截器、缓存策略)。
  • Retrofit:适合RESTful API,通过注解快速生成接口,减少模板代码。

问题2:如何处理多个并发请求?

  • 方案1:使用OkHttpClientDispatcher设置最大并发数:
    OkHttpClient client = new OkHttpClient.Builder()
        .dispatcher(new Dispatcher())
        .build();
  • 方案2:在Retrofit中结合RxJavaLiveData管理并发:
    apiService.getUser(1).enqueue(/ ... /);
    apiService.getUser(2).enqueue(/ ... /); // 自动并发执行
0