HTTP 请求参数规范详解
1. HTTP 请求参数概述
HTTP 请求参数是客户端向服务器传递数据的主要方式,根据请求方法的不同,参数的传递位置和格式也有所差异。
2. GET 请求参数
2.1 参数位置
GET 请求的参数附加在 URL 的查询字符串(Query String)中:
GET /api/users?name=john&age=25&city=beijing HTTP/1.1
Host: example.com
2.2 参数格式规范
- 格式 :
?key1=value1&key2=value2&... - 编码:必须进行 URL 编码(百分比编码)
- 分隔符 :
?开始,&分隔多个参数
2.3 特点与限制
- 可见性:参数在 URL 中可见,不适合敏感数据
- 长度限制:受浏览器和服务器限制(通常 2048-8192 字符)
- 缓存:可被缓存、书签保存
- 幂等性:GET 是幂等操作
2.4 示例代码
javascript
// JavaScript
const params = new URLSearchParams({
name: '张三',
age: 25,
city: '北京'
});
fetch(`/api/users?${params}`)
.then(response => response.json());
// 手动构建
const url = '/api/users?name=' + encodeURIComponent('张三') +
'&age=' + encodeURIComponent('25');
3. POST 请求参数
3.1 参数位置
POST 请求的参数放在请求体(Body)中:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=john&age=25&city=beijing
3.2 常见的 Content-Type 格式
3.2.1 application/x-www-form-urlencoded
- 格式 :
key1=value1&key2=value2 - 编码:URL 编码
- 特点:浏览器表单默认格式
javascript
// JavaScript 示例
const data = new URLSearchParams();
data.append('name', '张三');
data.append('age', '25');
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: data
});
3.2.2 multipart/form-data
-
格式:边界分隔的多部分内容
-
用途:适合文件上传
POST /api/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="name"张三
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="avatar"; filename="photo.jpg"
Content-Type: image/jpeg...文件二进制数据...
------WebKitFormBoundaryABC123--
javascript
// JavaScript 示例
const formData = new FormData();
formData.append('name', '张三');
formData.append('avatar', fileInput.files[0]);
fetch('/api/upload', {
method: 'POST',
body: formData
// 注意:使用 FormData 时不要设置 Content-Type,浏览器会自动设置
});
3.2.3 application/json
- 格式:JSON 格式数据
- 特点:现代 API 常用格式
javascript
// JavaScript 示例
const data = {
name: '张三',
age: 25,
hobbies: ['读书', '运动']
};
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
3.2.4 text/plain 和 application/xml
- text/plain:纯文本格式
- application/xml:XML 格式
4. 其他 HTTP 方法的参数
4.1 PUT 请求
类似于 POST,参数在请求体中:
javascript
// 更新用户信息
fetch('/api/users/123', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '李四',
age: 26
})
});
4.2 DELETE 请求
通常不需要请求体,通过 URL 标识资源:
javascript
// 删除用户
fetch('/api/users/123', {
method: 'DELETE'
});
// 或者带查询参数
fetch('/api/users/123?force=true', {
method: 'DELETE'
});
4.3 PATCH 请求
用于部分更新,参数在请求体中:
javascript
// 部分更新用户
fetch('/api/users/123', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
age: 26 // 只更新年龄字段
})
});
5. 参数编码规范
5.1 URL 编码规则
- 空格编码为
+或%20 - 中文字符编码为
%E4%B8%AD - 特殊字符:
&→%26,=→%3D
5.2 编码示例
javascript
// 正确编码
const encodedName = encodeURIComponent('张三&李四');
// 结果: '%E5%BC%A0%E4%B8%89%26%E6%9D%8E%E5%9B%9B'
// 错误做法(可能导致解析问题)
const badUrl = '/api/users?name=张三&李四'; // 错误!
6. 最佳实践
6.1 参数选择原则
- GET:获取数据、查询、过滤、分页
- POST:创建新资源、敏感数据、大量数据
- PUT:完整更新资源
- PATCH:部分更新资源
- DELETE:删除资源
6.2 安全性考虑
javascript
// 不安全的做法 - 敏感数据用 GET
GET /api/login?username=admin&password=123456
// 安全的做法 - 敏感数据用 POST
POST /api/login
Content-Type: application/json
{
"username": "admin",
"password": "123456"
}
6.3 实际应用示例
javascript
// 完整的 API 调用示例
class UserAPI {
// GET - 获取用户列表(带分页和过滤)
static getUsers(page = 1, limit = 10, filters = {}) {
const params = new URLSearchParams({
page: page.toString(),
limit: limit.toString(),
...filters
});
return fetch(`/api/users?${params}`);
}
// POST - 创建用户
static createUser(userData) {
return fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
});
}
// PUT - 更新用户
static updateUser(userId, userData) {
return fetch(`/api/users/${userId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
});
}
// DELETE - 删除用户
static deleteUser(userId) {
return fetch(`/api/users/${userId}`, {
method: 'DELETE'
});
}
}
7. 总结
理解 HTTP 不同请求方法的参数规范对于开发高质量的 Web 应用至关重要:
- GET:参数在 URL 查询字符串中,适合非敏感数据
- POST/PUT/PATCH:参数在请求体中,支持多种格式
- 选择合适的 Content-Type 和参数格式
- 始终进行正确的参数编码
- 根据操作语义选择正确的 HTTP 方法
这种规范设计确保了 HTTP 协议的清晰性、安全性和可扩展性。