Node.js中的http模块封装了一个http服务器模块和一个简易的http客户端。
http.Server是一个基于事件的http服务器。
http.request是http客户端工具,用于向http服务器发起请求。
了解HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
- HTTP请求响应流程
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本并显示内容;
- HTTP的请求报文和响应报文
报文:是HTTP请求和响应过程中传递的数据,分为请求报文(请求头)和响应报文(响应头),它遵守规定好的格式。
查看步骤,以“http://nodejs.cn/api/globals.html”为例,在Chrome浏览器中访问,访问成功后,按【F12】键,进入开发者工具,进入后选择Network窗口,重新刷新网页,单击第一行“globals.html”,可以看到格式化后的响应报文和请求报文。
HTTP的请求报文
请求头部:
Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
Connection:连接方式(close 或 keepalive);
User-Agent:产生请求的浏览器类型;
Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
Accept-Language:客户端可接受的自然语言;
Accept-Encoding:客户端可接受的编码压缩格式;
Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
请求数据:
请求数据不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length;
HTTP的响应报文
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
- 1xx:消息,请求已被服务器接收,继续处理;
- 2xx:成功,请求已成功被服务器接收、理解、并接受;
- 3xx:重定向,需要后续操作才能完成这一请求;
- 4xx:请求错误,请求含有词法错误或者无法被执行;
- 5xx:服务器错误,服务器在处理某个正确请求时发生错误。
常用状态码 | 说明 |
---|---|
200 | 表示服务器成功处理了客户端的请求。 |
302 | 暂时性重定向 |
404 | 请求失败,客户端请求的资源没有找到或者是不存在。 |
500 | 服务器遇到未知的错误,导致无法完成客户端当前的请求。 |
搭建HTTP服务器
- 在code\chapter4\demo3文件夹下创建server.js。
- 在server.js文件中添加如下代码:
/**
* 使用HTTP构建web服务器
*/
//1.加载http模块
const http = require('http');
//2.创建HTTP服务器
const server = http.createServer();
//3.监听request事件,客户端有请求进来的时候触发
/*
1. req->request请求对象,是http.IncomingMessage的实例
2. res->response响应对象,是http.ServerResponse的实例
*/
server.on('request',(req,res)=>{
console.log('有请求进来....');
//request.url获取路由请求地址
console.log(`请求路径:${req.url}`);
/*浏览器显示中文可能是乱码,需设置响应头告诉浏览器显示时所使用的编码,要在res.end()之前设置响应头、状态码、响应内容类型及编码*/
//设置响应头信息
res.writeHead(200,{'Content-Type':'text/html;Charset=utf-8'});
//向请求的客户端发送响应内容
res.write('hello');
res.write('你好','utf-8');
//结束响应,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。
res.end();
});
//3.绑定端口号,启动web服务器
server.listen(3000,()=>{
console.log('服务器启动成功,请访问http://localhost:3000');
});
- 执行
打开浏览器,访问http:localhost:3000
- 常用API解析
http.Server类
常用函数 | 说明 |
---|---|
server.listen(port[,hostname][,backlog][,callback]) | 启动 HTTP 服务器用于监听连接 port:指定监听的端口号,范围是0~65536,一般网站应用的默认端口号为80。 hostname:指定主机名 backlog:指定被允许进行排队的最大待处理连接数,默认是511。 callback:指定该服务器已经开始在指定的端口上监听,要执行的回调处理函数。 |
server.close([callback]) | 停止服务器接受新连接。 |
常用事件 | 说明 |
---|---|
close事件 | 当服务器关闭时触发 |
connection事件 | 建立新的TCP流失会触发此事件 |
request事件 | 当客户端请求到来时触发此事件,提供两个参数 request 和response,分别http.ServerRequest 和 http.ServerResponse 的实例,表示请求和响应信息。 |
http.ServerResponse 类
常用函数 | 说明 |
---|---|
response.writeHead(statusCode[, statusMessage][, headers]): | 表示向请求发送响应头。 statusCode:数字类型,表示HTTP状态码,如200(请求成功)、404(未找到)等 statusMessage:字符串类型,表示状态信息,可选 headers:对象类型,表示响应头的每个属性,可选。如设置 Content-Type 的值,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。常用值有: text/html:HTML 格式 text/plain:纯文本格式 application/x-www-form-urlencoded:数据被编码为名称/值对,这是标准的编码格式。 |
response.write(chunk[, encoding][, callback]) | 向请求的客户端发送响应内容。 chunk是一个 Buffer 或字符串,表示要发送的内容。如果 chunk是字符串,那么需要指定encoding 来说明它的编码方式,默认是 utf-8。在 response.end 调用之前,response.write 可以被多次调用。 |
response.end([data[, encoding]][, callback]) | 向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。如果指定了 data,则相当于调用 response.write(data, encoding) 之后再调用 response.end(callback)。 |
http.IncomingMessage 类
IncomingMessage 对象由 http.Server 或 http.ClientRequest 创建,并分别作为第一个参数传给 ‘request’ 和 ‘response’ 事件。 它可用于访问响应状态、消息头、以及数据。
常用属性 | 说明 |
---|---|
message.headers | 请求或响应的消息头对象。 |
message.httpVersion | 在服务器请求的情况下,表示客户端发送的 HTTP 版本。 在客户端响应的情况下,表示连接到的服务器的 HTTP 版本。 可能是 ‘1.1’ 或 ‘1.0’。 |
message.method | 返回一个字符串,表示请求的方法。 该属性只读(仅在 http.Server 返回的请求中有效). |
message.socket | 指向一个net.Socket 对象 |
message.statusCode | 返回一个三位数的 HTTP 响应状态码 (仅在 http.ClientRequest 返回的响应中有效。) |
message.url | 返回请求的 URL 字符串(仅在 http.Server 返回的请求中有效) |
简写形式:
/**
* 使用HTTP构建web服务器
*/
//加载http模块
const http = require('http');
//定义端口号
const port=3000;
const ip = '127.0.0.1';
//构建web服务器
http.createServer((req,res)=>{
console.log('请求来了...');
//设置响应头信息
res.writeHead(200,{'Content-Type':'text/html;Charset=utf-8'});
//向请求的客户端发送响应内容
res.write('hello');
res.write('你好','utf-8');
//结束响应,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。
res.end();
}).listen(port,ip,()=>{
console.log(`服务器启动成功,请访问http://${ip}:${port}`);
});
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位指点,在此表示感激不尽。文中部分图片是借鉴网上的,如有版权问题,请私信联系,本人会及时删除。文章持续更新中…