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

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
//启动
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容