凌峰创科服务平台

Android如何向服务器发送请求?

在Android应用开发中,向服务器请求数据是核心功能之一,涉及网络通信、数据解析、错误处理等多个环节,本文将从请求方式、网络库选择、具体实现步骤、异常处理及安全优化等方面展开详细说明。

Android如何向服务器发送请求?-图1
(图片来源网络,侵删)

HTTP请求方式与数据格式

Android向服务器发送请求通常采用HTTP/HTTPS协议,主要分为GET和POST两种方式,GET请求用于获取数据,参数通过URL拼接传递,适合查询类操作;POST请求用于提交数据,参数放在请求体中,适合表单提交、文件上传等场景,数据格式则常见JSON和XML,其中JSON因轻量级、易解析成为主流选择,登录请求可采用POST方式,将用户名和密码以JSON格式{"username":"admin","password":"123456"}放入请求体。

网络请求库选择

原生使用HttpURLConnection可实现请求,但代码复杂度高,目前开发者更倾向于第三方库,主流选择包括:

  1. OkHttp:Square公司开源,支持HTTP/2、异步请求、缓存机制,通过OkHttpClient和Request/Response对象简化操作,是目前Android最流行的网络库。
  2. Retrofit:基于OkHttp封装,提供接口注解(如@GET、@POST)将网络请求转为方法调用,支持Gson、Jackson等数据解析器,适合RESTful API开发。
  3. Volley:Google推出,适合轻量级、频繁的小数据量请求,内置图片加载和请求队列管理,但已停止更新。

OkHttp实现请求步骤

以OkHttp为例,具体实现流程如下:

  1. 添加依赖:在app模块的build.gradle中添加implementation("com.squareup.okhttp3:okhttp:4.12.0")
  2. 创建OkHttpClient:配置超时时间、拦截器等参数,
    OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .build();
  3. 构建Request:通过Request.Builder设置URL、请求方法、请求头及请求体,GET请求示例:
    Request request = new Request.Builder()
        .url("https://api.example.com/data")
        .build();

    POST请求需添加请求体,如:

    MediaType JSON = MediaType.get("application/json; charset=utf-8");
    String json = "{\"key\":\"value\"}";
    RequestBody body = RequestBody.create(json, JSON);
    Request request = new Request.Builder()
        .url("https://api.example.com/submit")
        .post(body)
        .build();
  4. 发起同步/异步请求:同步请求在子线程中执行,阻塞当前线程;异步请求通过Callback回调结果,异步请求示例:
    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();
                // 解析并更新UI
            }
        }
    });
  5. 线程处理:Android主线程不能执行网络请求,需通过Handler、AsyncTask或RxJava等将结果切换到主线程更新UI。

Retrofit实现接口化请求

Retrofit通过定义接口简化开发,步骤如下:

  1. 添加依赖:需同时添加Retrofit和Gson依赖:

    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
  2. 定义API接口:使用注解描述请求方法,

    public interface ApiService {
        @GET("users/{id}")
        Call<User> getUser(@Path("id") int id);
        @POST("login")
        Call<LoginResponse> login(@Body LoginRequest request);
    }
  3. 创建Retrofit实例

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    ApiService service = retrofit.create(ApiService.class);
  4. 调用接口:生成Call对象并执行请求,异步请求可直接通过enqueue回调:

    Call<User> call = service.getUser(1);
    call.enqueue(new Callback<User>() {
        @Override
        public void onFailure(Call<User> call, Throwable t) {}
        @Override
        public void onResponse(Call<User> call, Response<User> response) {}
    });

异常处理与优化

网络请求需全面处理异常情况,包括:

  1. 网络异常:如无网络连接(ConnectivityException)、超时(SocketTimeoutException),可通过OkHttp的Interceptor检测网络状态。
  2. 服务器异常:根据HTTP状态码判断,如401(未授权)、500(服务器错误),在Callback中解析错误信息。
  3. 数据解析异常:使用try-catch包裹JSON解析逻辑,避免因格式错误导致崩溃。
  4. 安全优化
    • 使用HTTPS加密传输,避免中间人攻击。
    • 敏感数据(如Token)通过请求头传递,避免URL暴露。
    • 添加请求头(如"Content-Type")确保数据格式正确。

请求性能优化

  1. 缓存机制:OkHttp支持缓存,通过设置CacheControl控制缓存策略,减少重复请求。
  2. 请求合并:对多个独立请求使用AsyncTask或RxJava合并处理,避免频繁网络调用。
  3. 连接池复用:OkHttpClient默认维护连接池,复用TCP连接降低延迟。

相关问答FAQs

Q1: Android中为何不能在主线程发起网络请求?
A1: Android系统规定主线程(UI线程)不能执行耗时操作,包括网络请求,若在主线程请求,会导致ANR(Application Not Responding)异常,网络请求需在子线程(如使用AsyncTask、线程池或Retrofit的异步回调)中执行,并通过Handler或LiveData将结果传递到主线程更新UI。

Q2: 如何处理网络请求中的图片加载?
A2: 图片加载需考虑内存优化和缓存策略,推荐使用Glide或Picasso库,它们内置内存缓存、磁盘缓存及图片压缩功能,Glide加载图片只需一行代码:Glide.with(context).load("https://image.url").into(imageView),需注意在Activity/Fragment销毁时调用Glide.with(context).clear()取消未完成的加载任务,避免内存泄漏。

分享:
扫描分享到社交APP
上一篇
下一篇