webapi版本升级管理
由于近期公司人员流动,本人临时客串webapi开发,针对开发过程中碰到一些问题做一些改进
1、当前做法
项目webapi项目是居于asp.net框架开发的,每个功能模块新建一个api控制器,比如UserController,GroupController,针对Native App升级产生的多版本App,都只是对应唯一一个webapi。各个版本的app某个功能都调用同一个方法GetDetail,当某个版本需要扩充该方法的参数,则重新一个新方法GetDetailV2;当返回的实体属性名发生变更或者删减则扩充一个新属性或者加一个新实体;最苦恼的是针对老版本app上的bug,api将错就错导致各种奇怪的条件判断或者新方法;这种做法虽然前期迭代快捷,但越往后越混乱,给维护和测试带来极大不便
2、改进方法1
针对方法加复合路由方式,某个支持什么版本的app,就加上相对应的路由,这样虽然能将app版本和api版本关联上,但还是没有解决以上问题,而且每次新发版本都要对有方法加路由规则
[Route("v1/user/{id}")]
[Route("v2/user/{id}")]
[Route("v3/user/{id}")]
[HttpGet]
[HTTPBasicAuthorizeAttribute]
public UserInfo User(int id)
3、改进方法2
在controller层面加版本,比如V1_UserController,V2_UserController,每发布一个api版本都新建一个controller,新版本controller都继承老版本controller,controller中新写的方法都带virtual修饰以便后面版本重写;这样的好处在于既能重用代码,又能灵活改动,版本层次清晰,且不会因为影响老版本带来额外的测试工作,app可以很方便切换新版本接口 如:http://xxx/api/v1_user/Detail/1 http://xxx/api/v2_user/Detail/1
public class V1_UserInfoController:ApiController{
[HttpGet]
[HTTPBasicAuthorizeAttribute]
public virtual UserInfo Detail(int id){}//获取
[HttpPost]
[HTTPBasicAuthorizeAttribute]
public virtual bool Detail([frombody]UserInfo userinfo){}//添加
}
public class V2_UserInfoController:V1_UserInfoController{
[HttpPost]
[HTTPBasicAuthorizeAttribute]
public override bool Detail([frombody]UserInfo userinfo){}//重写添加方法
[HttpPut]
[HTTPBasicAuthorizeAttribute]
public override bool Detail([frombody]UserInfo userinfo){}//新增方法
}
3、改进方法3
本想针对方法2做改进,将请求接口改成类似 http://xxx/api/v1/user/Detail/1,但由于apirouter不支持命名空间,次设想暂时没有实现;网上有写文章写将版本号体现在url中不符合restful风格,最好写到httpheader中,此方案还在持续跟进中
webapi版本升级管理的更多相关文章
- WebApi管理和性能测试工具WebApiBenchmarks
说到WebApi管理和测试工具其实已经非常多的了,Postman.Swagger等在管理和维护上都非常出色:在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等. ...
- android项目数据库升级跨版本管理解决方案
目前公司android项目普遍使用框架对数据库进行操作,数据库表与数据实体都具有严格的对应的关系,但是数据库的升依赖不同版本间的升级脚本,如果应用跨多版本进行升级时,当缺失部分升级脚本时就会导致应用异 ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...
- Android_SQLite版本升级,降级 管理
今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...
- .NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)
一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC ...
- Asp.Net WebApi 使用OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联(No OWIN authentication manager is associated with the request)” 异常的解决办法
在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. ...
- 用Rider写一个由Autofac管理资源的WebAPI应用程序
一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...
- 使用webapi实现windows本地用户管理
1. 引言 最近一段时间设计和实现公司内部的基于OAuth2.0的统一身份认证中心,经梳理,公司部分自研系统可以使用OAuth2.0的方式进行身份认证,还有一部分系统无源代码,未开放接口,使用wind ...
随机推荐
- Java Sha1 加密算法
//下面四个import放在类名前面 包名后面 //import java.io.UnsupportedEncodingException; //import java.security.Messag ...
- python 面向对象-笔记
1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...
- Python3利用BeautifulSoup4批量抓取站点图片的代码
边学边写代码,记录下来.这段代码用于批量抓取主站下所有子网页中符合特定尺寸要求的的图片文件,支持中断. 原理很简单:使用BeautifulSoup4分析网页,获取网页<a/>和<im ...
- 类的static成员并用其实现一个单例模式
对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量.如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来 ...
- myql数据库在cmd下,中文乱码的问题原因
使用navicat把数据导入数据库,这些数据都是中文,导入成功,显式也正常,但是在mysql cmd下都是乱码.检查了我的mysql配置,字符编码都是utf8,包括navicat连接时候也设置过是ut ...
- 第五回. $e$ 的引入
假如你有 $1$ 块钱, 存银行, 利率为 $100\%$, 那么一年后本息和为$$1+1=2.$$ 如果你换种存法, 存半年, 把本息和取出来, 再存半年, 那么一年后本息和为$$\left(1+\ ...
- 第3天作业 PoEdu MyString实现
作业要求 代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> class My ...
- 主机使用代理上网,虚拟机Linux如何连外网
VMware虚拟机的三种联网方法及原理 一.Brigde--桥接 :默认使用VMnet0 1.原理: Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在& ...
- 03-Swift常量&变量
什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 常量和变量的基本使用 ...
- 默认构造方法并非总是public的
以前印象中一直有一个概念,说"如果没有提供构造方法,java将自动添加一个空的public的构造方法".现在看来,有2个问题,一,默认构造方法未必是public的,二,默认构造方法 ...