目录
1.http协议
在介绍http模块之前我们先来了解一下http协议的相关知识.
网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的信息联系到一起,从而实现这些资源的共享 网络传输数据有一定的规则,这些规则我们称为协议,HTTP就是规则中的一种,而且使用最为频繁是一种协议 .
1.1 http协议的概念
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。超文本传输协议传输的内容就是超文本的标记语言(文字,图片,视频,音频...) 它是TCP/IP协议之上的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程以及数据本身的格式
1.2 http协议传输数据的方式
HTTP协议是一种网络传输协议,采用的是请求/应答 方式传递数据,一次请求对应一次应答(响应).
一次http请求的基本流程是,有客户端向服务端发起一次请求(request), 而服务器在接收到以后返回给客户端一个响应(response)。所以一次完整的http请求包含请求和响应两部分。
当我们发送http请求时,通过URL(全球统一资源定位符)对网络资源进行定位
URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址。也即是我们常说的网址。以下面这个URL为例,介绍下普通URL的各部分组成: 协议+域名(端口默认80)+路径+参数
1.3 http请求格式
客户端发送一个HTTP请求到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据。
http请求报文格式:
1.3.1 http请求方法
根据http标准,http定义了多种请求方式,常用的有get和post.
- GET 1.主要是负责从服务器获取数据 2.URL中添加请求参数,显示在地址栏 3.请求字符串限制 1024个字节 比`POST`更加高效和方便。
- POST1.主要负责向服务器提交数据 2.没有大小限制 比'GET'传递数据量大,安全性高
序号 | 方式 | 描述 |
1 | GET | 请求指定的页面信息,并返回实体主体 |
2 | HEAD | 类似于 GET 请求, 只不过返回的响应中没有具体的内容(没有正文), 用于获取头部/报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件). 数据被包含在请求体中. POST 请求可能会导致新的资源的建立和/或已有资源的修改. |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
5 | DELETE | 请求服务器删除指定的页面 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
9 | PATCH | 是对put方法的补充,用来对已知资源进行j |
1.4 http响应
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
http响应报文格式:
1.4.1http响应状态码:
当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码。
HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:
分类 | 描述 |
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收处理 |
3** | 重定向,需要进一步操作已完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求,最常见的404 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
1.5 http流程总结
1.6 http协议的特点
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2.http模块
http模块是一个 nodejs 中用于网络通信的模块
2.1 NodeJS模块
1.创建服务器对象
const http = require('http');
const server = http.createServer();
2.创建请求处理函数
有两种方式创建请求处理函数:
- 创建服务端对象通过回调函数的方式
- 通过request 事件处理函数
1.通过回调函数的方式创建服务端对象
let app = http.createServer((require,response)=>{
require.write('hello world');
})
console.log(app);
2.通过createServer的方式创建服务端对象
//通过createServer的方式创建服务对象
let app = http.createServer();
// console.log(app)
app.on('reqeust',function(req,res) {
console.log(123)
})
3 设置服务监听
通过listen的方式设置服务监听
listen接受四个参数:
server.listen(port [, host] [,backlog] [, callback])
prot 必需的 监听的端口号
host 可选的 监听指定的地址(一般省略)
backlog 可选, 参数是一个指定等待客户端连接的最大数量, 默认511( 一般不使用)
callback 可选, 用于在服务器监听启动成功后执行的回调函数
//通过createServer的方式创建服务对象
let app = http.createServer();
// console.log(app)
app.on('reqeust',function(req,res) {
console.log(123)
})
// 监听端口
function listen(){
app.listen(3000,function(){
console.log("Server start at 3000 port")
})
}
listen()
listen方法的callback参数也可以单独去处理,因为服务器监听启动成功后,会自动触发listening事件,那么我们就可以通过绑定listening事件在事件的回调函数里处理
app.on('listening' ,function () {
console.log(11)
})
4.一个小小的案例
值得注意的是:每次当我们的文件内容改变之后都应该断开服务器然后重启
//引入通信模块
const http = require('http');
//创建服务器
const server = http.createServer();
//绑定事件
server.on('request',function (request,response) {
//request : 请求对象,包含了客户的所有信息,包括请求头,请求主体等
//response : 响应对象,包含了服务器发送给客户的所有信息,响应头,响应主体等
//解决有可能会出现的乱码问题
response.setHeader("Content-Type", "text/html;charset=utf-8")
response.end('<h2>我是小仙女</h2>')
})
//监听服务器
server.listen(3000,function() {
console.log('服务器启动成功');
})
启动服务器,在浏览器上访问
补充:出现乱码的解决方式:
如果出现乱码,可以设置响应头解决
// 这是设置响应头,防止出现乱码(两种方法都可以)
// res.writeHead(200, { 'Content-Type': 'text/html;charset=UTF-8' });
res.setHeader('Content-Type', 'text/html;charset=UTF-8');
2.2 获取客户端请求方式
在接受到客户端发送的请求是,调用的回调函数的第一个蚕食值是一个httpInconmingMessage对象该对象是用于读取客户端请求流中的数据.
server.on("request", (req,res) => {
console.log(req)
res.end("数据")
})
1.请求对象的常用属性
- method属性
值是一个字符串, 为客户端向服务器发送请求时使用的的方法, 常用的强求有"GET","POST"
server.on("request", (req,res) => {
console.log(req.method) // 打印请求方式
})
打印出请求的方式为GET
- url属性
url 属性值为客户端发送请求时使用URL参数字符串
server.on("request", (req,res) => {
console.log(req.url)
})
打印出两条信息第一个是请求的路径,第二个是请求网页标题的小图标.
- header属性
该属性值为客户端发送的请求头,其中存放了客户端发送的所有请求信息,包括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("数据")
})
1.http响应的常用属性:
- writeHead : 设置有状态码的响应头信息
- setHeader : 设置单个响应头字段
- write : 发送响应数据
- end : 结束响应
2.可以利用writeHead方法来发送响应头
writeHead方法接受三个参数:
- statusCode : 第一个参数,必须传递,执行一个http状态码
- reasonPhrase : 第二个参数可选,就是对状态码的描述信息,是一个字符串,一般不会用到
- header : 第三个参数可选,参数值是一个对象,用来配置响应头信息
server.on("request", (req,res) => {
// 设置响应头信息
res.writeHead(200,'ok',{
'Content-Type': 'text/html;charset=utf8'
})
res.end("响应数据")
})
响应头的常用属性:
content-type: 指定响应内容的的类型
location : 用于将客户端重定向到另外一个ur l地址
set-cookie: 用于在客户端创建cookie
access-control-allow-origin: 解决跨域问题
res.writeHead(200,{
'Content-Type': 'text/html;charset=utf8',
'Set-Cookie': 'name=pp;password = 123456'
})
3. setHeader 设置响应头
接受两个参数
name: 响应头的字段
value: 响应头的值
res.setHeader('Content-Type', 'text/html;charset=utf8')
setHeader 每次只能设置一个响应头字段, writeHead可以一次设置多个响应头字段
4.write方法
write 方法 发送响应内容,可以多次调用
server.on("request", (req,res) => {
res.setHeader('Content-Type', 'text/html;charset=utf8')
res.write("响应数据")
res.write("响应数据2")
res.write("响应数据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("响应内容")
})
4. node热更新
我们发现每一次修改都需要重新用node服务器启动,如果不希望这样,就可以使用热更新.
下载nodemon 包
npm i -g nodemon
安装完成后就可以用nodemon
替代node
启动
nodemon example.js
修改内容之后就不需要再次手动启动服务器