- 客户端: 你的 Android App,它负责向服务器发送请求(如登录、获取数据)和接收服务器的响应。
- 服务器端: 一个运行在远程服务器上的应用程序,负责处理来自 App 的请求,执行业务逻辑(如验证用户、查询数据库),并返回数据给 App。
下面我将为你详细分解这两个部分,并提供主流的技术栈和代码示例。

第一部分:Android 客户端 (如何与服务器通信)
Android 客户端需要使用网络库来与服务器进行 HTTP/HTTPS 通信,目前主流的方式是 异步请求,以避免阻塞主线程(UI线程)导致应用卡顿甚至崩溃。
核心网络库选择
a. HttpURLConnection (原生,已过时但不失为学习基础)
这是 Java 原生的 API,无需引入额外依赖,但在 Android 开发中,它使用起来比较繁琐,且默认不支持异步,需要手动处理线程。
b. OkHttp (强烈推荐)
是目前 Android 和 Java 世界中最流行、最高效的网络库,它由 Square 公司(著名的开源公司)开发,特点是:
- 高效: 支持异步请求、连接池。
- 简洁: API 设计非常友好。
- 强大: 支持拦截器、WebSocket、文件上传下载等。
- 默认: 在 Android 9 (API 28) 及以上,
OkHttp是推荐的 HTTP 客户端。
c. Retrofit (基于 OkHttp 的封装,更高级)
Retrofit 不是一个网络库,它是一个 类型安全的 HTTP 客户端,它将网络请求接口化,让你可以用 Java/Kotlin 的接口来定义 API,然后自动实现这些接口,它内部默认使用 OkHttp 来执行实际的 HTTP 请求。

推荐组合:Retrofit + OkHttp + Gson
Retrofit: 负责将接口定义转换为网络请求。OkHttp: 负责执行网络请求。Gson: 负责 JSON 数据与 Java/Kotlin 对象之间的序列化和反序列化。
使用 Retrofit + OkHttp + Gson 的完整示例
步骤 1: 添加依赖
在你的 app/build.gradle 文件中添加:
// OkHttp implementation 'com.squareup.okhttp3:okhttp:4.12.0' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit Gson 转换器 implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // OkHttp 日志拦截器 (方便调试) implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
步骤 2: 添加网络权限
在 app/src/main/AndroidManifest.xml 中:
<uses-permission android:name="android.permission.INTERNET" />
<!-- 如果是 Android 9+,还需要配置 cleartextTrafficPermitted -->
<application
...
android:usesCleartextTraffic="true"
...>
</application>
步骤 3: 创建数据模型
假设服务器返回的 JSON 是 {"code":200,"message":"success","data":{"name":"John","age":30}}。

