后端API接口

后端API接口

前言

在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。

 

一般系统的大致整体架构图如下:

 

 

需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为老顾这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。

接口交互

前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。

针对URL路径的restful风格,以及传入参数的公共请求头的要求(如:app_version,api_version,device等),老顾这里就不介绍了,小伙伴们可以自行去了解,也比较简单。

着重介绍一下后端服务器如何实现把数据返回给前端?

返回格式

后端返回给前端我们一般用JSON体方式,定义如下:

 

{
    #返回状态码
    code:integer,       
    #返回信息描述
    message:string,
    #返回值
    data:object
}

 

CODE状态码

 

code返回状态码,一般小伙伴们是在开发的时候需要什么,就添加什么。

 

如接口要返回用户权限异常,我们加一个状态码为101吧,下一次又要加一个数据参数异常,就加一个102的状态码。这样虽然能够照常满足业务,但状态码太凌乱了

 

我们应该可以参考HTTP请求返回的状态码

 

:下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

 

 

我们可以参考这样的设计,这样的好处就把错误类型归类到某个区间内,如果区间不够,可以设计成4位数。

 

#1000~1999 区间表示参数错误
#2000~2999 区间表示用户错误
#3000~3999 区间表示接口异常

 

这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据message相关的信息描述,可以快速定位。

 

Message

 

这个字段相对理解比较简单,就是发生错误时,如何友好的进行提示。一般的设计是和code状态码一起设计,如

 

 

再在枚举中定义,状态码

 

 

状态码和信息就会一一对应,比较好维护。

 

Data

 

返回数据体,JSON格式,根据不同的业务又不同的JSON体。

我们要设计一个返回体类Result

 

 

控制层Controller

我们会在controller层处理业务请求,并返回给前端,以order订单为例

 

 

我们看到在获得order对象之后,我们是用的Result构造方法进行包装赋值,然后进行返回。小伙伴们有没有发现,构造方法这样的包装是不是很麻烦,我们可以优化一下。

美观优化

我们可以在Result类中,加入静态方法,一看就懂

 

 

那我们来改造一下Controller

 

 

代码是不是比较简洁了,也美观了。

优雅优化

上面我们看到在Result类中增加了静态方法,使得业务处理代码简洁了。但小伙伴们有没有发现这样有几个问题:

1、每个方法的返回都是Result封装对象,没有业务含义
2、在业务代码中,成功的时候我们调用Result.success,异常错误调用Result.failure。是不是很多余
3、上面的代码,判断id是否为null,其实我们可以使用hibernate validate做校验,没有必要在方法体中做判断。

我们最好的方式直接返回真实业务对象,最好不要改变之前的业务方式,如下图

 

 

这个和我们平时的代码是一样的,非常直观,直接返回order对象,这样是不是很完美。那实现方案是什么呢?

实现方案

小伙伴们怎么去实现是不是有点思路,在这个过程中,我们需要做几个事情

1、定义一个注解@ResponseResult,表示这个接口返回的值需要包装一下
2、拦截请求,判断此请求是否需要被@ResponseResult注解
3、核心步骤就是实现接口ResponseBodyAdvice和@ControllerAdvice,判断是否需要包装返回值,如果需要,就把Controller接口的返回值进行重写。

注解类

 

用来标记方法的返回值,是否需要包装

 

 

拦截器

 

拦截请求,是否此请求返回的值需要包装,其实就是运行的时候,解析@ResponseResult注解

 

 

此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。

 

重写返回体

 

 

上面代码就是判断是否需要返回值包装,如果需要就直接包装。这里我们只处理了正常成功的包装,如果方法体报异常怎么办?处理异常也比较简单,只要判断body是否为异常类。

 

 

怎么做全局的异常处理,篇幅原因,老顾这里就不做介绍了,只要思路理清楚了,自行改造就行。

 

重写Controller

 

 

在控制器类上或者方法体上加上@ResponseResult注解,这样就ok了,简单吧。到此返回的设计思路完成,是不是又简洁,又优雅。

总结

这个方案还有没有别的优化空间,当然是有的。如:每次请求都要反射一下,获取请求的方法是否需要包装,其实可以做个缓存,不需要每次都需要解析。当然整体思路了解,小伙伴们就可以在此基础上面自行扩展。谢谢!!!

漠冰的痛
关注 关注
  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
