RESTful API接口

WEB发展阶段

        静态内容阶段,在这个最初段,使用 Web 的主要是一些研究机构。 Web 由大量的静态 HTML 文档组成。
        cgi 程序阶段:在这个阶段, Web 服务器增加了一下编程API,通过API编写的应用程序,可以向用户提供动态变化的内容。
        脚本语言阶段:出现了ASP,PHP,JSP等支持SESSION的脚本语言技术,浏览器端出现了Java Applet,JavaScript技术,提供更加丰富的动态内容
        瘦客户端应用阶段:在这个阶段,在服务器端出现了独立于Web服务器的应用服务器,出现webMVC 开发模式,各种 web mVC开发框架逐渐流行,占据统计地位。据于这些框架开发的都是,因为它们是在服务器端生成全部内容。
        RIA应用阶段:在这个阶段,出晚了多种RIA「 Ricch internet Application )技术,改善了 Web应用的用户体验。应用最为广泛的技术DHTML + Ajax,Ajax技术支持在不刷新页面的情况下动态更新页面中的局部内容。同时至生了大量的 DHTML开发库,prototype. Dojo,extjs,JQuery/jQuery UI,element UI,layer UI

        移动 Web 应用阶段:在这个阶段,出现了大量面向移动设备的Web开发技术。除Android,IOS等操作系统平台原生的开发技术外,基于HTMLS 的开发流行

前后端分离开发技术

传统开发技术

       前端写好静态的html页面交给后端开发,后端把html改成模板,然后使用模板引擎去套模板,比如jsp,freemarker等后人员在开发过程中如果发现页面有问题,要返回给前端修改,前端再交给后端,直至功能实现。

问题:前后产重耦合

1.前端需要改bug调试时,需要在当前电脑安装一整套后端的开发工具,启动后端程序。
2.还要求后端人员会html,js等前端语言。

3.前端页面也会嵌入很多后端的代码。一旦后端换了一套语言,前端也需要重新开发

4.沟通成本,调试成本,前后端开发进度相互影响,从而大大降低开发效率前后端分离

前后端开发技术

       前后端分离并不只是开发模式,也是web应用的一种架构模式

在开发阶段,前后人员约定好数据交互接口,即可并行开发与测试。前端开发完成可以独自进行mock测试,后也可以使用postman等接口测试工具进行测试。最后可进行功能联调测试。

优点:

1.前后责任清晰,后专注于数据上,前端专注于视觉上。

2.无需等待对方的开发工作结束,提高开发效率

3.可应对复杂多变的前端需求

4.增强代码可维护性 

        不使用RESTful API风格,可能会造成不同开发者,PC浏览器、APP、小程序开发者在开发时要不断地查询。同时对于同一个操作比如添加用户:

        http://localhost/employee/new

        http://localhost/employee/create

        http://localhost/employee/add

        http://localhost/employee/xinzeng

        http://localhost/employee/save

接口设计

传统接口设计要考虑的问题

请求路径——望名知意
请求方式——get、post,采用@requestMapping时传统方式会忽略
请求参数
请求响应——模板路径/由需求决定

@Controller
publicclass EmployeeController
{
    @requestMapping("/employee/list") 
    public String list(Model model)
    {
        model.addAttribute("list",employeeService.list());
        return "employee/list";
    }
}

RESTful API设计

请求路径——当前接口操作的资源决定,一般使用资源复数,
请求方式——请求方式+请求路径,决定操作方式和内容(GET,POST,PUT,DELETE)
请求参数
请求响应——JSON格式

@Controller
publicclass EmployeeController
{
    @requestMapping(value="/employees",method=RequestMethod.GET) 
    @ResponseBody
    public List<Employee> list()
    {
        return employeeService.list());
    }
}

参考

REST API 返回码汇总

HTTP CODECODEMESSAGEDESC
2003000success请求成功
4003001missing authauth 为空
4013002auth failedauth 鉴权失败
4003003missing bodybody 为空
4033004invalid bodybody 无效
4003005parameter invalid参数错误
4033006out of freq请求超频
4043007api not foundAPI 不存在
4053008request method not support请求方法不支持
4053009app in black应用被列为黑名单
4053010this is vip function, pls contact to sales@jiguang.cnvip功能,请联系商务咨询vip功能
5003011server error服务端异常

WEB发展阶段

