在开发网页或移动应用时,经常需要从服务器获取数据。比如你做的天气小程序,点开就能看到实时温度,背后其实是通过调用某个天气服务的 API 实现的。但并不是发个请求就一定能拿到数据,很多时候会遇到“无权限”“登录失效”等问题,问题可能就出在请求头(Request Headers)上。
什么是请求头?
每次浏览器或程序向服务器发起网络请求时,除了要访问的地址,还会附带一些额外信息,这些信息就是请求头。它就像寄快递时填写的备注:谁寄的、寄给谁、包裹里是什么类型的东西。服务器根据这些信息判断是否响应、返回什么内容。
常见的请求头字段有:
Content-Type:告诉服务器你发送的数据是什么格式,比如 JSON 还是表单。Authorization:用于身份验证,比如带上 token 让服务器知道你是谁。User-Agent:标识客户端类型,比如是手机还是电脑浏览器发的请求。Accept:说明客户端能处理哪些数据类型。
为什么要设置请求头?
不设请求头,很多 API 根本不会理你。比如你调用一个需要登录的接口,却没在请求头里带上 token,服务器直接返回 401 错误,提示未授权。又比如你发的是 JSON 数据,但没设置 Content-Type: application/json,服务器可能当成普通文本处理,导致解析失败。
举个实际场景:你在做一个豆瓣电影列表页,想通过豆瓣开放 API 拿数据。如果不加 User-Agent,豆瓣服务器可能认为你是爬虫,直接拒绝响应。加上一个类似浏览器的 User-Agent,请求就能顺利通过。
如何设置请求头?
不同语言和工具设置方式略有不同,但思路一致:在发起请求时,显式指定 headers 对象。
比如用 JavaScript 的 fetch 发起请求:
fetch('https://api.example.com/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-token-here',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
})
.then(response => response.json())
.then(data => console.log(data));
如果是用 Python 的 requests 库:
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-token-here',
'User-Agent': 'MyApp/1.0'
}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.json())
常见坑点提醒
大小写敏感问题:虽然 HTTP 头部字段名通常不区分大小写,但为了保险,建议按惯例使用驼峰式,比如 Content-Type 而不是 content-type 或 CONTENT-TYPE。
重复设置:有些框架或库会自动添加默认头部,比如 Axios 会在发 JSON 时自动加 Content-Type。如果你手动再加一次,可能导致冲突或错误。
跨域请求:浏览器在跨域时会先发一个 OPTIONS 预检请求,服务器必须正确响应允许的头部字段,否则后续请求会被拦截。这时候需要前后端协作,确保 Access-Control-Allow-Headers 包含你自定义的字段。
调试技巧:浏览器开发者工具的 Network 面板可以清楚看到每个请求的 headers 发出去了哪些。如果接口报错,第一时间点进去看看实际发出的头是不是你期望的。