看看这后端API接口写得,那真叫一个巴适~
AMSRY的博客
09-19 5900
在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。 一般系统大致架构如下: 需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为这篇主要聊API接口,所以我们聚焦这一点。 接口交互 前端和后端进行交互,前端按照约定
后端API交互:实战演练与深入理解
weixin_42561464的博客
08-31 2906
本文还有配套的精品资源,点击获取 简介:API作为IT领域中连接软件系统的桥梁,使得数据和服务能够无缝传递。本项目将指导学习如何在前端和后端环境中有效地使用API,涵盖了从设计API接口到前后端交互、错误处理、认证授权、数据转换、前端开发、测试到部署的全流程。通过构建一个示例应用程序,开发者可以深入理解前后端消费API的机制,并提升开发和协作技能。 1. API在...
后端访问API接口
pxxcsdn的博客
03-05 5256
很简单,直接上代码 /// <summary> /// POST请求 /// </summary> /// <param name="actionAndMethod"></param> /// <param name="body"></param> ///
后台 API 接口
DanielBlackCat的博客
04-21 496
import request from ‘@/utils/request’ export function login(data) { return request({ url: ‘/login’, method: ‘POST’, data }) } export function menus(data) { return request({ url: ‘/menus’, method: ‘GET’, data }) } const env = { prod: { //线上地址 baseURL: ‘http
后台api请求接口
ling_xy的博客
08-21 329
app.js: const express=require("express"); const app=express(); const url=require("url"); let port=8082; let host="127.0.0.1" //接入中间件 app.use((req,res,next)=>{ //设置cross跨域 res.header('AcceAss-Control-Allow-Origin','*'); next(); }) //post请求 .
小羽直播-后端api接口.zip
03-03
《小羽直播后端API接口详解》 小羽直播是一个实时互动的在线直播平台,其后端API接口是实现各种功能的关键。理解并掌握这些接口的运作方式对于开发者来说至关重要,因为它们是连接前端应用与服务器数据的核心桥梁。...
基于C#语言的鲜花网后端API接口设计源码
最新发布
09-24
该项目是一个基于C#语言开发的鲜花网后端API接口设计源码,包含95个文件,其中83个C#源文件、4个C#项目文件、4个JSON配置文件、1个Git属性文件、1个Git忽略文件、1个解决方案文件和1个配置文件。此代码库为鲜花网...
flask后端开发接口示例,利用Flask开发后端API接口。.zip
09-28
flask后端开发接口示例,利用Flask开发后端API接口。包含基本的项目配置、统一响应、MySQL和Redis数据库操作、定时任务、图片生成、项目部署、用户权限认证、报表输出、无限层级生成目录树、阿里云手机验证码验证、...
spring-boot-api:spring-boot 通用APP后端api接口 restful api接口 前后分离后端接口
05-01
适用于APP后端接口服务 前后端分离项目提供接口服务 集成jpa(Java持久层API)ORM jpa的curd 原生curd MySQL分页 阿里数据库连接池druid 封装腾讯云CMQ相关接口 redis相关接口API jwt 权限认证 http等请求相关接口 ...
如何设计API接口,实现统一格式返回?
weixin_34389926的博客
06-04 378
2019独角兽企业重金招聘Python工程师标准>>> ...
后台接口例子
02-21
学习写后台接口的web项目作业后台,可以作为很好的模板,包括json和jdbc的jar包
Javascript:利用闭包封装模块
KaiSarH
02-18 579
利用闭包封装模块的两种方式
后端开发——接口
热门推荐
追求幸福,探索未知的博客
08-17 1万+
restful rpc 后端开发 接口
Java 如何设计 API 接口,实现统一格式返回?
zhuzj12345的博客
11-01 3065
前言 在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式, (题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了) 一般系统的大致整体架构图如下: 需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关...
ejs模板语法
taylor_lin的博客
06-21 1081
ejs模板语法 <% '脚本' 标签,用于流程控制,无输出。 <%= 输出数据到模板(输出是转义 HTML 标签) ( 不会编译html标签) <%- 输出非转义的数据到模板( 会编译html标签 ) 什么是流程控制? 条件判断 if 循环控制 for forEach … while do…while 后端渲染 后端通过一个模板( 兼容html ) + 后端模板语法 ----》...
后端 接口
Carrot_Jia的博客
05-11 1459
文章目录1. 微信授权1.1 授权2. 衣橱模块2.1 衣物信息显示 1. 微信授权 1.1 授权 GET /auth/jump[?redirect={encoded_uri}] HTTP1.1 如果访问以下接口时遇到401,请先访问此地址进行微信授权登录。接受redirect参数。 2. 衣橱模块 2.1 衣物信息显示 POST /heal HTTP1.1 Content-Type: application/x-www-form-urlencoded { "name": string,
API设计风格—RESTful】:前端如何调用RESTful风格的API(三)
To Begin,Begin  
03-23 1万+
前端使用的是Ionic+AngularJS的架构,下面我们看看如何用AngularJS+$Resource定义Restful客户端。 【1】如何写模板 定制的服务被定义在app/js/services,所以我们需要在布局模板中引入这个文件。另外,我们也要加载angularjs-resource.js这个文件,它包含了ngResource模块以及其中的$resource服务,我们一会就会用到它们。
后端登录接口(demo)
前方的路在刚开始
07-04 713
前端获取到token,就算成功,后面前端的所有请求都会被后端拦截,判断是否token有效,并且在有效期内关于短信验证码,已经在我的另一篇博客中了。传送门实体类 controller中的方法 service方法 mapper.xml sql.xml 关于token中的方法,传送门...
后端api接口解密例子
06-11
好的,我可以为您提供一个简单的后端API接口解密的例子。假设您的API接口使用AES加密算法进行加密和解密。 1. 首先,您需要获取加密后的数据和密钥。这些信息可能会通过HTTP请求的header或body中进行传递。 2. 在后端代码中,您需要使用AES解密算法来解密数据。您可以使用Java或Python等语言中的AES解密库来实现。 3. 解密过程中需要使用密钥来对加密数据进行解密。密钥也需要从HTTP请求中获取。 4. 解密完成后,您可以将解密后的数据进行下一步的处理。 下面是一个简单的Java代码示例来解密API接口中的数据: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public static String decrypt(String encryptedData, String key) throws Exception { byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData); byte[] keyBytes = key.getBytes("UTF-8"); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] decryptedDataBytes = cipher.doFinal(encryptedDataBytes); String decryptedData = new String(decryptedDataBytes, "UTF-8"); return decryptedData; } ``` 以上代码使用Java语言实现了AES解密算法,并且使用了Apache Commons Codec库中的Base64解码方法来将加密后的字符串转换为字节数组。在解密过程中,需要使用密钥来进行解密,密钥也需要是字节数组类型。最后,解密完成后,将解密后的数据转换为字符串类型并返回。
写文章

热门文章

  • echarts 地图标注 symbol 27419
  • echarts 饼图引导线周围文字位置的改变 19037
  • vue echarts自定义地图 15209
  • Javascript:为input设置readOnly属性 12283
  • Response.setHeader("Content-Disposition", "attachment; filename=" + fileName+".xls");file.Name为中文则乱码 10927

分类专栏

  • vue学习 3篇

最新评论

  • 后端API接口

    漠冰的痛: 放在后面是正确的

  • Java 从数据库里读取数据,并将数据赋予某变量

    kkaiI: 工具类呢

  • 后端API接口

    QiaoQiao17: 萌新,请问下为什么你的状态码可以放在后面,我是状态码放在方法后面就报错,放在private Integer code前面才正常。。。表情包

  • Android Studio SDK Manager license 失效问题

    Tisfy: 写得太好了!正如那:遗民忍死望恢复,几处今宵垂泪痕。

  • application.properties 常见配置

    ctotalk: mark

最新文章

  • Flex各种常用布局示例
  • System.out.println对线程安全的影响
  • 深入浅出索引(上)
2022年2篇
2021年3篇
2020年15篇
2019年16篇
2018年9篇
2017年18篇
2016年32篇
2015年26篇
2014年13篇
2013年7篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳坪山网站建设公司想优化网站改怎么改免费网站站长优化怎么优化网站到首页萍乡湘东区网站优化广告买卖网站的优化方法上海做网站优化价格网站首页怎么优化商丘网站搜索网站优化哪家好网站网络优化外包合肥网站优化费用邯郸eo网站优化报价网站优化协议书范本宁波优化网站关键词电话东营营销网站优化濮阳家居行业网站优化推广渠道河北网站优化推广渠道高碑店网站基础优化网站优化北京网站建设相关优化网站排名优化首选北京华网天下的优化网站的舟山网站运营优化平台金华网站推广优化公司宣城网站搜索排名优化价格网站优化点击助手石家庄网站优化推广技巧荆门市网站关键词优化效果网站排名优化首页揭阳网站首页关键词优化公司哪里有seo网站优化排名香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化