格式

        http(s):/域名:端口[/版本]/资源1[/子资源2/../子资源n][/路径变量]

        多版本控制

GET http(s): //edu.51cto.com/v1.1/blog/article/10

        返回数据集合时,资源名为复数

GET http(s)://edu.51cto.com/v1.1/blog/articles?categoryld=10

        反面典型

GET http(s): //edu.51cto.com/article/select_by_id?id=10
URL: http://somehost/tvseries

GET /tvseries 获取电视剧列表

POST /tvseries 创建一个新电视剧

GET /tvseries/101获取编号为101的电视剧信息

PUT /tvseries/101修改编号为101的电视剧信息

DELETE /tvseries/101删除编号为101的电视剧

GEI /tvseries/101/characters获取编号为101的电视剧的人物列表

GET /tveries/{id}/**s

请求类型的含义

  • GET(SELECT):从服务器取出资源
  • POST(CREATE):在服务器新建一个资源
  • PUT(UPDATE):在服务器更新资源(跟新所有属性)
  • PATCH(UPDATE):更新部分属性,一般不用,用put
  • DELETE(DELETE):从服务器删除资源

相同的URL请求类型不同,功能也不同

GET http(s): //edu.51cto. com/employee/10

表示查询10号员工的信息,但是请求换成POST,同时在请求体附加员工JSON数据,就代表在服务器数据库中新增一个编号为10的员工。

POST http(s): //edu.51cto.com/employee/10

("id":10,"name":"张三","age”:36} 

类似的,PUT代表更新员工数据。

PUT http(s): //edu.51cto. com/employee/10
("id":10,"name”:“张三”,"age”:38) 

DELETE代表删除员工数据。

DELETE http(s): //edu.51cto.com/employee/10

RESTful API接口设计规则和注意事项

保证幂等性设计

        幂等性:当多次重复请求时,接口能够保证与预期相符的结果        例如:我们设计了一个为员工涨薪的接口,本次请求发送后为1号员工涨薪500元。基于版本号的乐观锁机制

PUT https: //edu.lagou.com/employee/salary

{"id": "1, "incr_salary": 500}

       在分布式环境下,为了保证消息的高可靠性,往往客户端会采用重试或者消息补偿的形式重复发送同一个请求,那在这种情况下这段代码就会出严重问题,每一个重复请求被发送到服务器都会让该员工工资加500,最终该员工工资会大于要求实际应收工资。

        在行业中有一种乐观锁设计,在工资表额外增加一个version的字段,代表当前数据的版本,任何对该数据修改操作都会让version字段值+1,这个version的数值要求附加在请求中。

PUT https: //edu.lagou.com/employee/salary ("id":"1",incr_salary":500,"version":1}

        而服务器端代码也作出如下调整,SOL语句要增加版本号的比对。

//查询1号员工数据
Employee employee = employeeService.selectById(1);
//更新工资
employee.setSalary(employee.getSalary()+incrSalary);
//update执行成功,版本号+1
employee.setVersion(employee.getVersion() + 1);
//执行更新语句
employeeService.update(employee)
update方法除了id条件外,还要增加yersion的判断,如下所示:
当执行成功后,1号员工原始数据将工资更新为3500,版本为2
update employeee set salary = 3500, version=2 where id = 1 and version = 1

标准化响应结果集

     

       在标准化的响应结构中要包含code、message两项,分别对应了服务器处理结果与返回的消息内容,除此以外data属性是可选项,包含从响应返回的额外数据,如查询结果、新增或更新后的数据。

       在语义层面,也要遵循相同的规则。例如当服务器处理成功,code固定等于0,如果遇到异常情况,公司内部也要遵循统一的code命名标准例如:code以1xxx开头代表参数异常,2xxx开头代表数据库处理异常。当然不同的公司有不同的命名规则,一定要提前定义好并严格要求开发团队严格按语义使用编码。

接口设计采用无状态方案

       当后台有多个tomcat,如果身份验证采用session验证,在不同的tomcat服务器上可能出现状态不一样。

解决方案1:客户端存储认证数据,如cookie,但是不安全,容易窃取和仿造,需加密存储,如jwt

解决方案2:服务端统一存储状态数据,如redis则可以避免该问题实现统一验证。

资源表现形式

1.Content-Type可以放在request headers,也可以放在response headers,分别表示客户端/服务端本次发送的数据类型
2.Accept表示客户端希望接收的数据类型,只能在request的头部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值