上一篇
安卓开发 手机客户端向服务器发送请求
- 行业动态
- 2025-04-21
- 4
安卓客户端向服务器发送请求的实现与要点
网络权限配置
在 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
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 状态,提示用户检查网络 |
超时/连接失败 | 设置 OkHttpClient 的 timeout ,重试机制 |
HTTP错误码(如404/500) | 根据 response.code() 判断,区分客户端错误(4xx)和服务端错误(5xx) |
SSL证书验证失败 | 使用 HttpsURLConnection 时需配置证书,或通过 OkHttp 的 SSLSocketFactory |
安全性优化
- 强制HTTPS:在正式环境中禁用明文HTTP请求。
- 证书校验:避免使用
OkHttpClient.Builder().sslSocketFactory(NoSSL(), trustAllCert)
,防止中间人攻击。 - 敏感数据加密:传输前对敏感字段(如密码)进行加密。
相关问题与解答
问题1:如何解析服务器返回的JSON数据?
解答:
使用 Gson
或 Moshi
库将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
格式,且需处理文件存储