1. 了解http协议
网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的信息联系到一起,从而实现这些资源的共享
网络传输数据有一定的规则,这些规则我们称为协议,HTTP就是规则中的一种,而且使用最为频繁是一种协议
1.1. 什么是http协议
http是网络协议的一种,超文本传输协议(hypertext transfer protocol)的简写
超文本传输协议传输的内容就是超文本的标记语言(文字,图片,视频,音频...)
它是TCP/IP协议之上的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程以及数据本身的格式
HTTP协议是一种网络传输协议,采用的是请求/应答 方式传递数据,一次请求对应一次应答(响应)
HTTP协议到底约束了什么?
- 约束了浏览器以何种格式向服务器端发送数据
- 约束了服务器应该以何种格式来接受客户端发送的数据
- 约束了服务器应该以何种格式来反馈数据给浏览器
- 约束了浏览器应该以何种格式来接受服务器反馈的数据
1.2 HTTP交互的特点
浏览器给服务器发送数据: 一次请求
服务器给浏览器反馈数据: 一次响应
一次请求对应一次响应,多次请求对应多次响应
1.3. HTTP状态码
什么是http状态码?
http协议规定的服务器响应数据时的状态编码,就是状态码
常用的状态码
- 1xx : 表示普通消息,没有特殊含义
- 2xx : 服务器响应成功
- 200 成功 [重点掌握]
- 3xx : 表示重定向
- 301 永久重定向 [重点掌握]
- 302 临时重定向
- 304 使用缓存(服务器没有更新过)
- 4xx : 表示请求失败
- 403 权限不足,无法访问
- 404 资源找不到 [重点掌握]
- 5xx 服务器执行有错
- 500 服务器代码有错
- 502 网关或代理服务器有错
- 503 服务器崩溃了
状态码的使用
res.writeHead(状态码,响应头)
1.4. 响应头
1.4.1 响应的文件类型 Content-Type:
-
text/html;charset=utf-8
(如果为指定文件类型,默认就是html
)字符编码,node默认的字体编码编码是utf-8,浏览器的编码,默认是系统编码,简体中文编码,就是gbk编码,所有会出现乱码
1.4.2 响应的内容的长度 Content-Length:
- 值是数字, 字节的 长度,一般不设置,返回的内容是多少就是多少
1.4.3 解决跨域的响应头设置 Access-Control-Allow-Origin
可以通过这个响应头解决跨域问题,值为*
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8",
"Access-Control-Allow-Origin": "*"
});
res.end("<h1>今天星期几</h2>")
1.5. HTTP 响应不同的数据类型
什么是MIME类型
MIME类型可以理解为是文件类型的表述
服务器具有返回各种数据的能力,但是返回的数据时,应告诉浏览器返回的是一个什么类型的文件
HTTP中使用MIME 类型代表文件的类型
文件 | MIME类型 |
---|---|
html | text/html |
jpg | image/jpg |
png | image/png |
res.writeHead(200, {
"Content-Type": "text/plain;charset=utf-8",
"Access-Control-Allow-Origin": "*"
});
res.end("<h1>今天星期几</h2>")
2. HTTP模块
http
模块时一个在 nodejs
中用于网络通信的模块
2.1. NodeJS服务器
利用Http模块创建服务器
2.1.1 创建服务对象
导入http模块, 并创建服务对象
const http = require("http")
const server = http.createServer()
2.1.2 创建请求处理函数
有两种方法,
第一种方法是在创建服务对象是通过回调函数的方式
http.createServer((req,res) => {
res.end("Hello World")
})
第二种方法,通过绑定request事件处理函数
server.on("request", (req,res) => {
res.end("Hello World")
})
2.1.3 设置服务器监听
通过listen 方法设置服务器监听,
listen方法接受4个参数
server.listen(port [, host] [,backlog] [, callback])
- prot 必需的 监听的端口号
- host 可选的 监听指定的地址(一般省略)
- backlog 可选, 参数是一个指定等待客户端连接的最大数量, 默认511( 一般不使用)
- callback 可选, 用于在服务器监听启动成功后执行的回调函数
server.listen(3000)
listen方法的callback参数也可以单独去处理,因为服务器监听启动成功后,会自动触发listening事件,那么我们就可以通过绑定listening事件在事件的回调函数里处理
server.on("listening", function(){
console.log(1)
})
1.4 例子
// 引入http通信模块
var http = require('http');
// 创建服务器
var server = http.createServer()
server.on("request",function (req, res) {
// req: 请求对象,包含了所有客户端请求的数据,请求头,请求主体
// res: 响应对象,包含了所有服务器端发送给客户端的数据,响应投,响应主体
// req,res 数据都是流的形式
// res.write("hello world"); 采用流的方式传输,记得end()结束
res.setHeader("Content-Type", "text/html;charset=utf-8")
res.end("<h1>这是自己的淘宝</h1>"
})
// 监听端口号
server.listen(80, function () {
console.log("服务器启动成功")
})
我们也可以通过回调函数来处理
// 获取内置的模块http,这个模块是用来创建服务器的
const http = require('http');
// 创建一个服务器
const server = http.createServer(function (req, res) {
res.end('<h1>这是一个node(3+4)开发的服务器</h1>')
})
// 监听端口
server.listen(3000)
如果出现乱码,可以设置响应头解决
// 这是设置响应头,防止出现乱码(两种方法都可以)
// res.writeHead(200, { 'Content-Type': 'text/html;charset=UTF-8' });
res.setHeader('Content-Type', 'text/html;charset=UTF-8');
Node.js没有根目录的概念
2.1.5 关闭服务器
通过close方法关闭服务器
server.close()
在服务器被关闭的时候会触发close事件, 所以我们可以通过绑定close事件来处理在服务器关闭的时候要做的事情
server.on("close", function(){
console.log("close")
})
2.2. 获取客户端请求信息
在接受到客户端发送的请求时,调用的回调函数第一个参数值是一个httpInconmingMessage对象, 该对象是用于读取客户端请求流中的数据
server.on("request", (req,res) => {
console.log(req)
res.end("数据")
})
请求对象常用的属性
-
method 属性,
值是一个字符串, 为客户端向服务器发送请求时使用的的方法, 常用的强求有"GET","POST","PUT","DETELE"
server.on("request", (req,res) => { console.log(req.method) // 打印请求方式 })
-
url 属性
url 属性值为客户端发送请求时使用URL参数字符串
server.on("request", (req,res) => { console.log(req.url) })
我们可以根据用户请求的路径不同 相应不同 的内容
-
headers 属性
该属性值为客户端发送的请求头,其中存放了客户端发送的所有请求信息,包括cookie 信息及浏览器信息
server.on("request", (req,res) => { console.log(req.headers) })
2.3. HTTP响应的内容
在接受到用户请求的回调函数或request事件处理函数中的第二个参数值是一个http.ServerResponse对象, 可以利用该对象发送内容给客户端,及服务器端的响应流
server.on("request", (req,res) => {
console.log(res)
res.end("数据")
})
2.3.1 响应对象常用的属性
- writeHead : 设置有状态码的响应头信息
- setHeader: 设置单个响应头字段
- write: 发送响应数据
- end : 结束响应
2.3.2 可以利用writeHead方法来发送响应头
1. writeHead方法接受三个参数
- statusCode 第一个参数, 必须传递, 执行一个http 状态码 例如200
- reasonPhrase 第二个参数可选,就是对状态码的描述信息,是一个字符串,一般不使用
- headers 第三个参数是可选的, 参数值是一个对象,用来配置响应头信息
server.on("request", (req,res) => {
// 设置响应头信息
res.writeHead(200,'ok',{
'Content-Type': 'text/html;charset=utf8'
})
res.end("响应数据")
})
2. 响应头常用的字段
- content-type: 指定响应内容的的类型
- location : 用于将客户端重定向到另外一个ur l地址
- set-cookie: 用于在客户端创建cookie
- access-control-allow-origin: 解决跨域问题
res.writeHead(200,{
'Content-Type': 'text/html;charset=utf8',
'Set-Cookie': 'name=wuwei;age=1*60*60*1000'
})
2.3.3 setHeader 设置响应头
接受两个参数
- name: 响应头的字段
- value: 响应头的值
res.setHeader('Content-Type', 'text/html;charset=utf8')
两个方法对比
setHeader 每次只能设置一个响应头字段, writeHead可以一次设置多个响应头字段
2.3.4 write 方法
write 方法 发送响应内容,可以多次调用
server.on("request", (req,res) => {
res.setHeader('Content-Type', 'text/html;charset=utf8')
res.write("响应数据")
res.write("响应数据2")
res.write("响应数据3")
})
2.3.5 end 方法
end 方法, 在每次数据发送完毕后通过end方法来结束响应
server.on("request", (req,res) => {
res.setHeader('Content-Type', 'text/html;charset=utf8')
res.write("响应数据")
res.write("响应数据2")
res.write("响应数据3")
// 结束响应
res.end()
})
同时我们也可以给end传参数,表示在结束响应的时候最后一次给客户端响应的内容
server.on("request", (req,res) => {
res.setHeader('Content-Type', 'text/html;charset=utf8')
// 结束响应
res.end("响应内容")
})
3. 热更新
我们发现每一次修改都需要从新打断,重新用node启动,如果不希望这样,就可以使用热更新.
下载nodemon 包
npm i -g nodemon
安装完成后就可以用nodemon
替代node
启动
nodemon app.js
//启动