如今不少项目都是web项目,先后端分离,惟一的交互就是经过restful接口,而当咱们请求返回的时候,status code如何返回呢?前端
首先介绍下经常使用的http status code有哪些。java
请求成功web
文档建立成功,好比新增一个user成功面试
请求已被接受,但相应的操做可能还没有完成。这用于后台操做,例如数据库压缩等异步操做spring
请求参数有误(好比应该传一个Number类型的参数,你却传了一个字符串),请求没法被服务器理解,修改后能够从新提交这个请求数据库
当前请求用户未被受权,好比未登录json
当前请求被拒绝。好比文件系统访问权限有问题,或者进行了越权操做(好比普通用户试图获取admin用户列表)后端
没法找到请求资源,通常是url错误api
使用无效的HTTP请求类型对请求的URL进行了请求。好比某个api只支持post,而client却使用了get服务器
服务器不支持请求的content type
请求体太大不支持,通常是上传的文件超出了限定致使的。
表示服务端在执行请求时发生了错误。 多是服务器或者应用存在bug
服务不可用,如今没法处理请求。
通常在restful API里,咱们对于状态码的认定是这样的:
1. 2xx: server 收到 client 端请求,能够执行
2. 4xx: client 送來资料有错,server 端没法执行 (client 修正错误后,可再送一次请求)
3. 5xx: client 送來的资料没错,但 server 端出错没法执行(client 端没法 take 任何 action)
可是我也见过status code返回200,而后在response中经过自定义code告诉用户请求是否成功
{
"code": 10020,
"msg": "name不能为空"
}
复制代码
虽然萝卜青菜各有所爱,我我的仍然认为对于REST接口,就应该用HTTP层面的status来表达操做是否成功。,由于网络通信不只仅是一个客户端一个服务器的事情,中间会有不少层节点,若是其中某一层对status 200的请求理解很是正统,作了cache或者什么处理,那你可能就坐蜡了。并且既然是写接口,就最好标准一点,别给本身埋坑。
因此对于成功的请求就应该返回2XX,对于4XX接口,你能够作对应的封装
状态码必定要返回4XX,可是你能够在reponse data中返回异常错误码(这个错误码是业务错误的错误码),这个时候能够和前端约定好这个业务错误码表明什么意思,就能够给用户相应的提示了。
public class BaseResponse<T> {
// 业务异常码
private int code;
// 说明信息
private String msg;
// 须要封装返回的数据
private T data;
}
复制代码
好比对于GET /api/users/1
,这样的请求返回的数据就放在data这个字段当中。
{
"code":200,
"msg":"SUCCESS",
"data": {
"id":1095,
"name":"张三"
}
}
复制代码
而对于请求失败的错误(http status code是4XX),则是会返回下面的数据
{
"code": 10030,
"msg": "id不存在"
}
复制代码
@ResponseStatus(HttpStatus.CREATED)
public BaseResponse addUser(UserParam userParam) {
return service.addUser(userParam);
}
复制代码
能够直接经过ResponseStatus
注解来指定返回的错误码是多少。固然上面说的是正常状况,那些参数失败校验失败或者是其余业务异常致使的状况如何处理呢?
有两种办法,第一种是经过Spring的 ResponseEntity 这个类来完成
public ResponseEntity<BaseResponse> addUser(UserParam userParam) {
if(validate(userParam)) {
return service.addUser(userParam);
}
return new ResponseEntity<>(ResponseUtil.fail(STATUS_INVALID_PARAM), HttpStatus.NOT_FOUND);
}
复制代码
第二种方式是借助全局异常处理,若是在service中发现客户端传递过来的参数存在问题,能够经过抛出异常,而后在全局异常拦截器中进行统一处理
@RestControllerAdvice
public class WebExceptionConfig {
@ExceptionHandler(InvalidParamException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public BaseResponse handleInvalidParamException(InvalidParamException e) {
return ResponseUtil.fail(STATUS_INVALID_PARAM, e.getMessage());
}
}
复制代码
若是以为我写的还行的话,请给我个点赞、关注、分享呀,对我是很大的激励呀。
公众号 think123,能够第一时间阅读哟。