软件开发框架-WebApi后端框架培训大纲(1)
软件开发框架-WebApi后端框架培训大纲(1)
什么是WebApi?
API(Application Programming Interface),指应用程序编程接口。
Web API(Web Application Programming Interface),指基于HTTP协议的编程接口,WebApi接口一般定义HTTP的请求方法、请求路径、参数、响应数据格式、响应HTTP Code等。至于HTTP Server(HTTP服务器,Web服务器),可以用Java、.Net、Nodejs等各种框架实现,HTTP Server属于Web API的实现。
当前比较流行的WebApi应用是基于ASP.NET的MVC架构衍生产品,微软最新发布的.NET Core API支持跨平台部署,而不仅仅受限于部署在Windows服务器,可以部署在Linux, Unix, Windows等服务器。
ASP.NET Web API体系架构图
CSFramework.WebApi服务端开发框架
WebApi基于C#.NET开发,支持三种宿主方式部署在 Windows服务器。
产品详情:http://www.csframework.com/cs-framework-webapi-1.0.htm
适用快速搭建APP、B/S、C/S、微信小程序、公众号、Web站点等后端应用服务程序。
WebApi开发框架项目组成:
微信小程序必须生产环境必须采用HTTPS协议。
建议阿里云申请或购买SSL证书,其他云产品如 ECS, OSS, 短信推送等服务。
将升级.Net CORE版本,.NET Core可以跨平台部署服务端,
支持 Linux, Unix,Windows等操作系统平台。
WebApi应用服务:支持3种承载方式。
http://www.csframework.com/archive/1/arc-1-20200217-2724.htm
1.IIS承载安装SSL证书,简单。
2.Self Hosting自承载:用于开发调试。
3.Win服务承载,如何部署SSL证书???官网搜索:
WebApi服务是个Web应用服务器,建议应用服务器与数据库服务器分离。
如何调试WebApi接口?
1.开发环境调试,VS跟踪调试。
2.使用:PostMan工具调试测试环境或生产环境。
HTTP交互方式
WebApi接口基于HTTP/HTTPS协议与服务器交互通信。
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。
CSFramework.WebApi,通过HTTP GET/HTTP POST两种方式(Method)提交数据。
HTTP GET:浏览器输入URL,回车,从服务器返回数据。
如:http://www.csframework.com/action.aspx?a=111&b=2222
它仅仅是获取资源信息,像数据库查询一样,不会修改和增加数据,不会影响资源的状态。
HTTP POST: 向服务器提交表单数据。比如前端界面完成数据录入,点【提交】按钮,将数据提交给服务器处理。
WebApi接口数据交换格式:
当前比较流行的几种与服务器交互的数据格式:
XML
JSON
YAML
什么是XML?
XML 指可扩展标记语言(EXtensible Markup Language),类似HTML。
XML 的设计宗旨是传输数据,而非显示数据。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML是当前编程中最为流行的数据交换格式,拥有跨平台、跨语言的优势。
什么是JSON?
JSON(JavaScript Object Notation JS 对象简谱)
是一种轻量级的数据交换格式。
采用完全独立于编程语言的文本格式来存储和表示数据。
易于人阅读和编写。同时也易于机器解析和生成。
JSON格式化工具:https://www.bejson.com/
什么是YAML?
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的缩写。
什么是ASP.NET MVC控制器(Controller)?
Controller是MVC中连接Model和View的中间桥梁,Controller中文意思是控制器,也就是起到一个获取请求信息,控制返回结果,控制跳转页面等的使用。
MVC中的控制器派生自Controller类。
当Controller中的一个具体Action接收到URL请求,会调用我们的业务代码,操作领域对象,最后根据得到的结果选择相应的视图返回给客户端。
什么是ASP.NET WebApi控制器(APIController)?
ApiController中文意思是应用编程接口控制器,也就是起到一个获取请求信息,控制返回结果。
ApiController与MVC中的控制器功能大致相同。
ApiController用于返回已序列化的数据给客户端,如JSON格式的数据。
Web API中的控制器派生自ApiController类而不是Controller类。
Web API控制器操作不返回视图,它们仅返回数据,JSON/XML格式的数据。
WebApi接口是通过控制器(Controller)实现的。
在控制器里面定义具体的方法即可,如:GetData, PostData。
CSFramework.WebApi框架提供5个标准控制器:
1.DoController (定义业务操作接口, api/do)
2.GateController(门禁,Login, Logout)
3.FileController(文件,Upload,Download,Delete,Rename)
4.ImageController(图片,Upload,Download,Delete,Rename)
5.SystemController(系统控制器:用户、Apikey缓存,Token缓存)
WebApi服务器接口安全、数据安全6大机制
(WebApi框架提供6个安全机制):
ApiKey(公钥):
给应用程序开发者分配的公钥(用户身份证,唯一标识, 明文传输), 提供给:平台的合作伙伴、供应商、客户等。
比如我们的WebApi服务器,要开放接口给客户使用,分配给喜鹊科技一个Apikey:
公钥:5A02D19B-0397-497E-87EF-B4C8263F741E
私钥:6A02D19B-0397-497E-87EF-B4C826366666
安全机制:当用户访问接口时,最先判断ApiKey是否在WebApi服务器存在!!!
HTTPPOST: act.aspx?apikey=5A02D19B-0397-497E-87EF-B4C8263F741E
SecreKey(私钥):用于数字签名。
私钥的特点:WebAPI接口不传输参数,公钥和私钥是1对1,一个公钥配对一个私钥。
Api_UserKeys : API用户表。
WebApi接口的数字签名(Data Sign)机制
WebApi接口的数字签名用于接口数据安全以及用户认证防篡改。
防篡改,顾名思义就是防止有人恶意篡改请求数据以达到恶意攻击的目的。
基本原理:将要请求的数据加上ApiKey(公钥)、SecreKey(私钥),按规则组织成一个字符串,获取对应的MD5摘要,然后将该摘要及公钥同时作为请求的参数一起传递(私钥禁止传递)给WebApi服务器。
基本流程:
客户端数字签名(MD5数据加密)
格式:partner=公钥&orderNo=业务数据&sign=MD5签名
格式:partner=3122131212&orderNo=1234567&sign=EBFE84D02E8E40952899EE5CDFE5404C
签名算法:MD5(partner+orderNo+私钥), MD5三个参数的值。
服务端签名校验(解密)
首先通过请求的ApiKey获取对应的私钥,然后通过上述签名算法计算MD5值,
对比请求的sign参数与计算结果是否一致,若不一致,数据被篡改。
客户端调用Webapi接口的标准参数模型:
请求数据(JSON)
{
Apikey: 5A02D19B-0397-497E-87EF-B4C8263F741E(表明身份)
Data:“我要获取数据” (目的)
Sign: 8dfa959cd5db1ead40a29c56cfe176ec (数字签名,md5算法,不可逆)
}
签名的公式:Sign=md5(Apikey+Data+SecretKey)
Md5(5A02D19B-0397-497E-87EF-B4C8263F741E我要获取数据6A02D19B-0397-497E-87EF-B4C826366666)
注意事项:
1.客户端程序对SecretKey绝对不可泄露!若发布的程序没有加壳或加密,会泄露私钥!
2.Web端不能使用明文私钥进行数字签名!用Token替代私钥!!!
3.若采用Token机制,可通过Token动态获取私钥并在内存缓存起来使用。
服务端验证数字签名:
验证签名的公式:Sign=md5(Request.Apikey+ Request.data+SecretKey)
1.根据Apikey从数据库获取私钥,设私钥=P,P的值:
6A02D19B-0397-497E-87EF-B4C826366666
2.服务器根据Request的数据计算MD5,
公式:Sign=md5(Request.ApiKey+Request.Data+P)
服务端计算MD5:
Sign=md5(5A02D19B-0397-497E-87EF-B4C8263F741E 我要获取数据6A02D19B-0397-497E-87EF-B4C826366666)
服务器计算的签名(S) =8dfa959cd5db1ead40a29c56cfe176ec
3.比较Request.sign=S, 若值相等是正常访问,不相等是非法访问或数据被篡改!
Token:令牌,访问接口的身份标识。
每次登录系统生成一个标识,存储在Api_UserToken表。 有过期特征,若要维持Token不过期,要保持访问接口活动状态。因此,访问接口时,会刷新当前用户的活动时间,重置初始状态。心跳机制。
Token过期:web.config设置,TokenExpireMinutes参数, (默认值)。
若api_user表的TokenExpires=null, 则取web.config的TokenExpiresMinutes参数。
应用:手机APP程序、Web系统, 基于C/S架构的WCF服务。
每次访问接口要传递令牌参数。
若过期,系统抛出访问异常:令牌已过期!重新登录。
用户表 Api_User:
用于APP移动端系统, Web系统,手机用户管理。
Account: 系统账号
Pwd:密码,Md5
Phone:手机号码
TokenExpires:Token过期时间(minutes), 15分、7天,15天,月,用不过期。
黑名单sys_IP_Blacklist:
客户端访问(Request)请求,会带有终端(Client)信息,比如:IP,操作系统,时间。
后台系统判断当前IP是否黑名单,黑名单用户拒绝访问接口的。
判断黑名单的优先级最高!!!
白名单sys_IP_Whitelist:
优先通道用户。比如后台系统有10级安全检查,若是白名单用户,只需3级检查。
限流:Throttling, 针对用户访问接口的频率进行控制。
同一个IP每秒种对XX接口访问3次。
结合路由器的ddos+WebApi的限流,确保服务器及应用程序安全。
Throttling是三方插件(dll)。
CSFramework WebApi日志管理
登录日志(sys_LoginHistory),记录用户登入登出信息。
日志库(CSFramework_WebAPI_Log)
系统日志sys_Log:记录系统异常,用户自定义类型的消息。LogType区分。
SMS,Login,Request,Sync2GW,Logout,Whitelist
任何请求都会记录,表的数据量巨大。定期清理。
接口访问日志sys_Log_ApiVistior
执行到命令处理层才写入接口访问日志。
文件日志:sys_Log_FileUpDown
记录文件上传,下载时间,文件名,用户,时间。
ModelRequest标准请求类:
ApiKey:
Sign:
Data: 提交的业务数据, 自定义内容。JSON,字符串。
DataIsEncrypt: 是否加密。对称加密。若data属性的数据是加密的,此参数必须true.
标准请求类用于自定义WebApi接口。举例,客户管理接口,
+GetCustomer(ModelRequest)
ApiKey:xxxxxxxxxxxxxxxxxxx
Sign:md5xxxxxxxxxxxxxxxx
Data: 客户编码, C0000001
DataIsEncrypt: false
Query(ModelRequest)
Data: {Name:XXX, Phone:138xxx} //JSON,多条件查询。
DeleteCustomer(ModelRequest)
ModelRequestAction通用请求类:
Action: 数字,接口编号(InterfaceCode)。如:180001, 命令编码。
ClientData: 终端信息,JSON格式。APP请求:IP, MID设备码,anroid/ios, Crome,FirFox, 软件的版本号。
Operation:具体的操作,如:180001是客户管理,OP=(Get/Delete/Query)
+Do (ModelRequestAction)
Act: 180001客户管理
ApiKey:xxxxxxxxxxxxxxxxxxx
Sign:md5xxxxxxxxxxxxxxxx
Data: 客户编码, C0000001
DataIsEncrypt: false
Cdata:{MID:M2345122A,OS:Android}
Op:Get
ModelResponse服务器响应:返回到客户的数据。
Code:0,-1
Message:
Data: 具体的业务数据,比如GetCustomer,返回客户列表(JSON)。
控制器(接口层):
1.集成ApiController
2.地址路由,给类定义RoutePrefix特性。自定义URL地址, 基地址后面部分。
如:http://localhost:19888/api/do/ActionName
每个控制器必须定义一个路由!
3.ActionName:定义接口名称。
具体访问地址:http://localhost:19888/api/do/post
若接口没定义ActionName, 路由地址就是方法名称,如:
http://localhost:19888/api/do/DoPostObject
4.HttpPost/HttpGet:定义接口的请求方式(Http Method)
5.控制器2种接口参数,ModelRequest/ ModelRequestAction
标准参数请求特点:必须定义具体的方法名,如SaveProduct/ DeleteOrder
通用参数请求特点:1个接口搞定,缺点:负荷大。
命令层:理解为BLL
1.CommandHandler: 命令处理程序。主要功能,
1.1校验数字签名
1.2根据接口编码(ActionID),获得对应的Command层(BLL)
1.3执行命令 Command.Execute()
2.命令(Command)
2.1CommandAttribute: 定义命令的编号,以及名称。
2.2命令层聚合DAL层。BLL→DAL→db
2.3Accept方法(CheckData), 用于校验数据, 检查数据完整性。若检查不通过,返回到前端提示。检查通过,调用Execute方法。
2.4Execute方法, 执行命令。根据Operation标识,执行具体的操作。
DAL层
Model(实体类)
3.实体类的SQL命令生成器
4.Update,基于ADO.NET提交。最好的方式是采用Entity Framework机制。
WebApi接口的参数是:前端:ObjectJSON, 后端:JSON→Object
WCF接口的参数是:前端:DataSetbyte[], 后端:byte[]→DataSet
为什么C/S框架前端不用实体类?
最主要的原因是数据列表的处理。表格呈现方式, 明细表对象状态的控制, 表格的数据源是支持object。
GridControl.DataSource=object.
1.DataTabel
2.List<Object>
3.比如报表数据,关联查询,跨表的。2007, Entity Framework没有。
1 Add,,,2Edit,,,3Delete , 4,Unchanged
DataTable完美解决。
LINQ优势:
1.把SQL逻辑搬到前端。
2.跨数据库!
如何部署WebApi服务器?
1.部署IIS服务器
http://www.csframework.com/archive/1/arc-1-20200223-2738.htm
http://www.csframework.com/archive/1/arc-1-20170923-2355.htm
2.部署Win服务器
http://www.csframework.com/archive/1/arc-1-20200212-2707.htm
3.SelfHosting不需要部署的。
4.如何在Windows服务部署基于HTTPS协议的WebApi服务
5.如何在IIS部署HTTPS协议,SSL证书.
Console.Write(“xxxxx”);
根据你们项目如何定义控制器?
可以根据业务模块定义控制器。
1)控制器名字要规范:XXXXController
2)路由格式要一致:api/XXXX, WebApiRouteConfig
1.定义一个接口, 分别实现以下两种参数:
ModelRequest
ModelRequestAction
2.处理数据, Command层。
同时调试Client,Server, 建议分屏开发!
笔记本配置1个液晶显示器,21寸。
配置固态硬盘C:
程序员成本高,
WebApi Tools ,管理员工具
1.管理与维护WebApi服务器的后台数据
2.代码生成器,用于快速生成DAL,Model,Command代码。
BUG:
1生成Command命令, 需要填写接口编号。
2注册失败
2.生成Command, 接口
http://webapi.csframework.com/Login.html
jonny
test