从基础到实践:API请求全流程技术分享
一、先搞懂:API请求的核心基础
1. 什么是API请求?
2. API请求的核心要素
请求URL:服务端接口的唯一地址,用于定位目标接口。例如:
https://api.example.com/user/list。- 请求方法:定义请求的“操作类型”,主流方法有6种,对应不同的业务场景:
GET:查询数据(如获取用户列表、商品详情),参数可拼接在URL后,安全性较低,传输数据量有限。
POST:提交数据(如创建用户、提交表单),参数放在请求体中,安全性较高,可传输大量数据(如JSON、文件)。
PUT:全量更新数据(如修改用户全部信息)。
PATCH:部分更新数据(如只修改用户手机号)。
DELETE:删除数据(如删除用户、删除订单)。
OPTIONS:预检请求,常用于跨域场景,验证客户端是否有权限发起实际请求。
- 请求头(Header):传递请求的“附加信息”,如数据格式、认证信息、浏览器标识等。常见字段:
Content-Type:指定请求体数据格式,如
application/json(JSON格式)、application/x-www-form-urlencoded(表单格式)。Authorization:认证信息,如Token、Bearer令牌(用于接口权限校验)。
User-Agent:客户端标识(如浏览器版本、APP版本)。
请求体(Body):存放需要传递给服务端的“核心数据”,仅POST、PUT、PATCH等方法需要。常见格式:JSON(最主流)、表单、XML、文件流等。
请求参数(Query/Path):补充请求信息,Query参数拼接在URL后(如
/user/list?page=1&size=10),Path参数嵌入URL路径中(如/user/123,123为用户ID)。
3. API响应的核心结构
响应状态码:3位数字,快速标识请求结果。1xx(信息)、2xx(成功,如200 OK)、3xx(重定向,如302)、4xx(客户端错误,如400参数错误、401未认证、404接口不存在)、5xx(服务端错误,如500服务器异常)。
响应头:服务端返回的附加信息,如Set-Cookie、Content-Encoding(数据压缩格式)等。
响应体:服务端返回的核心数据,通常为JSON格式(如
{ "code": 200, "msg": "success", "data": [{}] })。
二、动手实践:主流语言的API请求实现
1. 前端:JavaScript(Fetch API/axios)
案例1:Fetch API发起请求
// 1. GET请求:获取用户列表(带Query参数:page=1,size=10)
fetch('https://api.example.com/user/list?page=1&size=10', {
method: 'GET',
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', // 认证Token
'Content-Type': 'application/json'
}
})
.then(response => {
// 先判断响应状态码
if (!response.ok) {
throw new Error(`请求失败:${response.status}`);
}
return response.json(); // 解析JSON格式响应体
})
.then(data => {
console.log('用户列表:', data);
})
.catch(error => {
console.error('请求异常:', error);
});
// 2. POST请求:创建用户(请求体为JSON格式)
fetch('https://api.example.com/user/create', {
method: 'POST',
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
'Content-Type': 'application/json'
},
body: JSON.stringify({ // 序列化JSON数据
username: 'test_user',
phone: '13800138000',
email: 'test@example.com'
})
})
.then(response => response.json())
.then(data => {
console.log('创建用户成功:', data);
})
.catch(error => {
console.error('创建用户失败:', error);
});案例2:axios发起请求(推荐,支持拦截器、取消请求等高级功能)
// 先安装:npm install axios
import axios from 'axios';
// 1. 初始化axios实例(统一配置基础URL、请求头)
const api = axios.create({
baseURL: 'https://api.example.com', // 基础URL,后续请求可省略
headers: {
'Content-Type': 'application/json'
},
timeout: 5000 // 请求超时时间(5秒)
});
// 2. 添加请求拦截器(统一添加认证Token)
api.interceptors.request.use(
config => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
error => Promise.reject(error)
);
// 3. 添加响应拦截器(统一处理响应结果)
api.interceptors.response.use(
response => {
// 只返回响应体中的data字段
return response.data;
},
error => {
// 统一处理错误(如401未认证跳转登录页)
if (error.response?.status === 401) {
window.location.href = '/login';
}
return Promise.reject(error);
}
);
// 4. 发起请求
// GET请求:获取用户列表
async function getUserList() {
try {
const data = await api.get('/user/list', {
params: { page: 1, size: 10 } // Query参数,axios自动拼接
});
console.log('用户列表:', data);
} catch (error) {
console.error('请求失败:', error);
}
}
// POST请求:创建用户
async function createUser() {
try {
const data = await api.post('/user/create', {
username: 'test_user',
phone: '13800138000',
email: 'test@example.com'
});
console.log('创建用户成功:', data);
} catch (error) {
console.error('创建用户失败:', error);
}
}2. 后端:Python(requests库)
# 先安装:pip install requests
import requests
# 基础配置
base_url = "https://api.example.com"
headers = {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"Content-Type": "application/json"
}
# 1. GET请求:获取用户列表
def get_user_list():
try:
# Query参数通过params传递
response = requests.get(
url=f"{base_url}/user/list",
headers=headers,
params={"page": 1, "size": 10},
timeout=5 # 超时时间5秒
)
response.raise_for_status() # 自动抛出4xx/5xx错误
data = response.json() # 解析JSON响应
print("用户列表:", data)
return data
except requests.exceptions.RequestException as e:
print(f"GET请求失败:{e}")
# 2. POST请求:创建用户
def create_user():
try:
# 请求体数据
payload = {
"username": "test_user",
"phone": "13800138000",
"email": "test@example.com"
}
response = requests.post(
url=f"{base_url}/user/list",
headers=headers,
json=payload, # 自动序列化JSON,无需手动json.dumps()
timeout=5
)
response.raise_for_status()
data = response.json()
print("创建用户成功:", data)
return data
except requests.exceptions.RequestException as e:
print(f"POST请求失败:{e}")
# 调用函数
get_user_list()
create_user()3. 后端:Java(HttpClient)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class ApiRequestDemo {
// 基础配置
private static final String BASE_URL = "https://api.example.com";
private static final String TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
// 初始化HttpClient(可复用,避免重复创建)
private static final HttpClient HTTP_CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5)) // 连接超时
.build();
// 1. GET请求:获取用户列表
public static void getUserList() {
try {
// 构建请求URL(拼接Query参数)
String url = BASE_URL + "/user/list?page=1&size=10";
// 构建请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer " + TOKEN)
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(5)) // 请求超时
.GET() // 指定请求方法
.build();
// 发送请求并获取响应
HttpResponse<String> response = HTTP_CLIENT.send(
request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)
);
// 处理响应
int statusCode = response.statusCode();
if (statusCode == 200) {
String responseBody = response.body();
System.out.println("用户列表:" + responseBody);
} else {
System.out.println("GET请求失败,状态码:" + statusCode);
}
} catch (Exception e) {
System.out.println("GET请求异常:" + e.getMessage());
}
}
// 2. POST请求:创建用户
public static void createUser() {
try {
// 请求体JSON数据
String payload = "{\n" +
" \"username\": \"test_user\",\n" +
" \"phone\": \"13800138000\",\n" +
" \"email\": \"test@example.com\"\n" +
"}";
// 构建请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/user/create"))
.header("Authorization", "Bearer " + TOKEN)
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(5))
.POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8)) // 指定请求体
.build();
// 发送请求并获取响应
HttpResponse<String> response = HTTP_CLIENT.send(
request,
HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)
);
// 处理响应
int statusCode = response.statusCode();
if (statusCode == 200) {
String responseBody = response.body();
System.out.println("创建用户成功:" + responseBody);
} else {
System.out.println("POST请求失败,状态码:" + statusCode);
}
} catch (Exception e) {
System.out.println("POST请求异常:" + e.getMessage());
}
}
public static void main(String[] args) {
getUserList();
createUser();
}
}三、避坑指南:API请求常见问题与解决方案
1. 前端跨域问题(最常见)
服务端配置CORS:在响应头中添加
Access-Control-Allow-Origin(允许的前端域名)、Access-Control-Allow-Methods(允许的请求方法)等字段,这是最根本的解决方式。前端使用代理:开发环境下,通过webpack-dev-server、Vite等工具配置代理,将API请求转发到服务端(如Vite配置
server.proxy),规避同源限制。使用JSONP:仅支持GET请求,通过动态创建script标签发起请求,适合老项目兼容。
2. 请求超时问题
设置合理的超时时间:根据业务场景配置(如普通查询3-5秒,文件上传10-30秒),避免无限等待。
优化服务端性能:简化处理逻辑、添加缓存、异步处理耗时操作(如用消息队列处理大数据量任务)。
优化请求参数:压缩数据(如启用gzip)、减少冗余参数、拆分大请求为多个小请求。
实现重试机制:对临时超时(如网络抖动),采用“指数退避重试”(重试间隔逐渐延长),避免频繁重试加重服务端压力。
3. 认证失败问题
统一管理认证信息:前端用拦截器自动添加Token,后端用拦截器统一校验Token。
处理Token过期:前端在响应拦截器中捕获401错误,跳转登录页重新获取Token;或实现Token刷新机制(用刷新令牌获取新的访问令牌)。
明确权限控制:服务端通过角色、接口权限列表校验,返回清晰的权限错误信息。
4. 数据格式不匹配问题
严格匹配Content-Type与数据格式:JSON格式对应
application/json,表单对应application/x-www-form-urlencoded。前端请求前校验参数:用表单校验库(如VeeValidate、Element UI表单校验)检查参数类型、必填项。
服务端返回清晰的错误信息:明确指出“哪个参数错误”“错误原因”(如“phone参数格式错误,需为11位数字”)。

