Node.js(4)—— http模块基础
下面我们来学nodejs中的http模块。在此之前,你需要有一定的网络知识储备,能知道http,IP,端口是什么并且它们之间的关系。如果还不清楚或比较模糊,可以查看下面的文章:
HTTP协议与IP
下面我们开始学习。
目录
创建一个HTTP服务端
向本机端口发送请求
HTTP服务的注意事项
1、如何关闭服务器?
2、如何实现代码的修改更新?
3、响应内容中文乱码
4、端口号被占用
5、HTTP协议默认端口
在浏览器中查看报文
创建一个HTTP服务端
有了HTTP服务端后,我们就能处理浏览器发送过来的请求,并且可以返回响应。和前端开发不同,我们无法在浏览器中看到我们编写的结果,因此我们需要逐渐习惯后端开发时的编写习惯。
1、导入http模块
const http = require('http');
这部分和之前的导入模块相同。
2、创建服务对象
创建服务对象我们使用 createServer 方法来创建,其返回结果为一个对象。代码为:
const server = http.createServer();
该方法有一个实参,它是一个函数;该函数又接受两个形参,为 request 和 response。request是浏览器发送的请求报文的封装对象,可以获取到请求报文的相关内容。
而response则是对响应报文的封装对象,可以为浏览器设置响应结果。
这里我们说明一下,request和rresponse只是参数名称,我们可以自己为参数命名。
下面我们简单书写一下函数:
const server = http.createServer((request,response) => {response.end('Hello HTTP Server');//设置响应体并结束响应
});
后面我们还会详细讲解如何去编写,这里我们就留个印象,要知道这么写的目的是什么。
3、监听端口,启动服务
直接看代码:
server.listen();
listen是对象里面的一个方法,需要往里面传入两个参数:一个数值和回调函数。具体如下:
server.listen(9000,() => {console.log('服务器已成功启动...');
});
数值表示端口号,上面代码表示端口号为9000。当然其他端口也可行,这里我们选取9000。直接运行上述代码查看结果:
这样我们就成功运行了。当服务器启动成功以后才会执行回调函数内的代码。(response)
现在,端口9000就已经被我们的服务器占用了。将来只要有程序往9000端口发送http请求,回调函数就就会被执行。我们知道,浏览器会向服务器发送http请求;下面我们使用本机的IP试着发送请求。
向本机端口发送请求
向本机端口发送请求,我们首先要知道本机的IP地址。而本机回环地址就是我们当前计算机,即本机的地址。IP为:127.0.0.1。下面我们打开浏览器,输入IP发送我们的http请求。
http://127.0.0.1:9000/
在网址栏输入上述代码,跳转后我们就能看到执行了回调函数之后的页面。
HTTP服务的注意事项
1、如何关闭服务器?
启动服务之后,我们使用 Crtl + C 就能停止运行。
2、如何实现代码的修改更新?
如果我们想对代码进行修改后服务器也会做出对应修改该怎么办呢?比如我们把之前的 'Hello HTTP Server' 修改为'Hello World!':
const http = require('http');
const server = http.createServer((request,response) => {response.end('Hello World!');//设置响应体并结束响应
});
server.listen(9000,() => {console.log('服务器已成功启动...');
});
直接修改后发现页面没有变化。这时我们需要关闭当前服务器并再次启动才会实现更新。即重启服务。
3、响应内容中文乱码
我们再次修改文本内容,这次我们使用中文 “你好” 来替换文本。
response.end('你好');
重启服务器,发现出现了奇怪的结果:
感兴趣可以多尝试一些中文文本,会看到都会出现乱码。这里是因为字符集的问题。我们在前面多加入一行代码:
response.setHeader('content-type','text/html;charset=utf-8');
这段代码是什么意思呢?它表示在发送请求报文时,多加入一个键名为 conten.type 的响应头;返回的内为HTML,并且字符的格式为 utf-8 。这样浏览器就会按照utf-8字符集的规范来解析字符了。下面我们重启一下服务,发现回归正常:
4、端口号被占用
我们在vscode中保持服务器不断开,新打开一个终端,启动文件会发现出现报错:
这时就是端口已经被占用的情况。我们在另一个终端已经使用了9000端口,不能再被其他的使用。解决这个问题有两个方法,一是停止正在启动的端口;二是修改端口号。
5、HTTP协议默认端口
HTTP协议的默认端口为80。如果我们不设置端口号,请求就会默认向80端口发送请求。再补充一下 https协议的默认端口为443。
在浏览器中查看报文
我们在之前运行的页面上打开控制台应用,选择网络:
之后我们启动服务器就能看到出现了两个请求:
我们先看下面那个 favicon.ico ,这个其实是谷歌浏览器的默认行为,在打开网页时它都会发送这样一个请求。
我们再来看向本机发送的请求,有三个大的分类项;我们打开请求标头,就能看到报文的内容了。但打开后发现没有请求行,我们点击原始(源代码),就能看到初始的代码,也就能看见请求行了。
那么请求体怎么看呢?我们需要另外建立一个文件:
如图所示我们快速建立一个html文件,如下书写一个表单:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="http://127.0.0.1:9000" method="post"><input type="text" name="username"><input type="password" name="password"><input type="submit" value="提交"></form>
</body>
</html>
之后打开网页,输入对应的信息后提交后就会像对应端口发送一个Post请求。
提交后我们能在控制台看到多出来一个“负载”标签页,里面存放我们刚刚输入的信息:
这就是格式化之后的请求体内容。如果想要查看原始的内容,点击查看源即可:
username=123&password=123456