HTTP模块
1.创建服务器
1.导入http模块 => node 内置的模块 网络模块
- 创建一个http服务器对象
request 请求对象 包含请求的信息(请求参数、请求头、请求方法等)
response 响应对象 包含响应的信息(响应头、响应内容等) - 监听端口
// 导入http模块 => node 内置的模块 网络模块
const http = require('http');
// 创建一个http服务器对象
// request 请求对象 包含请求的信息(请求参数、请求头、请求方法等)
// response 响应对象 包含响应的信息(响应头、响应内容等)
const app = http.createServer((request, response) => {
console.log('hello http');
response.end('hello http');
});
// 监听端口
app.listen(3000, () => {
console.log('server is running at port 3000');
});
2.监听主机和端口号
listen函数有三个参数:
1.端口port: 可以不传, 系统会默认分配端口(通过server.address().port), 后续项目中我们会写入到环境变量中
2.主机host: 通常可以传入localhost、ip地址127.0.0.1、或者ip地址0.0.0.0,默认是0.0.0.0;
localhost:本质上是一个域名,通常情况下会被解析成127.0.0.1;
127.0.0.1:回环地址(Loop Back Address),表达的意思其实是我们主机自己发出去的包,直接被自己接收; ✓ 正常的数据库 包经常 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层 ; ✓ 而回环地址,是在网络层直接就被获取到了,是不会经常数据链路层和物理层的; ✓ 比如我们监听 127.0.0.1时,在同一个网段下的主机中,通过ip地址是不能访问的;
0.0.0.0: ✓ 监听IPV4上所有的地址,再根据端口找到不同的应用程序; ✓ 比如我们监听 0.0.0.0时,在同一个网段下的主机中,通过ip地址是可以访问的;
3.回调函数:服务器启动成功时的回调函数;
const http = require('http');
const app = http.createServer((request, response) => {
response.end('hello');
});
// 参数一:监听的端口号(可以省略,随机生成0-65535,app.address().port获取)
// app.listen(() => {
// console.log(app.address().port);
// console.log('服务器开启成功');
// });
// 参数二:主机地址(可以省略,默认为0.0.0.0)
// localhost = 127.0.0.1
// 0.0.0.0 监听本机IPV4地址 localhost 127.0.0.1 ip 都可以访问到
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
// 参数三:回调函数
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
3.request对象
1.request对象
const http = require('http');
// API 测试工具 传统 PostMan apipost postfox
const app = http.createServer((request, response) => {
// 请求路径
console.log(request.url);
// 请求方式
console.log(request.method);
// 请求头
console.log(request.headers);
response.end('hello');
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
2.url处理
const http = require('http');
const app = http.createServer((request, response) => {
if ('/user' === request.url) {
response.end('用户');
}
if ('/goods' === request.url) {
response.end('商品');
}
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
3.解析url(1)
const http = require('http');
const app = http.createServer((request, response) => {
// /user?name=%E6%B1%AA%E8%89%B3&age=75
const { url, query } = parse(request.url);
console.log(url, query);
response.end('用户');
});
// 解析参数
const parse = str => {
// ['/user', 'name=%E6%B1%AA%E8%89%B3&age=75']
const [url, query] = str.split('?');
// [[key1,value1],[key2,value2]]
const obj = query.split('&').map(item => item.split('='));
// Object.fromEntries(obj) [[key1,value1],[key2,value2]] => {key1:value1,key2:value2}
return { url, query: Object.fromEntries(obj) };
};
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
4.解析url(2)
const http = require('http');
// node 内置的模块 解析url
const url = require('url');
// node 解析字符串
const qs = require('querystring');
const app = http.createServer((request, response) => {
// /user?name=%E6%B1%AA%E8%89%B3&age=75
//解析url pathname => /user query => name=%E6%B1%AA%E8%89%B3&age=75
const { pathname, query } = url.parse(request.url);
// 解析字符串获取请求参数 name=%E6%B1%AA%E8%89%B3&age=75 => {name: '汪英', age: '75'}
const obj = qs.parse(query);
console.log(pathname, obj);
response.end('用户');
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
5.method的处理
const http = require('http');
const app = http.createServer((request, response) => {
// restful风格 根据请求方式做对应的处理
if ('GET' === request.method) {
response.end('查询');
}
// 参数都是放在请求体中
if ('POST' === request.method) {
response.end('新增');
}
if ('PUT' === request.method) {
response.end('修改');
}
if ('DELETE' === request.method) {
response.end('删除');
}
if ('PATCH' === request.method) {
response.end('修改');
}
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
6.解析body中的js
const http = require('http');
const app = http.createServer(async (request, response) => {
const body = await parse(request);
console.log(body);
response.end('用户');
});
const parse = request => {
return new Promise((resolve, reject) => {
try {
let data = '';
// 监听data事件
request.on('data', chunks => (data += chunks));
// 监听end事件
request.on('end', () => resolve(JSON.parse(data)));
} catch (error) {
reject(error);
}
});
};
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
7.header属性
const http = require('http');
const app = http.createServer((request, response) => {
// 请求参数的类型 application/json
// multipart/form-data; boundary=--------------------------870031869786263394975278
// application/x-www-form-urlencoded
console.log(request.headers['content-type']);
console.log(request.headers['content-length']);
console.log(request.headers['user-agent']);
response.end('用户');
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
4.response对象
1.返回响应结果
const http = require('http');
const app = http.createServer((request, response) => {
const obj = {
name: 'admin',
age: 18,
};
response.end(JSON.stringify(obj));
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});
2.响应状态码
const http = require('http');
const app = http.createServer((request, response) => {
const obj = {
name: 'admin',
age: 18,
};
response.statusCode = 500;
response.end(JSON.stringify(obj));
});
app.listen(3000, '0.0.0.0', () => {
console.log('服务器开启成功');
});