http get post 參數校驗


spring boot 常見http get ,post請求參數處理

  
 在定義一個Rest接口時通常會利用GET、POST、PUT、DELETE來實現數據的增刪改查;這幾種方式有的需要傳遞參數,后台開發人員必須對接收到的參數進行參數驗證來確保程序的健壯性 
GET 
一般用於查詢數據,采用明文進行傳輸,一般用來獲取一些無關用戶信息的數據 
POST 
一般用於插入數據 
PUT 
一般用於數據更新 
DELETE 
一般用於數據刪除 
一般都是進行邏輯刪除(即:僅僅改變記錄的狀態,而並非真正的刪除數據)

@PathVaribale 獲取url中的數據 
@RequestParam 獲取請求參數的值 
@GetMapping 組合注解,是 @RequestMapping(method = RequestMethod.GET) 的縮寫 
@RequestBody 利用一個對象去獲取前端傳過來的數據

PathVaribale 獲取url路徑的數據

請求URL: 
localhost:8080/hello/id 獲取id值

實現代碼如下:

@RestController
public class HelloController { @RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET) public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){ return "id:"+id+" name:"+name; } }

在瀏覽器中 輸入地址: 
localhost:8080/hello/100/hello

輸出: 
id:81name:hello

RequestParam 獲取請求參數的值

獲取url參數值,默認方式,需要方法參數名稱和url參數保持一致 
localhost:8080/hello?id=1000

@RestController
public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id){ return "id:"+id; } }

輸出: 
id:100

url中有多個參數時,如: 
localhost:8080/hello?id=98&&name=helloworld 
具體代碼如下:

@RestController
public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id,@RequestParam String name){ return "id:"+id+ " name:"+name; } }

獲取url參數值,執行參數名稱方式 
localhost:8080/hello?userId=1000

@RestController
public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam("userId") Integer id){ return "id:"+id; } }

輸出: 
id:100

注意

不輸入id的具體值,此時返回的結果為null。具體測試結果如下: 
id:null 
不輸入id參數,則會報如下錯誤: 
whitelable Error Page錯誤

GET參數校驗

用法:不輸入id時,使用默認值 
具體代碼如下: 
localhost:8080/hello

@RestController
public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) //required=false 表示url中可以無id參數,此時就使用默認參數 public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){ return "id:"+id; } }

輸出 
id:1

POST JSON參數校驗

常用校驗注解

這里寫圖片描述

注意: 
接收到的參數默認都是字符串類型的 
有的注解只能用在String類型的屬性上

@JsonProperty可以實現前端的屬性名和后台實體類的屬性名不一致問題

校驗方式: 
使用@RequestBody @Valid 對JSON參數進行獲取和校驗。 
通過BindingResult bindingResult 去獲取校驗結果。

BindingResult 源碼:

這里寫圖片描述

技巧01:利用BindingResult對象的hasErrors方法判斷是否有參數錯誤 
技巧02:利用BindingResult對象的getFieldErrors方法獲取所有有參數錯誤的屬性 
技巧03:利用錯誤屬性對象的getDefaultMessage去獲取錯誤提示信息

@RequestMapping(value = "/demo5",produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String test5(@RequestBody @Valid User user , BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> objectErrors = bindingResult.getAllErrors(); System.out.println(objectErrors.toString()); for(ObjectError objectError: objectErrors){ System.out.println("objectError = " + objectError.getObjectName()); System.out.println("objectError = " + objectError.getDefaultMessage()); System.out.println("objectError = " + objectError.getCode()); System.out.println("objectError = " + objectError.getArguments()); } } String str = user.toString(); return str; }

對應User實體類代碼:


public class User { @NotEmpty(message = "ID不能為空") @NotBlank(message = "ID不能為空喲") private String id; @Min(value = 18) @Max(value = 30) private Integer age; @NotEmpty(message = "昵稱不能為空") @NotBlank(message = "昵稱不能為空喲") @JsonProperty("nickname") // 當前端屬性為nick后台接收對象的屬性為nickName時可以用@JsonProperty來保持一致 private String name; ....省略get set方法

自定義注解校驗

1、定義一個校驗注解

代碼如下:

import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) @Constraint(validatedBy = MyFormValidatorClass.class) public @interface MyFormValidator { String value(); String message() default "name can be test"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

2、定義一個約束校驗


import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;

public class MyFormValidatorClass implements ConstraintValidator<MyFormValidator, Object>, Annotation { private String values; @Override public void initialize(MyFormValidator myFormValidator) { this.values = myFormValidator.value(); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { if("test".equals((String)value)){ return true; } return false; } @Override public Class<? extends Annotation> annotationType() { return null; } }

3、實體類中使用

public class User2 { @NotEmpty(message = "ID不能為空") @NotBlank(message = "ID不能為空喲") //自定義校驗注解-校驗id是否為test @MyFormValidator(value = "abc",message = "dd") private String id; @Min(value = 18) @Max(value = 30) private Integer age; @NotEmpty(message = "昵稱不能為空") @NotBlank(message = "昵稱不能為空喲") @JsonProperty("nickname") // 當前端屬性為nick后台接收對象的屬性為nickName時可以用@JsonProperty來保持一致

4、測試代碼:

@RequestMapping(value = "/demo6",produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String test6(@RequestBody @Valid User2 user , BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> objectErrors = bindingResult.getAllErrors(); System.out.println(objectErrors.toString()); for(ObjectError objectError: objectErrors){ System.out.println("objectError = " + objectError.getObjectName()); System.out.println("objectError = " + objectError.getDefaultMessage()); System.out.println("objectError = " + objectError.getCode()); System.out.println("objectError = " + objectError.getArguments()); } } String str = user.toString(); return str; }

當請求參數ID不為test,objectErrors 中有該報錯。

--------------------- 本文來自 混沌風YF 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/yunfeng482/article/details/79756233?utm_source=copy 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM