上一篇
安卓开发 服务器端
- 行业动态
- 2025-04-21
- 2
安卓客户端与服务器端通信基础
通信方式
方式 | 说明 | 适用场景 |
---|---|---|
HTTP/REST | 基于HTTP协议,使用GET/POST/PUT/DELETE等方法操作资源 | 大多数标准API交互 |
WebSocket | 全双工通信,支持实时数据推送 | 聊天、实时通知 |
gRPC | 基于HTTP/2的高性能RPC框架,支持多语言 | 复杂业务逻辑、微服务 |
网络请求库
库名称 | 特点 | 适用场景 |
---|---|---|
Retrofit | 类型安全、支持RxJava/Coroutines、动态代理 | Android主流选择 |
OkHttp | 高效HTTP客户端,支持缓存、拦截器 | 底层网络请求封装 |
Volley | 轻量级,适合简单网络请求,内置ImageLoader | 快速开发简单功能 |
数据序列化格式
格式 | 优点 | 缺点 |
---|---|---|
JSON | 轻量级、人类可读、广泛支持 | 冗余数据多、解析性能低 |
Protobuf | 体积小、解析快、支持自动生成代码 | 可读性差 |
MessagePack | 二进制格式、跨语言支持 | 生态不如JSON成熟 |
服务器端技术选型
语言与框架
技术栈 | 适用场景 | 代表框架 |
---|---|---|
Java + Spring Boot | 企业级应用、高并发 | Spring Cloud |
Node.js + Express | I/O密集型、快速开发 | Koa/Express |
Python + Django/Flask | 数据处理、AI集成 | Django REST Framework |
Go + Gin | 高并发、微服务 | Gin/Echo |
数据库选择
类型 | 典型场景 | 代表产品 |
---|---|---|
关系型数据库 | 事务性强、复杂查询 | MySQL/PostgreSQL |
NoSQL数据库 | 高并发写入、灵活schema | MongoDB/Redis |
图数据库 | 社交网络、推荐系统 | Neo4j/ArangoDB |
安卓与服务器端协作流程
请求封装
- 客户端使用Retrofit定义接口:
interface ApiService { @GET("users/{id}") suspend fun getUser(@Path("id") userId: Int): Response<User> }
- 服务器端对应路由处理(以Node.js为例):
app.get('/users/:id', async (req, res) => { const user = await User.findById(req.params.id); res.json(user); });
- 客户端使用Retrofit定义接口:
安全认证
- 客户端存储Token:
SharedPreferences.edit().putString("token", token).apply()
- 服务器端验证(Java示例):
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String token = httpRequest.getHeader("Authorization"); if (token == null || !jwtUtils.validate(token)) { throw new UnauthorizedException(); } chain.doFilter(request, response); }
- 客户端存储Token:
数据同步
冲突解决策略:
| 策略 | 说明 |
|———————|————————–|
| Last Write Wins | 后写入数据覆盖前数据 |
| Merged Resolution | 合并字段差异 |
| Server Authority | 以服务器数据为准 |
常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
网络请求超时 | 服务器响应慢、网络不稳定 | 设置超时重试机制,使用OkHttp的readTimeout 配置,客户端实现指数退避算法 |
Token过期 | 长期未操作导致认证失效 | 使用Refresh Token机制,客户端缓存新旧Token,服务器端刷新Token有效期 |
数据不一致 | 离线修改与服务器冲突 | 采用乐观锁(版本号控制),或使用冲突解决库(如Realm Sync) |
相关问题与解答
Q1:如何在Retrofit中处理服务器返回的非200状态码?
A1:
可以通过自定义Callback
或使用CallAdapter
工厂处理异常。
val apiService = Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) apiService.getUser(123) .enqueue(object : Callback<Response<User>> { override fun onResponse(call: Call<Response<User>>, response: Response<Response<User>>) { if (response.isSuccessful) { // 正常处理 } else { // 根据response.code处理错误(如401跳转登录页) } } override fun onFailure(call: Call<Response<User>>, t: Throwable) { // 网络错误处理 } })
Q2:服务器如何防止SQL注入攻击?
A2:
参数化查询:使用预编译语句代替字符串拼接
-错误示范 SELECT FROM users WHERE name = '${input}'; -正确示范(Java示例) PreparedStatement stmt = connection.prepareStatement("SELECT FROM users WHERE name = ?"); stmt.setString(1, input);
ORM框架:如Hibernate/MyBatis自动转义特殊字符
输入校验:服务器端对参数进行正则校验,拒绝非规格式数据
最小权限原则:数据库用户仅赋予执行必要操作的权限