上一篇
安卓中接收服务器数据库
- 行业动态
- 2025-04-24
- 5
安卓通过HTTP请求访问服务器API,解析JSON/XML数据,使用Retrofit等库异步获取数据库内容
服务器端准备
创建API接口
- 通过服务器端语言(如PHP/Java/Python/Node.js)编写接口,从数据库查询数据并返回JSON格式。
- 示例(PHP+MySQL):
// getData.php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "myDB"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed"); } $sql = "SELECT FROM users"; $result = $conn->query($sql); $data = array(); while ($row = $result->fetch_assoc()) { $data[] = $row; } echo json_encode($data); $conn->close();
部署服务器
- 将API文件部署到支持PHP的服务器(如Apache/Nginx)。
- 确保服务器允许跨域请求(CORS),或在安卓端配置反向代理。
安卓端实现步骤
添加网络权限
在 AndroidManifest.xml
中声明权限:
<uses-permission android:name="android.permission.INTERNET" />
依赖库选择
库名 | 特点 | 适用场景 |
---|---|---|
Retrofit | 简洁、支持多种数据格式(JSON/XML) | RESTful API请求 |
OkHttp | 轻量级、可扩展性强 | 基础网络请求 |
Volley | 适合小数据量、支持缓存 | 简单GET/POST请求 |
使用Retrofit获取数据(示例)
Step 1: 添加依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Step 2: 定义API接口
public interface ApiService { @GET("getData.php") // 替换为实际API路径 Call<List<User>> getUsers(); }
Step 3: 创建数据模型
public class User { private int id; private String name; // Getter/Setter方法 }
Step 4: 发起请求
Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://yourserver.com/api/") // 替换为服务器地址 .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Call<List<User>> call = apiService.getUsers(); call.enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful()) { List<User> users = response.body(); // 更新UI,例如RecyclerView适配器 } } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理错误(如网络异常) } });
常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
无法连接到服务器 | URL错误、网络权限未声明、服务器防火墙限制 | 检查URL拼写、确认INTERNET 权限、配置服务器允许外部访问 |
JSON解析失败 | 数据格式不匹配、字段命名不一致 | 使用工具(如Postman)验证API返回数据,确保模型类与JSON字段一致 |
主线程网络操作崩溃 | Android禁止在主线程执行网络请求 | 使用enqueue 异步请求或AsyncTask /Coroutine 处理 |
安全注意事项
避免明文传输敏感数据
- 使用HTTPS加密通信,防止数据被窃取。
- 在服务器端验证API请求来源(如API Key或Token)。
防止SQL注入
- 服务器端API需使用参数化查询,
$stmt = $conn->prepare("SELECT FROM users WHERE id = ?"); $stmt->bind_param("i", $id); // $id为用户输入 $stmt->execute();
- 服务器端API需使用参数化查询,
相关问题与解答
问题1:如何将获取的数据展示在RecyclerView中?
解答:
- 创建
RecyclerView
布局并添加适配器。 - 在
onResponse
中将数据传递给适配器:MyAdapter adapter = new MyAdapter(users); // users为解析后的数据列表 recyclerView.setAdapter(adapter);
问题2:如果服务器要求传递参数(如用户ID)怎么办?
解答:
修改API接口定义,添加动态参数:
@GET("getData.php") Call<List<User>> getUsers(@Query("userId") int userId); // 通过?userId=xxx传递参数
调用时传入参数:
Call<List<User>> call = apiService.getUsers(123); // 传递userId=123