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

安卓开发 服务器端

安卓客户端与服务器端通信基础

通信方式

方式 说明 适用场景
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

安卓与服务器端协作流程

  1. 请求封装

    • 客户端使用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);
      });
  2. 安全认证

    • 客户端存储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);
      }
  3. 数据同步

    安卓开发 服务器端  第1张

    冲突解决策略:
    | 策略 | 说明 |
    |———————|————————–|
    | 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

  1. 参数化查询:使用预编译语句代替字符串拼接

    -错误示范
    SELECT  FROM users WHERE name = '${input}';
    -正确示范(Java示例)
    PreparedStatement stmt = connection.prepareStatement("SELECT  FROM users WHERE name = ?");
    stmt.setString(1, input);
  2. ORM框架:如Hibernate/MyBatis自动转义特殊字符

  3. 输入校验:服务器端对参数进行正则校验,拒绝非规格式数据

  4. 最小权限原则:数据库用户仅赋予执行必要操作的权限

0