HTTP 服务
1 使用 Node 创建 HTTP 服务
// 引入http模块
const http = require('http');
// 创建 http 服务程序
// http.createServer 需要一个回调函数作为参数,当有客户端像该服务请求的时候,回调函数会触发
// 回调函数被调用的时候,会接收到两个参数,分别是请求对象和响应对象
const server = http.createServer((request, response) => {
console.log('接收到客户端请求!');
// 设置响应内容并且结束响应
response.end('Welcome to Shanghai');
});
// 开启服务 需要设置端口号和回调函数
// 服务成功开启之后,回调函数会被触发
server.listen(8090, () => {
console.log('http 启动成功! 端口号 8090');
});
- http 是 Node 中处理 HTTP 协议的模块,可以用来创建 HTTP 服务。
- server 是创建的 HTTP 服务的实例。http.Server
- request 是对请求报文的封装对象。http.ClientRequest
- response 是对响应的封装对象。http.ServerResponse
注意事项:
停止服务需要命令行
ctrl + c
停止服务当服务启动后,更新代码必须重启服务才能生效
端口号被占用
Error: listen EADDRINUSE: address already in use :::9000
1)关闭当前正在运行监听端口的服务,第一步:命令行中运行命令
netstat -ano | findstr 端口号
来获取占用端口的程序的进程ID。第二步:资源管理器->详细信息,根据进程ID找到程序,右键选择结束任务。2)使用端口号
HTTP
协议默认端口是80
,HTTPS
协议的默认端口是443
, 使用默认端口,浏览器地址栏中的URL可以省略端口号,HTTP 服务开发常用端口有3000
,8080
,8090
,9000
等
2 获取请求报文
获取请求行的信息
request.httpVersion; // 获取 http 版本
request.url; // 获取请求的 url 地址
request.method; // 获取请求方式(请求方法)
获取请求头信息
request.headers; // 返回对象,包含请求报文中所有的请求头信息
request.headers.请求头名字;
获取客户端 IP 地址
request.socket.remoteAddress
获取 URL 中的查询字符串
const url = requeire('url');
url.parse(request.url, true).query; // 返回一个对象
GET 、POST等所有的请求方式,URL 中都可以有查询字符串。
获取请求体信息
// request 本质上是一个可读流对象
// 定义变量 将请求体中读取的内容拼接到该变量
let reqBody = '';
// 分次从请求体中读取数据
req.on('data', chunk => {
reqBody += chunk;
});
// 请求体内容读取结束
req.on('end', () => {
reqBody; // 查询字符串
querystring.parse(reqBody); // 解析为对象
});
GET 请求方式没有请求体,POST 请求方式有请求体
3 设置响应报文
设置响应行
response.statusCode = 200; // 设置响应状态码
response.statusMessage = 'OK'; // 设置响应状态描述
设置响应头
response.setHeader('响应头名字', '响应头内容')
同时设置响应行和响应头
// 同时设置 响应状态码、设置响应状态描述、响应头
response.writeHead(响应状态码, '响应状态描述', {
'响应头名字' :'响应头内容',
'响应头名字' :'响应头内容',
'响应头名字' :'响应头内容'
...
})
设置响应体
// resposne 本质上是一个可写流对象 可以通过 write 将内容写入流
response.write('内容');
response.write('内容');
response.write('内容');
response.write('内容');
结束响应
// 只用来结束响应
resposne.end();
// 设置响应体并结束响应
response.end('响应体内容');