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

安卓开发 手机客户端向服务器发送请求

安卓客户端向服务器发送请求的实现与要点

网络权限配置

AndroidManifest.xml 中声明网络权限:

<uses-permission android:name="android.permission.INTERNET" />

注意:未声明权限会导致应用无法联网,部分情况可能直接崩溃。


常用网络请求方式对比

方式 适用场景 特点
HttpURLConnection 简单请求(如GET/POST) 原生API,需手动处理线程和数据流
OkHttp 复杂请求、长连接、缓存 轻量级库,支持同步/异步,自动压缩和缓存
Retrofit RESTful API、JSON解析 基于OkHttp,通过注解生成接口,支持Gson/Moshi等库自动解析
Volley 短时间高频请求(如列表加载) Android官方推荐,支持ImageLoader和网络请求队列

异步处理网络请求

使用 AsyncTask(已过时,但仍可用)

new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... voids) {
        // 执行网络请求
        return sendRequest();
    }
    @Override
    protected void onPostExecute(String result) {
        // 更新UI
    }
}.execute();

使用 Thread + Handler

安卓开发 手机客户端向服务器发送请求  第1张

new Thread(() -> {
    String response = sendRequest();
    handler.post(() -> {
        // 更新UI
    });
}).start();

现代方案:协程(Kotlin)

GlobalScope.launch(Dispatchers.IO) {
    val response = sendRequest()
    withContext(Dispatchers.Main) {
        // 更新UI
    }
}

GET/POST请求示例(以OkHttp为例)

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 data = response.body().string();
            // 处理数据
        }
    }
});

POST请求(JSON参数)

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, "{"key":"value"}");
Request request = new Request.Builder()
    .url("https://api.example.com/upload")
    .post(body)
    .build();

错误处理与异常捕获

错误类型 解决方案
网络不可用 检查 ConnectivityManager 状态,提示用户检查网络
超时/连接失败 设置 OkHttpClienttimeout,重试机制
HTTP错误码(如404/500) 根据 response.code() 判断,区分客户端错误(4xx)和服务端错误(5xx)
SSL证书验证失败 使用 HttpsURLConnection 时需配置证书,或通过 OkHttpSSLSocketFactory

安全性优化

  1. 强制HTTPS:在正式环境中禁用明文HTTP请求。
  2. 证书校验:避免使用 OkHttpClient.Builder().sslSocketFactory(NoSSL(), trustAllCert),防止中间人攻击。
  3. 敏感数据加密:传输前对敏感字段(如密码)进行加密。

相关问题与解答

问题1:如何解析服务器返回的JSON数据?

解答
使用 GsonMoshi 库将JSON字符串转换为对象。

Gson gson = new Gson();
MyDataObject data = gson.fromJson(response, MyDataObject.class);

注意:确保JSON字段与对象属性命名一致,或使用 @SerializedName 注解映射。


问题2:如何上传图片到服务器?

解答
使用 MultipartBody 构建文件上传请求:

File file = new File("/path/to/image.jpg");
RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", file.getName(), RequestBody.create(file, MediaType.parse("image/jpeg")))
    .build();

注意:服务器需支持 multipart/form-data 格式,且需处理文件存储

0