// data/User.kt data class User(val name: String, val age: Int) // data/ApiResponse.kt data class ApiResponse<T>(val code: Int, val message: String, val data: T)
步骤 4: 定义 API 接口 创建一个接口,用注解来描述请求。
// api/ApiService.kt
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
interface ApiService {
// 定义一个 GET 请求,获取用户信息
// @GET("users/{id}") 表示请求路径是 "基础URL/users/1"
// @Path("id") 表示将方法参数 id 的值填入路径中
@GET("users/{id}")
fun getUser(@Path("id") userId: String): Call<ApiResponse<User>>
}
步骤 5: 创建 Retrofit 实例
// utils/ApiUtils.kt
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object ApiUtils {
// 替换成你的服务器基础地址
private const val BASE_URL = "https://your-api-domain.com/api/"
fun getApiService(): ApiService {
// 1. 创建 OkHttp 客户端
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY // 打印请求和响应体
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build()
// 2. 创建 Retrofit 实例
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()) // 添加 Gson 转换器
.build()
// 3. 创建 API 接口的实现
return retrofit.create(ApiService::class.java)
}
}
步骤 6: 在 Activity/ViewModel 中发起请求
重要: 网络请求必须在后台线程执行,可以使用 CoroutineScope (Kotlin协程) 或 Executor。
// MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class MainActivity : AppCompatActivity() {
private lateinit var tvResult: TextView
private lateinit var btnFetchUser: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tvResult = findViewById(R.id.tv_result)
btnFetchUser = findViewById(R.id.btn_fetch_user)
btnFetchUser.setOnClickListener {
// 使用 Kotlin 协程发起网络请求 (推荐方式)
fetchUserWithCoroutine("1")
// 或者使用传统的 Callback 方式
// fetchUserWithCallback("1")
}
}
// 使用协程的方式 (更现代、简洁)
private fun fetchUserWithCoroutine(userId: String) {
// launch { ... } 会启动一个新的协程
// Dispatchers.IO 是专门用于网络、数据库等 IO 操作的调度器
CoroutineScope(Dispatchers.IO).launch {
try {
val apiService = ApiUtils.getApiService()
// 调用同步方法,它会挂起当前协程,直到结果返回
val response = apiService.getUser(userId).execute()
if (response.isSuccessful) {
val apiResponse = response.body()
// 切换回主线程更新 UI
withContext(Dispatchers.Main) {
if (apiResponse != null && apiResponse.code == 200) {
tvResult.text = "用户: ${apiResponse.data.name}, 年龄: ${apiResponse.data.age}"
} else {
tvResult.text = "服务器返回错误: ${apiResponse?.message}"
}
}
} else {
withContext(Dispatchers.Main) {
tvResult.text = "请求失败: ${response.code()}"
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
tvResult.text = "网络异常: ${e.message}"
Toast.makeText(this@MainActivity, "网络异常", Toast.LENGTH_SHORT).show()
}
}
}
}
// 使用 Callback 的传统方式
private fun fetchUserWithCallback(userId: String) {
val apiService = ApiUtils.getApiService()
apiService.getUser(userId).enqueue(object : Callback<ApiResponse<User>> {
override fun onResponse(call: Call<ApiResponse<User>>, response: Response<ApiResponse<User>>) {
if (response.isSuccessful) {
val apiResponse = response.body()
if (apiResponse != null && apiResponse.code == 200) {
tvResult.text = "用户: ${apiResponse.data.name}, 年龄: ${apiResponse.data.age}"
} else {
tvResult.text = "服务器返回错误: ${apiResponse?.message}"
}
} else {
tvResult.text = "请求失败: ${response.code()}"
}
}
override fun onFailure(call: Call<ApiResponse<User>>, t: Throwable) {
tvResult.text = "网络异常: ${t.message}"
Toast.makeText(this@MainActivity, "网络异常", Toast.LENGTH_SHORT).show()
}
})
}
}
第二部分:服务器端 (如何搭建服务器)
服务器端技术栈的选择非常广泛,主要取决于你的项目规模、团队熟悉度和性能要求。
主流技术栈
a. Java EE (Jakarta EE) / Spring Boot
- 技术: Java, Spring Boot, Spring MVC, JPA/Hibernate, MySQL/PostgreSQL
- 优点: 生态极其成熟,社区庞大,招聘容易,适合大型、复杂的企业级应用,Spring Boot 简化了配置,开发效率高。
- 缺点: 相对于 Node.js,启动速度较慢,内存占用稍高。
- 场景: 金融系统、电商后台、企业级应用。
b. Node.js (Express / Koa)
- 技术: JavaScript/TypeScript, Node.js, Express/Koa 框架, MongoDB/PostgreSQL
- 优点: 使用 JavaScript,前后端语言统一,异步非阻塞 I/O 模型,特别适合 I/O 密集型应用(如高并发 API),开发速度快。
- 缺点: 单线程模型,CPU 密集型任务表现不佳;回调地狱问题(可通过 async/await 解决)。
- 场景: RESTful API 服务、实时应用(聊天室)、微服务。
c. Python (Django / Flask)
- 技术: Python, Django/Flask, SQLAlchemy, PostgreSQL/MySQL
- 优点: 语法简洁,开发效率高,拥有丰富的第三方库(尤其是数据科学和 AI 领域)。
- Django: 功能全面,自带 ORM、Admin 后台,适合快速开发复杂网站。
- Flask: 轻量级,灵活,适合小型项目或作为微服务。
- 缺点: 全局解释器锁限制了其多线程性能;对于 CPU 密集型任务不是最佳选择。
- 场景: Web 应用、API 服务、数据分析平台。
d. Go (Gin / Echo)
- 技术: Go, Gin/Echo 框架
- 优点: 编译成单一二进制文件,部署简单;天生高并发(goroutine),性能极高,内存占用低。
- 缺点: 相对较新,社区和库生态不如 Java/Python;错误处理机制(多返回值)需要适应。
- 场景: 微服务、高性能 API、中间件、云原生应用。
使用 Spring Boot 搭建简单服务器示例
步骤 1: 创建 Spring Boot 项目 你可以使用 Spring Initializr 快速创建一个项目,选择以下依赖:
Spring Web: 用于创建 Web 应用和 RESTful API。Spring Data JPA: 用于操作数据库。MySQL Driver: 连接 MySQL 数据库。Lombok: 简化 Java 代码。
步骤 2: 创建数据模型
// src/main/java/com/example/demo/model/User.java
package com.example.demo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;
@Data // Lombok 注解,自动生成 getter, setter, toString 等
@Entity // 标识这是一个 JPA 实体
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
}
步骤 3: 创建数据仓库
// src/main/java/com/example/demo/repository/UserRepository.java
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
步骤 4: 创建 Controller 处理请求
// src/main/java/com/example/demo/controller/UserController.java
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api") // 所有请求都以 /api 开头
public class UserController {
@Autowired
private UserRepository userRepository;
// 获取单个用户
@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userRepository.findById(id)
.map(ResponseEntity::ok) // 如果找到,返回 200 OK 和用户对象
.orElse(ResponseEntity.notFound().build()); // 如果没找到,返回 404 Not Found
}
// 创建新用户
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
}
步骤 5: 配置 application.properties
# 服务器端口 server.port=8080 # 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA 配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
你可以运行你的 Spring Boot 应用,它会在 8080 端口启动,你可以使用 Postman 或 curl 来测试你的 API:
# 创建用户
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "age": 25}'
# 获取用户 (假设创建的用户ID是1)
curl http://localhost:8080/api/users/1
总结与建议
| 方面 | 推荐方案 | 理由 |
|---|---|---|
| Android 客户端 | Retrofit + OkHttp + Gson | 行业标准,类型安全,API 友好,功能强大。 |
| 异步处理 | Kotlin 协程 | 现代、简洁、强大的异步编程方式,能更好地管理线程和生命周期。 |
| 服务器端 (小型/快速原型) | Node.js (Express) / Python (Flask) | 开发速度快,语言统一(Node.js),社区活跃。 |
| 服务器端 (大型/企业级) | Java (Spring Boot) | 生态最成熟,稳定可靠,适合构建复杂、健壮的系统。 |
| 服务器端 (高性能/微服务) | Go (Gin) | 性能极高,并发能力强,部署简单,是云原生时代的理想选择。 |
对于初学者,我推荐的完整技术栈是: Android 端: Kotlin + Retrofit + OkHttp + 协程 服务器端: Node.js (Express) 或 Python (Flask)
这个组合学习曲线相对平缓,能让你快速搭建一个功能完整的 App 和后端服务,并专注于业务逻辑的实现,当你对整个流程有了深入理解后,再根据项目需求去探索更复杂的技术栈(如 Spring Boot)。
