在Node.js的网络编程场景中,HTTP头的操作是非常基础且重要的环节,无论是搭建HTTP服务还是发起HTTP请求,都需要和HTTP头打交道。下面我们先通过一张图片直观了解HTTP头的基本结构,再展开具体的操作方法。

一、HTTP头的基础概念
HTTP头是HTTP请求和响应中携带的元数据,用来描述报文的相关属性。请求头由客户端发送给服务端,包含客户端的请求信息;响应头由服务端返回给客户端,包含服务端的响应配置。常见的HTTP头比如Content-Type用来指定内容类型,Cache-Control用来设置缓存策略,Authorization用来传递认证信息。
二、Node.js服务端操作HTTP头
Node.js内置的http模块创建的服务端,可以通过响应对象res来操作响应头,也可以通过请求对象req获取请求头信息。
1. 设置响应头
设置响应头有两种常用方式,分别是setHeader方法和直接在writeHead中传入头信息。
使用setHeader方法设置单个响应头:
const http = require('http');
const server = http.createServer((req, res) => {
// 设置内容类型为JSON
res.setHeader('Content-Type', 'application/json; charset=utf-8');
// 设置允许跨域
res.setHeader('Access-Control-Allow-Origin', '*');
// 设置缓存时间为1小时
res.setHeader('Cache-Control', 'max-age=3600');
res.end(JSON.stringify({ code: 0, msg: '请求成功' }));
});
server.listen(3000, () => {
console.log('服务运行在3000端口');
});使用writeHead一次性设置状态码和多个响应头:
const http = require('http');
const server = http.createServer((req, res) => {
// 第一个参数是状态码,第二个参数是响应头对象
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8',
'X-Powered-By': 'Node.js'
});
res.end('<h1>Hello Node.js</h1>');
});
server.listen(3000, () => {
console.log('服务运行在3000端口');
});2. 获取响应头
可以通过getHeader方法获取已经设置的响应头,如果头不存在则返回undefined:
const http = require('http');
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json');
// 获取Content-Type头
const contentType = res.getHeader('Content-Type');
console.log('当前Content-Type:', contentType); // 输出 application/json
res.end(JSON.stringify({ test: 1 }));
});
server.listen(3000, () => {
console.log('服务运行在3000端口');
});3. 移除响应头
使用removeHeader方法可以移除已经设置的响应头:
const http = require('http');
const server = http.createServer((req, res) => {
res.setHeader('X-Test', 'test-value');
// 移除X-Test头
res.removeHeader('X-Test');
// 此时获取X-Test头会返回undefined
console.log(res.getHeader('X-Test')); // 输出 undefined
res.end('响应结束');
});
server.listen(3000, () => {
console.log('服务运行在3000端口');
});4. 获取请求头
服务端的请求对象req的headers属性是一个对象,包含了所有客户端发来的请求头:
const http = require('http');
const server = http.createServer((req, res) => {
// 获取所有请求头
const allHeaders = req.headers;
console.log('所有请求头:', allHeaders);
// 获取指定请求头,比如user-agent
const userAgent = req.headers['user-agent'];
console.log('User-Agent:', userAgent);
res.end('请求头获取完成');
});
server.listen(3000, () => {
console.log('服务运行在3000端口');
});三、Node.js客户端操作HTTP头
使用http模块的request方法发起客户端请求时,可以在请求配置中设置请求头,也可以通过响应对象获取服务端返回的响应头。
1. 设置请求头发起请求
const http = require('http');
// 请求配置
const options = {
hostname: 'ipipp.com',
port: 80,
path: '/api/test',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer test_token_123'
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('响应结果:', data);
});
});
req.on('error', (err) => {
console.error('请求错误:', err);
});
// 发送请求体
req.write(JSON.stringify({ name: 'test' }));
req.end();2. 获取响应头
客户端请求的响应对象res的headers属性包含了服务端返回的所有响应头:
const http = require('http');
const options = {
hostname: 'ipipp.com',
port: 80,
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
// 获取所有响应头
console.log('响应头:', res.headers);
// 获取指定响应头,比如content-type
console.log('Content-Type:', res.headers['content-type']);
});
req.end();四、操作HTTP头的注意事项
- 响应头必须在响应体发送之前设置,一旦调用了
res.write或者res.end发送了响应体,再设置响应头会无效。 - 请求头的键名不区分大小写,但是建议使用小写形式,Node.js内部会自动处理大小写转换。
- 如果要设置多个同名的请求头,可以将值设置为数组,比如
'Set-Cookie': ['a=1', 'b=2']。 - 部分HTTP头是只读的,比如
Content-Length如果由Node.js自动计算,手动设置可能会被覆盖。
实际开发中,如果是使用Express、Koa等框架,操作HTTP头的方法会和原生http模块略有不同,但底层原理一致,框架通常会提供更便捷的封装方法。
掌握Node.js中HTTP头的操作方法,能够帮助开发者更好地处理网络请求和响应,解决实际开发中的跨域、缓存、认证等常见问题。
Node.jsHTTP头http模块setHeadergetHeader修改时间:2026-06-02 05:00:36