由于近期公司人员流动,本人临时客串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版本升级管理的更多相关文章

  1. WebApi管理和性能测试工具WebApiBenchmarks

    说到WebApi管理和测试工具其实已经非常多的了,Postman.Swagger等在管理和维护上都非常出色:在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等. ...

  2. android项目数据库升级跨版本管理解决方案

    目前公司android项目普遍使用框架对数据库进行操作,数据库表与数据实体都具有严格的对应的关系,但是数据库的升依赖不同版本间的升级脚本,如果应用跨多版本进行升级时,当缺失部分升级脚本时就会导致应用异 ...

  3. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  4. NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...

  5. Android_SQLite版本升级,降级 管理

    今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...

  6. .NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)

    一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC ...

  7. Asp.Net WebApi 使用OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联(No OWIN authentication manager is associated with the request)” 异常的解决办法

    在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. ...

  8. 用Rider写一个由Autofac管理资源的WebAPI应用程序

    一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...

  9. 使用webapi实现windows本地用户管理

    1. 引言 最近一段时间设计和实现公司内部的基于OAuth2.0的统一身份认证中心,经梳理,公司部分自研系统可以使用OAuth2.0的方式进行身份认证,还有一部分系统无源代码,未开放接口,使用wind ...

随机推荐

  1. [学习笔记]JS中闭包的理解

    一.闭包概念的理解 闭包,又称为词法闭包或函数闭包指引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. 自由变量:该变量既不是函数本身定义的也不是函数 ...

  2. 在powerdesigner中,一个table,怎么在diagram中创建多个symbol

    两种方式 第一:可以创建多个diagram,直接把表拖到diagram中就可以 第二:复制->粘贴快捷方式,或者Ctrl+C先复制,再Ctrl+K粘贴到Diagram中 说明: ctrl+V 是 ...

  3. URL传递中文乱码的问题

    在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. 使用JQUERY中所提供的方法来做操作 encodeURI function verify() {    //解决中文乱麻问题的 ...

  4. io流导出csv

    @RequestMapping("/doExport") public void doExport(Model model, @RequestParam(value = " ...

  5. python学习之——splinter介绍

    Splinter是什么: 是一个用 Python 编写的 Web 应用程序进行验收测试的工具. Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL,然后你所开发的模拟的任何行为,都会 ...

  6. 第三章 springboot + jedisCluster(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5347703.html 如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是r ...

  7. sql 通过表名获取所有列名

    因为要做数据迁移,也就是业务数据库的数据要迁移到历史数据库,这两个数据库理论上表结构是一样的,但因为时间原因,可能业务库升级了表结构,但历史库没有升级,且加字段的顺序不一样,导致 insert int ...

  8. Centos7 密码重置

    1.在grub启动页面,按e编辑启动选项 2.找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 3.按下 Control+x ,使用修改后的设置启动,出现命令行 ...

  9. XE3随笔19:实例 - 借用 Google 实现全文翻译

    调用 Google 翻译的地址格式: http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + ...

  10. ps 的一些小东西

    1.画圈 画框 新建图层--矩形选框工具(U)--左上角选 '路径'--画圆/画框--编辑(右键)--描边--ok. 2 ctrl+t 大小变换问题