如何定义规范http接口:
先来查看Controller:
package com.song.lamborghini.controller;
import com.alibaba.fastjson.JSONObject;
import com.song.lamborghini.vo.err.err.BizException;
import com.song.lamborghini.vo.reponse.UploadUserResponse;
import com.song.lamborghini.vo.request.UploadUserRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@RestController
@RequestMapping(value = "/api")
public class InterfaceController {
@PostMapping("/pbase/userupload")
public Object userUpload(@RequestBody List<UploadUserRequest> uploadUserRequestList){
try {
if(uploadUserRequestList.size()>100) return UploadUserResponse.errorMessage("长度超过100");
for(UploadUserRequest uploadUserRequest:uploadUserRequestList) {
if (StringUtils.isEmpty(uploadUserRequest.getCode())) {
throw new BizException("员工编码不能为空");
}
if (StringUtils.isEmpty(uploadUserRequest.getName())) {
throw new BizException("员工姓名不能为空");
}
if (StringUtils.isEmpty(uploadUserRequest.getUserType())) {
throw new BizException("员工类型不能为空");
}
String regex = "^(12|13|14|15|16|17|18|19)[0-9]{9}$";
if (!StringUtils.isEmpty(uploadUserRequest.getMobileNo())) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(uploadUserRequest.getMobileNo());
boolean isMatch = m.matches();
if (!isMatch) {
throw new BizException("姓名:"+uploadUserRequest.getName()+",手机号" + uploadUserRequest.getMobileNo() + "是错误格式!!!");
}
}
}
return UploadUserResponse.okMessage();
}catch (BizException e){
log.error("出现异常:{}",e.toString(),e);
return UploadUserResponse.errorMessage(e.getMessage());
}catch (Exception e){
log.error("出现异常:{}",e.toString(),e);
return UploadUserResponse.errorMessage();
}
}
}
这里验证不规范性:
可以把所有接口的验证通过AOP来进行校验,在Request请求类中,通过@NotNull等注解来进行参数化必填和格式检验
package com.song.lamborghini.vo.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class UploadUserRequest {
/**
* Code : U0001
* Name : 刘力
* UserType : 门店用户
* RoleName : 门店管理员
* ShopJobType : 店长
* MobileNo : 13888888888
* ShopCode : HQS0001
* PqCode : PQ100
* GpCode : DQ100
* MyPqCodes : PQ001,PQ001
* MyGpCodes : DQ001,DQ002
*/
@NotBlank(message="编号不能为空")
@JsonProperty("Code")
private String Code;
@JsonProperty("Name")
private String Name;
@JsonProperty("UserType")
private String UserType;
@JsonProperty("RoleName")
private String RoleName;
@JsonProperty("ShopJobType")
private String ShopJobType;
@JsonProperty("MobileNo")
private String MobileNo;
@JsonProperty("ShopCode")
private String ShopCode;
@JsonProperty("PqCode")
private String PqCode;
@JsonProperty("GpCode")
private String GpCode;
@JsonProperty("MyPqCodes")
private String MyPqCodes;
@JsonProperty("MyGpCodes")
private String MyGpCodes;
}
ps: 可以在Controller方法里面 添加@Validated
注解
public Object userUpload(@RequestBody @Validated List<UploadUserRequest> uploadUserRequestList)
在Controller切面定义个:
@ControllerAdvice
@Slf4j
public class ControllerExceptionHandler {
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public 自己返回基类 handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
StringBuilder sb = new StringBuilder("参数校验失败:");
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(", ");
}
return 自己返回基类.errorMessage(sb.toString());
}
@ExceptionHandler({Exception.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public 自己返回基类 handleException(Exception ex) {
log.error("出现系统异常:{}",ex.toString(),ex);
return 自己返回基类.errorMessage("系统异常,请稍候重试!");
}
@ExceptionHandler({BizException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public 自己返回基类 bizException(自定义业务异常 ex) {
log.error("出现系统业务异常:{}",ex.toString(),ex);
return new 自己返回基类(ex);
}
}
package com.song.lamborghini.vo.reponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class UploadUserResponse {
/**
* Status : true
* StatusCode : 200
* Msg : 成功
* Timestamp : 20150622093101
* Sign : 6ECC9BF07C69E80F6D8552FF7B2E7A8FCA2CC80E
* Result : 见业务返回结果示例
*/
private Boolean Status;
private Integer StatusCode;
private String Msg;
private String Timestamp;
private String Sign;
private String Result;
public static UploadUserResponse okMessage(){
//调用统一参数遍历然后加签名
//String sign = Utils.addParamSign(Object);
return UploadUserResponse.builder().Status(true).StatusCode(200).Msg("成功").Timestamp("20150622093101")
.Sign(sign)
.Result("见业务返回结果示例").build();
}
public static UploadUserResponse errorMessage(){
return UploadUserResponse.builder().Status(false).StatusCode(999).Msg("失败").Timestamp("20150622093101")
.Sign("6ECC9BF07C69E80F6D8552FF7B2E7A8FCA2CC80E")
.Result("见业务返回结果示例").build();
}
public static UploadUserResponse errorMessage(String errorMessage){
return UploadUserResponse.builder().Status(false).StatusCode(999).Msg("失败:"+errorMessage).Timestamp("20150622093101")
.Sign("6ECC9BF07C69E80F6D8552FF7B2E7A8FCA2CC80E")
.Result("见业务返回结果示例").build();
}
}
加返回参数签名,应该是在统一返回参数里面去加。