Node.js仿知乎服务端-深入理解RESTful API
Node.js仿知乎服务端-深入理解RESTful API
'第1章 学习之前要告诉你的/1-1 关于这门课程你想知道的都在这一节里面了~1'
理解RESTful API的6个限制和若干最佳实践掌握Koa2、Postman、MongoDB、JWT等技术运用上述技术搭建仿知乎RESTful API掌握阿里云线上部署方法
RESTful API理论JWT认证原理复杂的数据库关系(一对多、多对多等)
'第2章 跟着 GitHub 认识 RESTful API/2-1 REST 是什么以及它的 6 个限制~1'
REST是什么?万维网软件架构风格用来创建网络服务
为何叫 REST?Representational State TransferRepresentational:数据的表现形式(JSON、XML……)State:当前状态或者数据Transfer:数据传输
客户-服务器(Client-Server)关注点分离服务端专注数据存储,提升了简单性前端专注用户界面,提升了可移植性
www.itspxx.com
无状态(Stateless)所有用户会话信息都保存在客户端每次请求必须包括所有信息,不能依赖上下文信息服务端不用保存会话信息,提升了简单性、可靠性、可见性
缓存(Cache)所有服务端响应都要被标为可缓存或不可缓存减少前后端交互,提升了性能
统一接口(Uniform Interface)接口设计尽可能统一通用,提升了简单性、可见性接口与实现解耦,使前后端可以独立开发迭代
分层系统(Layered System)每层只知道相邻的一层,后面隐藏的就不知道了客户端不知道是和代理还是真实服务器通信其他层:安全层、负载均衡、缓存层等
按需代码(Code-On-Demand 可选)客户端可以下载运行服务端传来的代码(比如JS)通过减少一些功能,简化了客户端
'第2章 跟着 GitHub 认识 RESTful API/2-2 统一接口的限制~1'
统一接口的限制
资源的标识资源是任何可以命名的事物,比如用户、评论等每个资源可以通过URI被唯一地标识https://api.github.com/usershttps://api.github.com/users/lewis617
通过表述来操作资源表述就是Representation,比如JSON、XML等客户端不能直接操作(比如SQL)服务端资源客户端应该通过表述(比如JSON)来操作资源
https://developer.github.com/v3/users/#update-the-authenticated-user
自描述消息每个消息(请求或响应)必须提供足够的信息让接受者理解媒体类型(application/json、application/xml)HTTP方法:GET(查)、POST(增)、DELETE(删)是否缓存:Cache-Control
超媒体作为应用状态引擎超媒体:带文字的链接应用状态:一个网页引擎:驱动、跳转合起来:点击链接跳转到另一个网页
什么是 RESTful API?符合REST架构风格的API
RESTful API 具体什么样子?基本的URI,如https://api.github.com/users标准HTTP方法,如GET,POST,PUT,PATCH,DELETE传输的数据媒体类型,如JSON,XML
请求设计规范URI使用名词,尽量用复数,如/usersURI使用嵌套表示关联关系,如 /users/12/repos/5使用正确的HTTP方法,如GET/POST/PUT/DELETE不符合CRUD的情况:POST/action/子资源
参考github api规范
响应设计规范状态码查询分页错误处理字段过滤
安全HTTPS鉴权限流
开发者友好文档超媒体
'第2章 跟着 GitHub 认识 RESTful API/2-3 RESTful API 简介~1'
'第2章 跟着 GitHub 认识 RESTful API/2-4 RESTful API 设计最佳实践~1'
'第3章 用 Koa 说 Hello World/3-1 Koa 简介~1'
基于Node.js:Node.js模块下一代:蚕食第一代Web框架Express的市场Web框架:不是命令行工具、不是算法
koa
利用async函数,丢弃回调函数增强错误处理:try catch没有捆绑任何中间件快速而愉快地编写程序
'第3章 用 Koa 说 Hello World/3-2 安装搭建第一个 Koa 程序~1'
'第3章 用 Koa 说 Hello World/3-3 Koa 中间件与洋葱模型~1'
'第4章 Koa 框架的路由与 RESTful API 最佳实践/4-1 路由简介~1'
路由是什么?决定了不同URL是如何被不同地执行的在Koa中,是一个中间件
如果没有路由所有请求都做了相同的事所有请求都会返回相同的结果
路由存在的意义处理不同的 URL处理不同的HTTP方法解析URL上的参数
'第4章 Koa 框架的路由与 RESTful API 最佳实践/4-2 自己编写 Koa 路由中间件~1'
'第4章 Koa 框架的路由与 RESTful API 最佳实践/4-3 使用 koa-router 实现路由~1'
操作步骤更优雅地实现路由基本功能演示一些高级路由功能,如前缀、多中间件
'第4章 Koa 框架的路由与 RESTful API 最佳实践/4-4 HTTP options 方法的作用是什么~1'
HTTP options方法的作用是什么?
为何要了解options方法的作用?这是一道面试题帮助理解 koa-router 的allowedMethods 的作用
HTTP options方法的作用是什么?检测服务器所支持的请求方法 CORS中的预检请求
allowedlMethods 的作用响应options方法,告诉它所支持的请求方法相应地返回405(不允许)和501(没实现)
'第4章 Koa 框架的路由与 RESTful API 最佳实践/4-5 RESTful API 最佳实践——增删改查应该返回什么响应~1'
操作步骤实现增删改查返回正确的响应
'第5章 Koa 框架的控制器以及设计更合理的目录结构/5-1 控制器简介~1'
什么是控制器?拿到路由分配的任务,并执行在Koa中,是一个中间件
为什么要用控制器?获取HTTP请求参数处理业务逻辑
发送HTTP响应
获取HTTP请求参数Query String,如?q=keywordRouter Params , 如/users/:idBody,如{name:“李雷"}Header,如 Accept、Cookie
编写控制器最佳实践每个资源的控制器放在不同的文件里尽量使用类+类方法的形式编写控制器严谨的错误处理
操作步骤学习断点调试获取 body获取 query获取header获取router params
'第5章 Koa 框架的控制器以及设计更合理的目录结构/5-2 获取 HTTP 请求参数~1'
'第5章 Koa 框架的控制器以及设计更合理的目录结构/5-3 发送 HTTP 响应~1'
'第5章 Koa 框架的控制器以及设计更合理的目录结构/5-4 更合理的目录结构~1'
'第6章 多种方案实现错误处理机制/6-1 错误处理简介~1'
什么是错误处理?编程语言或计算机硬件里的一种机制处理软件或信息系统中出现的异常状况
异常状况有哪些?运行时错误,都返回500逻辑错误,如找不到(404)、先决条件失败(412)、无法处理的实体(参数格式不对,422)等
为什么要用错误处理?防止程序挂掉告诉用户错误信息便于开发者调试
操作步骤制造404、412、500三种错误了解Koa自带的错误处理做了什么
'第6章 多种方案实现错误处理机制/6-2 Koa 自带的错误处理~1'
'第6章 多种方案实现错误处理机制/6-3 自己编写错误处理中间件~1'
'第6章 多种方案实现错误处理机制/6-4 使用 koa-json-error 进行错误处理~1'
使用 koa-json-error 进行错误处理
操作步骤安装koa-json-error使用koa-json-error的默认配置处理错误修改配置使其在生产环境下禁用错误堆栈的返回
'第6章 多种方案实现错误处理机制/6-5 使用 koa-parameter 校验参数~1'
操作步骤安装koa-parameter使用koa-parameter校验参数制造422错误来测试校验结果
'第7章 第一批用户入库啦~~/7-1 NoSQL 简介1'~
~~什么是 NoSQL?对不同于传统的关系型数据库的数据库管理系统的统称
NoSQL数据库的分类列存储(HBase)图存储(FlockDB)文档存储(MongoDB)对象存储(db4o)Key-value存储(Redis)XML存储(BaseX)
为什么要用NoSQL?简单(没有原子性、一致性、隔离性等复杂规范)便于横向拓展适合超大规模数据的存储很灵活地存储复杂结构的数据(Schema Free)
什么是 MongoDB?来自于英文单词“Humongous",中文含义为"庞大”面向文档存储的开源数据库由C++编写而成
为什么要用MongoDB?性能好(内存计算)大规模数据存储(可拓展性)可靠安全(本地复制、自动故障转移)方便存储复杂数据结构(Schema Free)
云MongoDB阿里云、腾讯云(收费)MongoDB官方的MongoDB Atlas(免费+收费)
'第7章 第一批用户入库啦/7-2 MongoDB 简介~1'
'第7章 第一批用户入库啦~~/7-3 云数据库——MongoDB Atlas~1'
~~
云数据库——MongoDB Atlas
操作步骤注册用户设置IP地址白名单创建集群获取连接地址添加数据库用户
'第7章 第一批用户入库啦/7-4 使用 Mongoose 连接 MongoDB~1'
用Mongoose 连接MongoDB
操作步骤安装Mongoose用Mongoose 连接MongoDB
npm i mongoose --save
'第7章 第一批用户入库啦~~/7-5 设计用户模块的 Schema~1'
~~
设计用户模块的 Schema
操作步骤分析用户模块的属性编写用户模块的Schema使用Schema生成用户Model
'第7章 第一批用户入库啦/7-6 用 MongoDB 实现用户的增删改查~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-1 Session 简介~1'
Session 的优势相比JWT,最大的优势就在于可以主动清除session了session保存在服务器端,相对较为安全结合cookie使用,较为灵活,兼容性较好
Session 的劣势cookie + session在跨域场景表现并不好如果是分布式部署,需要做多机共享session机制基于cookie的机制很容易被CSRF查询session信息可能会有数据库查询操作
Session 相关的概念介绍session:主要存放在服务器端,相对安全cookie:主要存放在客户端,并且不是很安全
Session 相关的概念介绍sessionStorage:仅在当前会话下有效,关闭页面或浏览器后被清除localstorage:除非被清除,否则永久保存
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-2 JWT 简介~1'
什么是JWT?JSON Web Token是一个开放标准(RFC 7519)定义了一种紧凑且独立的方式,可以将各方之间的信息作为JSON对象进行安全传输该信息可以验证和信任,因为是经过数字签名的
JWT的构成头部(Header)有效载荷(Payload)签名(Signature)
Headertyp:token的类型,这里固定为JWTalg:使用的hash算法,例如:HMAC SHA256或者RSA
Payload存储需要传递的信息,如用户ID、用户名等还包含元数据,如过期时间、发布人等与Header不同,Payload 可以加密
Signature对Header和Payload 部分进行签名保证Token在传输的过程中没有被篡改或者损坏
JWT vs. Session可拓展性性能安全性时效性RESTful API
操作步骤安装jsonwebtoken签名验证
设计用户Schema编写保证唯一性的逻辑
用koa-jwt中间件实现用户认证与授权
安装koa-jwt使用中间件保护接口使用中间件获取用户信息
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-3 JWT vs. Session~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-4 在 Node.js 中使用 JWT~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-5 实现用户注册~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-6 实现登录并获取 Token~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-7 自己编写 Koa 中间件实现用户认证与授权~1'
'第8章 JWT 在 Koa 框架中实现用户的认证与授权/8-8 用 koa-jwt 中间件实现用户认证与授权~1'
'第9章 项目实战之上传图片模块/9-1 上传图片需求分析~1'
上传图片的需求场景用户头像话题图片封面图片问题和回答中的图片
上传图片的功能点基础功能:上传图片、生成图片链接附加功能:限制上传图片的大小与类型、生成高中低三种分辨率的图片链接、生成CDN
上传图片的技术方案阿里云OSS等云服务,推荐在生产环境下使用直接上传到服务器,不推荐在生产环境下中使用
使用koa-body中间件获取上传的文件
操作步骤安装koa-body,替换koa-bodyparser设置图片上传目录使用Postman 上传文件
使用koa-static中间件生成图片链接
安装koa-static设置静态文件目录生成图片链接
编写上传文件的前端页面与后端接口联调测试
'第9章 项目实战之上传图片模块/9-2 使用 koa-body 中间件获取上传的文件~1'
'第9章 项目实战之上传图片模块/9-3 使用 koa-static 中间件生成图片链接~1'
'第9章 项目实战之上传图片模块/9-4 编写前端页面上传文件~1'
'第9章 项目实战之上传图片模块/本章精华总结.mp4'
'第10章 项目实战之个人资料模块 —— 学习处理复杂数据类型/10-1 个人资料需求分析~1'
个人资料功能点不同类型(如字符串、数组)的属性字段过滤
分析个人资料的数据结构编写代码校验个人资料参数
RESTful API最佳实践——字段过滤
操作步骤设计 schema 默认隐藏部分字段通过查询字符串显示隐藏字段使用Postman 测试
'第10章 项目实战之个人资料模块 —— 学习处理复杂数据类型/10-2 个人资料的 schema 设计~1'
'第10章 项目实战之个人资料模块 —— 学习处理复杂数据类型/10-3 个人资料的参数校验~1'
'第10章 项目实战之个人资料模块 —— 学习处理复杂数据类型/10-4 RESTful API 最佳实践——字段过滤~1'
'第11章 项目实战之关注与粉丝模块/11-1 关注与粉丝需求分析~1'
细化关注与粉丝功能点关注、取消关注获取关注人、粉丝列表(用户-用户多对多关系)
'第11章 项目实战之关注与粉丝模块/11-2 关注与粉丝的 schema 设计~1'
'第11章 项目实战之关注与粉丝模块/11-3 RESTful 风格的关注与粉丝接口(上)~1'
'第11章 项目实战之关注与粉丝模块/11-4 RESTful 风格的关注与粉丝接口(下)~1'
'第11章 项目实战之关注与粉丝模块/11-5 编写校验用户存在与否的中间件~1'
'第12章 项目实战之话题模块(足够完整!!)/12-1 话题模块需求分析~1'
话题模块功能点话题的增改查分页、模糊搜索用户属性中的话题引用
关注/取消关注话题、用户关注的话题列表
RESTful API最佳实践——分页
模糊搜索RESTful API最佳实践
实现关注话题逻辑(用户-话题多对多关系)
'第12章 项目实战之话题模块(足够完整!!)/12-2 RESTful 风格的话题增改查接口(上)~1'
'第12章 项目实战之话题模块(足够完整!!)/12-3 RESTful 风格的话题增改查接口(下)~1'
'第12章 项目实战之话题模块(足够完整!!)/12-4 RESTful API 最佳实践——分页~1'
'第12章 项目实战之话题模块(足够完整!!)/12-5 RESTful API 最佳实践——模糊搜索~1'
'第12章 项目实战之话题模块(足够完整!!)/12-6 用户属性中的话题引用~1'
'第12章 项目实战之话题模块(足够完整!!)/12-7 RESTful 风格的关注话题接口(上)~1'
'第12章 项目实战之话题模块(足够完整!!)/12-8 RESTful 风格的关注话题接口(下)~1'
'第13章 项目实战之问题模块 —— 复杂的数据库设计/13-1 问题模块需求分析~1'
问题的增删改查用户的问题列表(用户-问题一对多关系)
话题的问题列表+问题的话题列表(话题-问题多对多关系关注/取消关注问题
'第13章 项目实战之问题模块 —— 复杂的数据库设计/13-2 用户-问题一对多关系设计与实现~1'
'第13章 项目实战之问题模块 —— 复杂的数据库设计/13-3 话题-问题多对多关系设计与实现~1'
'第14章 项目实战之答案模块 —— 更复杂的数据库设计/14-1 答案模块需求分析~1'
'第14章 项目实战之答案模块 —— 更复杂的数据库设计/14-2 问题-答案模块二级嵌套的增删改查接口~1'
'第14章 项目实战之答案模块 —— 更复杂的数据库设计/14-3 互斥关系的赞踩答案接口设计与实现~1'
'第14章 项目实战之答案模块 —— 更复杂的数据库设计/14-4 RESTful 风格的收藏答案接口~1'
'第15章 项目实战之评论模块 —— 最复杂的数据库设计/15-1 评论模块需求分析~1'
'第15章 项目实战之评论模块 —— 最复杂的数据库设计/15-2 问题-答案-评论模块三级嵌套的增删改查接口~1'
'第15章 项目实战之评论模块 —— 最复杂的数据库设计/15-3 一级评论与二级评论接口的设计与实现~1'
'第15章 项目实战之评论模块 —— 最复杂的数据库设计/15-4 添加日期~1'
'第16章 丑媳妇终要见公婆:项目上线、部署与配置/16-1 在服务器上安装 Git 与 Node.js~1'
'第16章 丑媳妇终要见公婆:项目上线、部署与配置/16-2 用 Nginx 实现端口转发~1'
'第16章 丑媳妇终要见公婆:项目上线、部署与配置/16-3 使用 PM2 管理进程~1'
'第17章 使人进步的基石:回顾与总结/17-1 回顾与总结~1'
经验心得RESTful API 设计参考 GitHub API v3使用GitHub搜索Koa2资源
使用 Stack Overflow搜索问题
拓展建议使用企业级Node.js框架——Egg.js掌握多进程编程知识
学习使用日志和性能监控
课程资料/最新资料(必看).url
课程资料/重点说明.txt
ls /

浙公网安备 33010602011771号