Node.js中的常用核心模块——HTTP模块(一)

Node.js中的http模块封装了一个http服务器模块和一个简易的http客户端。
http.Server是一个基于事件的http服务器。
http.request是http客户端工具,用于向http服务器发起请求。

了解HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

  1. HTTP请求响应流程
    例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
    1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
    2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
    3. 浏览器发出HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
    4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
    5. 释放 TCP连接;
    6. 浏览器将该 html 文本并显示内容;  
      在这里插入图片描述
      在这里插入图片描述
  2. 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服务器

  1. 在code\chapter4\demo3文件夹下创建server.js。
  2. 在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');
});
  1. 执行
    在这里插入图片描述
    打开浏览器,访问http:localhost:3000
    在这里插入图片描述
  2. 常用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}`);
});

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位指点,在此表示感激不尽。文中部分图片是借鉴网上的,如有版权问题,请私信联系,本人会及时删除。文章持续更新中…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐小侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值