移动端接口:版本的兼容

来自鼎*的面试问题,简单地说,我搞砸了...我还真的没有考虑过这个问题,稀里糊涂一顿胡说,我都感觉自己丢人。

现在大部分公司都做APP,所以面临一个版本兼容的问题。

APP功能的增加导致server接口不停的进行修改,增加.老接口可能在新的版本中不在使用,但并不能保证没有跨度大的历史版本APP用户,又不能直接修改或删除老server接口。

这里,必须保证更新后,历史版本也能同时使用。

(转自http://www.elecfans.com/emb/jiekou/20180223638453.html)



一、客户端兼容,端口不兼容

1、APP强制更新 [UX:造成用户体验下降]

接口URL:api.xxx.com/v1.0/xxxx.java

接口的URL中加入版本号,如上:v1.0。

每次发布新APP版本就强制更新。

灰度服务器 部署正在审核中的 接口版本(如:v1.1)。等审核通过后,将老版本的APP设置强制更新,这样老的接口就不用了。

然后把线上服务器重新部署上最新的代码,再去掉灰度服务器。

这样APP接口全部访问正式的线上服务器。

2、热更新

紧急的小需求可以用热更新,大的需求建议还是用原生的代码,因为你用热更新修改完(用JS或Lua),最后还要在原生代码里修改。

网游用热更新的比较多,因为网游的APP太大,不可能加个小关卡 就要求用户重新下载,并且游戏更新比企业级APP更频繁,用热更新可以不断新加关卡、场景、活动推广。

3、React Native 和Weex

据说Weex比React Native(React衍生物)好用(weex项目的编译时间会呈指数型上升)。然而,没用过。

二、服务端版本兼容

全部接口版本是否统一:

所有的接口都用 相同的版本号:这样要发一个APP新版本就统一修改版本号,好修改,但是如果想修改其中一个接口的版本号就不行了。

每个接口的版本号可以不一样:这样比较灵活,建议这样做。

因为已经好多年没有做过服务端了。下面的见解如果有错误,希望指正。

1、每个接口逻辑里 加if 判断(不建议)

接口URL:api.xxx.com/api?version=v1&.。

if (version == ‘1.5.0’) {

do_something

} else if (version ==‘1.4.0‘) {

do_something

}

优点:实现简单

缺点:不同版本的逻辑都在一个方法里,在于容易造成代码混乱,不利于维护。

2、不同的文件夹

相当于每个接口版本都是一个独立的项目。放到服务器的独立文件夹里。

例如:

接口URL:api.xxx.com/v1.0/xxxx.php

文件夹位置:Controller/V1.0/

-----------------/xxxx.php

文件夹位置:Controller/V2.1/

-----------------/xxxx.php

优点:版本逻辑分开维护。看url就能知道哪个版本。删除多余版本 不用修改代码。

缺点:同个接口不同版本 文件是重复的。并且 如果有个接口前几版就有问题,一直遗留到现在,就需要改好几套一样的代码。

3、不同版本 用不同的方法 :

类似:

接口URL:api.xxx.com/v1.0/xxxx.php

class XXXX{

public functionV1_0() { }

public functionV2_0() { }

}

java或者C# 都有路由配置,可以用路由配置不同版本的URL跳转到不同的方法里。

4、用继承的方式

采用继承的方式,既可以利用之前的接口代码,又可以采用override的方式修改部分接口的实现。

这样是可以的。但是如果你上个版本(也就是父类)修改了代码,就会影响后面的所有版本。

在线上有bug或者需求变更的时候 很可能会修改基类。

大家可以讨论下。

5、部署到不同的服务器

不同版本不同分支,部署在不同的服务器上。如果某个版本用不到了,直接干掉服务就好了。

例如我现在的API要从1.x升到不兼容的2.0版本了,那就给当前的发布分支打个Tag。等哪天1.x版的API需要fix bug,就能很简单地从这个Tag切一个1.x的分支出来fix bug后进行测试发布,而且这个分支不会合并到任何分支,所以不会影响其他版本。

这个方案 不好的地方在于,如果2.0也有同样bug的话,也要在2.0分支上改一遍。如果版本很多的话,这活就不好干了。所以呢,一般不会同时发布两个以上的版本,在升级不兼容的第三个版本前,一定会把第一个版本干掉。

但是比如 淘宝、微信 ,有的时候忘记更新了,你会发现淘宝已经升级过4、5个版本了,然后老版本还能用。也就是有的APP确实需要兼容4、5个版本。

另外,如果要兼容过多的版本,服务器也需要够多才行。同时,因为老版本的人用的少,也就是有的服务器访问量很少,有的服务器访问量很多。不能真正的负载均衡,浪费了服务器资源。

6、混合使用

两种方式的混合使用。服务端的几种方法混用:

6.1、第3种和第4种方法一起用。先用继承,如果新版本和以前的版本无法复用,就用路由设置新的方法。

6.2、第1种方法和第3中方法一起用,简单的小改动用 第1种,加个if判断。改动较大的用 第3种,新开个方法。

原文地址:https://www.cnblogs.com/legiorange/p/9130758.html

时间: 2024-10-14 07:36:10

移动端接口:版本的兼容的相关文章

APP接口版本兼容的问题

现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP,就强制用户更新到最新版本.不推荐这样,因为用户体验太差. 就算是用 强制更新,在苹果审核期间,新的APP接口和 老的接口 也必须能同时使用. 下面我们说下如何做,我们用的是最后一种方式,大家有不同意见可以 留言讨论. 一.客户端 做兼容,接口不用做兼容 1.AP

spring定时任务包Quartz版本不兼容

使用spring定时任务包Quartz时,必须使用Quartz1.85以下版本的.     查看发现spring3.0.5中org.springframework.scheduling.quartz.CronTriggerBean继承了     org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger),     而在quartz2.1.3中org.quartz.CronTrigger是个接口(publicabs

低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

       一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android

使用Thinkphp框架开发移动端接口

本文给大家分享的是使用thinkphp框架开发移动端接口的2种方法,一种是开发API,另外一种是实现移动端访问自动切换移动主题模板,从而实现伪app访问,下面我们就来详细看下如何实现吧. 方案一:给原生APP提供api接口 使用TP框架时 放在common文件夹下文件名就叫function.php <?php /** * Created by zhangkx * Email: [email protected] * Date: 2015/8/1 * Time: 23:15 */ /*******

SpringBoot 应用篇 实现后端的接口版本支持

SpringBoot 应用篇 实现后端的接口版本支持 作为一个主职的后端开发者,在平时的工作中,最讨厌的做的事情可以说是参数校验和接口的版本支持了.对于客户端的同学来说,业务的历史包袱会小很多,当出现不兼容的业务变动时,直接开发新的就好:然而后端就没有这么简单了,历史的接口得支持,新的业务也得支持,吭哧吭哧的新加一个服务接口,url 又不能和之前的相同,怎么办?只能在某个地方加一个类似v1, v2... 那么有没有一种不改变 url,通过其他的方式来支持版本管理的方式呢? 本文将介绍一种,利用请

XenDesktop系列-UserProfile版本不兼容问题

废话少说,直接上干货: XenDesktop版本:7.6CU6VDA版本:7.15CU5虚拟桌面系统:windows10 1909专业版和 windows7专业版桌面发布类型:PVS问题描述:同时登陆windows10和windows7桌面,因配置文件版本不兼容导致配置文件冲突和业务软件的使用问题.问题截图:用户登陆桌面后,在配置文件存储路径下只生成了以当前用户命名的一个文件夹,其中win7和win10共用一套配置文件. 解决方法:1,首先确认配置文件版本类型,确认配置文件版本兼容性:参阅链接:

Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary

此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary 报错解决方法. 希望能对初学 Selenium2 WebUI 自动化测试编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! 之前给朋友初步介绍了 S

低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

       这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分离式ActionBar上的ActionMode的效果. 一.自定义ActionProvider 建立一个类,继承android.support.v4.view.ActionProvider,然后复写里面的方法即可.主要就是初始化视图和相应点击事件. 范例一: SettingsActionProvid

T端大灾变版本传送大师(NPC 脚本)

#include "ScriptPCH.h"  class npc_teleport : public CreatureScript{    public:        npc_teleport() : CreatureScript("npc_teleport") { }                 bool OnGossipHello(Player *player, Creature *_creature)                {