post与get
- 安全方面:post不显示在地址栏里,get显示在地址栏里
- get请求(由于地址栏)对参数有长度限制,post无
post请求的三种参数形式:
- x-www-form-urlencoded:传统浏览器表单提交,自己写的代码很少,是浏览器自动处理(jQuery)
- FormData:表单中携带文件上传
- application / json:传json格式数据(Vue)(由于欠他axios的post请求传对象默认是json格式,所以后台采用json接收)
后端传数据:springMVC,springMVC是如何对待三种请求的?
- 使用散列的参数列表声明:Integer id,String name,或者Product product使用对象接收
- formdata:MultpartFile
- Json:@RequestBody Product product
后端使用什么取决于前端使用什么技术。
PostMan选择:
- x-www-form-urlencoded:x-www-form-urlencoded
- FormData:form-data
- application / json:raw
数据校验
-
前端校验:使用js对输入框里的内容进行校验,校验通过表单提交,不通过提示并且阻止提交。
-
后端校验:在controller中校验数据格式:
有前端校验为什么还需要后端校验?
- 后端校验:安全性需要,例如使用net包里的socket包就可以获得数据。(网络安全)抓包:前端发数据是不安全的。前端不能调时间,传了也不能用,这是不真实的。
jsr303校验:
校验标准,对对象中的数据进行校验
hibernate框架实现过这个标准校验
springMVC整合了hibernate的校验方式
校验结果:
封装到一个数据中交给用户自己去处理BinndingResult
校验方法:
public class ProductForm {
private Integer id;
@NotNull(message = "类别id不能为空")
private Integer categoryId;
@NotBlank(message = "商品名不能为空")
private String name;
@NotBlank(message = "简介不能为空")
private String subtitle;
@NotBlank(message = "主图地址不能为空")
private String mainImage;
@NotBlank(message = "详情图不能为空")
private String subImages;
@NotBlank(message = "详情不能为空")
private String detail;
@NotNull(message = "加价格不能为空")
@Min(value = 0,message = "价格不能小于0")
private BigDecimal price;
@NotNull(message = "库存不能为空")
@Min(value = 0,message = "库存不能小于0")
private Integer stock;
@NotNull(message = "状态不能为空")
private Integer status;
public ProductForm(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubtitle() {
return subtitle;
}
public void setSubtitle(String subtitle) {
this.subtitle = subtitle;
}
public String getMainImage() {
return mainImage;
}
public void setMainImage(String mainImage) {
this.mainImage = mainImage;
}
public String getSubImages() {
return subImages;
}
public void setSubImages(String subImages) {
this.subImages = subImages;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "ProductForm{" +
"id=" + id +
", categoryId=" + categoryId +
", name='" + name + '\'' +
", subtitle='" + subtitle + '\'' +
", mainImage='" + mainImage + '\'' +
", subImages='" + subImages + '\'' +
", detail='" + detail + '\'' +
", price=" + price +
", stock=" + stock +
", status=" + status +
'}';
}
}
对于VO对象中的data,规定当data不为空(null)时才显示:
@JsonInclude(JsonInclude.Include.NON_NULL)
VO对象的code
一般默认0为请求正确,其他为错误
例如:HTTP状态码
code值 | 含义 |
---|---|
1** | |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
idea TODO
具有TODO视图
用枚举来处理数据异常
- 定义数据异常枚举类ResultException:
package com.neutech.enumeration;
public enum ResultExceptionEnum {
FORMAT_EXCEPTION(1001,"数据格式异常"),
DATA_NON_EXISTS(1002,"数据格式不存在");
private Integer code;
private String message;
ResultExceptionEnum(Integer code,String message){
this.code=code;
this.message=message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
- 在代码中使用枚举类的code:其中:
- BindingResult:异常数组,将所有@Valid返回的异常整理为一个数据
- getDefaultMessage():返回form类中默认返回的message,form类见上面数据校验中的ProductForm
@PostMapping("/addProduct")
public ResultVO addProduct(@RequestBody@Valid ProductForm productForm, BindingResult bindingResult){
if (bindingResult.getErrorCount()>0){
// return ResultVO.error(ResultExceptionEnum.FORMAT_EXCEPTION.getCode(),ResultExceptionEnum.FORMAT_EXCEPTION.getMessage());
return ResultVO.error(ResultExceptionEnum.FORMAT_EXCEPTION.getCode(),bindingResult.getAllErrors().get(0).getDefaultMessage());
}
return productService.addProduct(productForm);
}