SpringBoot常見(jiàn)get/post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)詳解
spring boot 常見(jiàn)http get ,post請(qǐng)求參數(shù)處理
在定義一個(gè)Rest接口時(shí)通常會(huì)利用GET、POST、PUT、DELETE來(lái)實(shí)現(xiàn)數(shù)據(jù)的增刪改查;這幾種方式有的需要傳遞參數(shù),后臺(tái)開發(fā)人員必須對(duì)接收到的參數(shù)進(jìn)行參數(shù)驗(yàn)證來(lái)確保程序的健壯性
- GET
一般用于查詢數(shù)據(jù),采用明文進(jìn)行傳輸,一般用來(lái)獲取一些無(wú)關(guān)用戶信息的數(shù)據(jù) - POST
一般用于插入數(shù)據(jù) - PUT
一般用于數(shù)據(jù)更新 - DELETE
一般用于數(shù)據(jù)刪除
一般都是進(jìn)行邏輯刪除(即:僅僅改變記錄的狀態(tài),而并非真正的刪除數(shù)據(jù))
@PathVaribale 獲取url中的數(shù)據(jù)
@RequestParam 獲取請(qǐng)求參數(shù)的值
@GetMapping 組合注解,是 @RequestMapping(method = RequestMethod.GET) 的縮寫
@RequestBody 利用一個(gè)對(duì)象去獲取前端傳過(guò)來(lái)的數(shù)據(jù)
PathVaribale 獲取url路徑的數(shù)據(jù)
請(qǐng)求URL:
localhost:8080/hello/id 獲取id值
實(shí)現(xiàn)代碼如下:
@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 獲取請(qǐng)求參數(shù)的值
獲取url參數(shù)值,默認(rèn)方式,需要方法參數(shù)名稱和url參數(shù)保持一致
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中有多個(gè)參數(shù)時(shí),如:
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參數(shù)值,執(zhí)行參數(shù)名稱方式
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的具體值,此時(shí)返回的結(jié)果為null。具體測(cè)試結(jié)果如下:
id:null
不輸入id參數(shù),則會(huì)報(bào)如下錯(cuò)誤:
whitelable Error Page錯(cuò)誤
GET參數(shù)校驗(yàn)
用法:不輸入id時(shí),使用默認(rèn)值
具體代碼如下:
localhost:8080/hello
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) //required=false 表示url中可以無(wú)id參數(shù),此時(shí)就使用默認(rèn)參數(shù) public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){ return "id:"+id; } }
輸出
id:1
POST JSON參數(shù)校驗(yàn)
常用校驗(yàn)注解
注意:
接收到的參數(shù)默認(rèn)都是字符串類型的
有的注解只能用在String類型的屬性上
@JsonProperty可以實(shí)現(xiàn)前端的屬性名和后臺(tái)實(shí)體類的屬性名不一致問(wèn)題
校驗(yàn)方式:
使用@RequestBody @Valid 對(duì)JSON參數(shù)進(jìn)行獲取和校驗(yàn)。
通過(guò)BindingResult bindingResult 去獲取校驗(yàn)結(jié)果。
BindingResult 源碼:
技巧01:利用BindingResult對(duì)象的hasErrors方法判斷是否有參數(shù)錯(cuò)誤
技巧02:利用BindingResult對(duì)象的getFieldErrors方法獲取所有有參數(shù)錯(cuò)誤的屬性
技巧03:利用錯(cuò)誤屬性對(duì)象的getDefaultMessage去獲取錯(cuò)誤提示信息
@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; }
對(duì)應(yīng)User實(shí)體類代碼:
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") // 當(dāng)前端屬性為nick后臺(tái)接收對(duì)象的屬性為nickName時(shí)可以用@JsonProperty來(lái)保持一致 private String name; ....省略get set方法
自定義注解校驗(yàn)
1、定義一個(gè)校驗(yàn)注解
代碼如下:
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、定義一個(gè)約束校驗(yàn)
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、實(shí)體類中使用
public class User2 { @NotEmpty(message = "ID不能為空") @NotBlank(message = "ID不能為空喲") //自定義校驗(yàn)注解-校驗(yàn)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") // 當(dāng)前端屬性為nick后臺(tái)接收對(duì)象的屬性為nickName時(shí)可以用@JsonProperty來(lái)保持一致
4、測(cè)試代碼:
@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; }
當(dāng)請(qǐng)求參數(shù)ID不為test,objectErrors 中有該報(bào)錯(cuò)。
總結(jié)
到此這篇關(guān)于SpringBoot常見(jiàn)get/post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)詳解的文章就介紹到這了,更多相關(guān)springboot常見(jiàn)http get post請(qǐng)求參數(shù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring?boot常見(jiàn)get?、post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)、參數(shù)自定義注解校驗(yàn)問(wèn)題解析
- SpringBoot使用AOP與注解實(shí)現(xiàn)請(qǐng)求參數(shù)自動(dòng)填充流程詳解
- SpringBoot請(qǐng)求處理之常用參數(shù)注解介紹與源碼分析
- SpringBoot請(qǐng)求參數(shù)相關(guān)注解說(shuō)明小結(jié)
- SpringBoot 攔截器和自定義注解判斷請(qǐng)求是否合法
- SpringBoot http請(qǐng)求注解@RestController原理解析
- spring boot接收請(qǐng)求常用注解示例詳解
相關(guān)文章
Spring Boot集成Spring Cloud Security進(jìn)行安全增強(qiáng)的方法
Spring Cloud Security是Spring Security的擴(kuò)展,它提供了對(duì)Spring Cloud體系中的服務(wù)認(rèn)證和授權(quán)的支持,包括OAuth2、JWT等,這篇文章主要介紹了Spring Boot集成Spring Cloud Security進(jìn)行安全增強(qiáng),需要的朋友可以參考下2024-11-11SpringBoot自動(dòng)配置的實(shí)現(xiàn)原理
這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01IDEA下使用Spring Boot熱加載的實(shí)現(xiàn)
本文主要介紹了IDEA下使用Spring Boot熱加載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06springboot項(xiàng)目啟動(dòng)的時(shí)候,運(yùn)行main方法報(bào)錯(cuò)NoClassDefFoundError問(wèn)題
這篇文章主要介紹了springboot項(xiàng)目啟動(dòng)的時(shí)候,運(yùn)行main方法報(bào)錯(cuò)NoClassDefFoundError問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java如何用反射將一個(gè)對(duì)象復(fù)制給另一個(gè)對(duì)象
這篇文章主要介紹了java如何用反射將一個(gè)對(duì)象復(fù)制給另一個(gè)對(duì)象問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09利用HttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇利用HttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Java反轉(zhuǎn)鏈表測(cè)試過(guò)程介紹
這篇文章主要介紹了Java反轉(zhuǎn)鏈表測(cè)試過(guò)程,學(xué)習(xí)過(guò)數(shù)據(jù)結(jié)構(gòu)的小伙伴們,對(duì)鏈表想來(lái)是并不陌生。本篇文章將為大家介紹幾種在Java語(yǔ)言當(dāng)中,實(shí)現(xiàn)鏈表反轉(zhuǎn)的幾種方法,以下是具體內(nèi)容2023-04-04