美文网首页
第六节: 内置模块(二): HTTP模块

第六节: 内置模块(二): HTTP模块

作者: 时光如剑 | 来源:发表于2020-12-16 19:35 被阅读0次

1. 了解http协议

网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的信息联系到一起,从而实现这些资源的共享
网络传输数据有一定的规则,这些规则我们称为协议,HTTP就是规则中的一种,而且使用最为频繁是一种协议

1.1. 什么是http协议

http是网络协议的一种,超文本传输协议(hypertext transfer protocol)的简写
超文本传输协议传输的内容就是超文本的标记语言(文字,图片,视频,音频...)
它是TCP/IP协议之上的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程以及数据本身的格式

HTTP协议是一种网络传输协议,采用的是请求/应答 方式传递数据,一次请求对应一次应答(响应)



HTTP协议到底约束了什么?

  1. 约束了浏览器以何种格式向服务器端发送数据
  2. 约束了服务器应该以何种格式来接受客户端发送的数据
  3. 约束了服务器应该以何种格式来反馈数据给浏览器
  4. 约束了浏览器应该以何种格式来接受服务器反馈的数据
1.2 HTTP交互的特点

浏览器给服务器发送数据: 一次请求
服务器给浏览器反馈数据: 一次响应
一次请求对应一次响应,多次请求对应多次响应

1.3. HTTP状态码

什么是http状态码?

http协议规定的服务器响应数据时的状态编码,就是状态码



常用的状态码

  1. 1xx : 表示普通消息,没有特殊含义
  2. 2xx : 服务器响应成功
  • 200 成功 [重点掌握]
  1. 3xx : 表示重定向
  • 301 永久重定向 [重点掌握]
  • 302 临时重定向
  • 304 使用缓存(服务器没有更新过)
  1. 4xx : 表示请求失败
  • 403 权限不足,无法访问
  • 404 资源找不到 [重点掌握]
  1. 5xx 服务器执行有错
  • 500 服务器代码有错
  • 502 网关或代理服务器有错
  • 503 服务器崩溃了



状态码的使用

res.writeHead(状态码,响应头)

1.4. 响应头
1.4.1 响应的文件类型 Content-Type:
  1. text/html;charset=utf-8 (如果为指定文件类型,默认就是html)

    字符编码,node默认的字体编码编码是utf-8,浏览器的编码,默认是系统编码,简体中文编码,就是gbk编码,所有会出现乱码

1.4.2 响应的内容的长度 Content-Length:
  1. 值是数字, 字节的 长度,一般不设置,返回的内容是多少就是多少
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])

  1. prot 必需的 监听的端口号
  2. host 可选的 监听指定的地址(一般省略)
  3. backlog 可选, 参数是一个指定等待客户端连接的最大数量, 默认511( 一般不使用)
  4. 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("数据")
})
请求对象常用的属性
  1. method 属性,

    值是一个字符串, 为客户端向服务器发送请求时使用的的方法, 常用的强求有"GET","POST","PUT","DETELE"

    server.on("request", (req,res) => {
        console.log(req.method) // 打印请求方式
    })
    
  2. url 属性

    url 属性值为客户端发送请求时使用URL参数字符串

    server.on("request", (req,res) => {
        console.log(req.url)
    })
    

    我们可以根据用户请求的路径不同 相应不同 的内容

  3. 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 响应对象常用的属性
  1. writeHead : 设置有状态码的响应头信息
  2. setHeader: 设置单个响应头字段
  3. write: 发送响应数据
  4. end : 结束响应
2.3.2 可以利用writeHead方法来发送响应头
1. writeHead方法接受三个参数
  1. statusCode 第一个参数, 必须传递, 执行一个http 状态码 例如200
  2. reasonPhrase 第二个参数可选,就是对状态码的描述信息,是一个字符串,一般不使用
  3. headers 第三个参数是可选的, 参数值是一个对象,用来配置响应头信息
server.on("request", (req,res) => {

    // 设置响应头信息
    res.writeHead(200,'ok',{
        'Content-Type': 'text/html;charset=utf8'
    })

    res.end("响应数据")
})
2. 响应头常用的字段
  1. content-type: 指定响应内容的的类型
  2. location : 用于将客户端重定向到另外一个ur l地址
  3. set-cookie: 用于在客户端创建cookie
  4. 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 设置响应头

接受两个参数

  1. name: 响应头的字段
  2. 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
//启动

相关文章

  • 第六节: 内置模块(二): HTTP模块

    1. 了解http协议 网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的信息联系到一起,从而实现这些...

  • Node.js HTTP模块

    内置HTTP模块 Node.js 中有 HTTP 这个内置模块,HTTP 模块允许 Node.js 通过超文本传输...

  • node模块载入机制

    node内模块以及载入顺序为: 内置模块 文件模块 文件目录模块 node_modules模块 内置模块 http...

  • node模块

    node 模块 内置模块http ( creatServer)fs (resdFileSync,writeFile...

  • 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.jsNode当中内置了Http模块;可以使用 引入http模块; He...

  • Node.js HTTP模块

    内置HTTP模块 Node.js中有HTTP这个一个内置模块,它允许Node.js通过超文本传输协议(HTTP)传...

  • Node.js_http服务(二)

    Node.js_http服务(二) 一、http基本用法 加载内置的http模块var http = requir...

  • express浅析

    Express框架建立在node.js内置的http模块上,核心是对http模块的再包装,等于在http模块之上,...

  • python常用模块介绍

    模块分为三种: 内置标准模块 自定义模块 开源模块(第三方) 以下主要介绍常用内置模块: 一、time模块 二、d...

  • 006、Nginx内置模块讲解

    一、查看内置了哪些模块 nginx -V 二、--with-http_stub_status_moudle 1、作...

网友评论

      本文标题:第六节: 内置模块(二): HTTP模块

      本文链接:https://www.haomeiwen.com/subject/liumgktx.html