4.SpringBoot建立API介面並接收處理引數
注意:由於內容有點多,在看本文章前,一定要按照下面選單中的教程,一步一步來
選單
在第二篇部落格中,講了如何建立一個API介面,接下來我們要給這個API介面加上引數,處理後返回處理過的資料,同時還會講如何優雅的對入參進行校驗
1.開啟TestController類,修改test方法
@Controller @RequestMapping("/api") public class TestController { @ResponseBody @RequestMapping("/test") public String test(@RequestParam String name) { return name; } }
其中@RequestParam註解表示請求引數,如果有多個引數,需要每個引數都新增@RequestParam註解
2.執行測試
執行後,在瀏覽器中輸入以下地址
http://localhost:8080/api/test?name=456
這時,可以看見在地址上傳的引數name此時已經顯示出來了
3.多個引數請求
@Controller @RequestMapping("/api") public class TestController { @ResponseBody @RequestMapping("/test") public String test(@RequestParam String name,@RequestParam String sex) { return "姓名="+name+" 性別="+sex; } }
執行後效果如下:
4.強制請求型別
修改程式碼如下
@Controller @RequestMapping("/api") public class TestController { @ResponseBody @RequestMapping(value = "/test",method = RequestMethod.POST) public String test(@RequestParam String name,@RequestParam String sex) { return "姓名="+name+" 性別="+sex; } }
此時如果使用GET請求,將會報錯
這時我們建立一個index.html檔案,檔案內容如下
<html>
<body>
<form action="http://localhost:8080/api/test" method="post">
<input type="text" name="name" value="張三"></input></br>
<input type="text" name="sex" value="男"></input></br>
<button type="submit">提交</button></br>
</body>
</html>
雙擊執行index.html後使用瀏覽器開啟執行,可以看到效果如下,此時已經執行成功
5.在post方法中提交json資料
建立一個新的包rto,此包名為什麼叫rto呢?rto既request transfer object,中文為請求傳輸物件,在rto中封裝統一引數,便於多引數處理
1.在rto下新建TestRTO類
@Data
public class TestRTO {
private String name;
private String sex;
}
注意此處的@Data註解,它也是lombok的一份子,主要作用是在編譯時自動生成get,set方法,所以此類中不需要我們手動寫get set方法,減少我們的工作量,非常方便,強烈推薦
此刻目錄結構如下所示
2.修改TestController程式碼如下
@Controller
@RequestMapping("/api")
public class TestController {
@ResponseBody
@RequestMapping(value = "/test",method = RequestMethod.POST)
public TestRTO test(@RequestBody TestRTO test) {
return test;
}
}
注意test方法上的註解,此時註解換成了@RequestBody,並且返回引數已經替換為TestRTO,在test方法中傳遞的實體物件在spring中預設入參的型別為json格式,出參也是json物件
3.在resources > static資料夾下新建index.html,並下載jquery.min.js庫放入此目錄,index.html內容如下
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<button onclick='test()'>提交</button></br>
<div id="tip"></div>
<script src="jquery.min.js"></script>
<script>
function test(){
$.ajax({
url: 'http://localhost:8080/api/test',
type: "post",
contentType: 'application/json;charset=utf-8',
dataType: 'json',
data: JSON.stringify({
name: '張三',
sex: '男'
}),
success: function (data) {
$("#tip").html("姓名="+data.name+" 性別="+data.sex);
},
error: function () {
$("#tip").html("請求失敗!");
}
});
}
</script>
</body>
</html>
6.執行測試
7.引數驗證
1.修改TestRTO
@Data
public class TestRTO {
@NotEmpty(message = "姓名不能為空")
private String name;
@NotEmpty(message = "性別不能為空")
private String sex;
}
對需要校驗的引數新增檢驗規則,NotEmpty意思正如字面所說“不為空”,註解引數message則是校驗規則不滿足時需要提示的異常資訊,同類的校驗規則還有很多,具體的請看javax.validation.constraints包下註解
2.修改TestController,新增@Valid註解對引數進行校驗
@Controller
@RequestMapping("/api")
public class TestController {
@ResponseBody
@RequestMapping(value = "/test",method = RequestMethod.POST)
public TestRTO test(@RequestBody @Valid TestRTO test) {
return test;
}
}
3.新增全域性異常處理類
/**
* 全域性異常處理
* Created by cc_want on 2018/6/2.
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.EXPECTATION_FAILED)
public String exceptionHandler(Exception ex) throws IOException {
if (ex instanceof MethodArgumentNotValidException) {
BindingResult result = ((MethodArgumentNotValidException) ex).getBindingResult();
if (result.hasErrors()) {
StringBuffer sb = new StringBuffer();
printBindException(sb, result);
return sb.toString();
}
}
return "";
}
public static void printBindException(StringBuffer message, BindingResult result) {
List<ObjectError> allErrors = result.getAllErrors();
for (int i = 0; i < allErrors.size(); i++) {
message.append(allErrors.get(i).getDefaultMessage());
if (allErrors.size() > 1 && i < allErrors.size() - 1) {
message.append("<br/>");
}
}
}
}
如果引數驗證失敗則觸發MethodArgumentNotValidException異常,這時我們需要從該異常類中提取到異常資訊,並做適當處理返回
4.修改index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="name" type="text" value="張三"/></br>
<input id="sex" type="text" value="男"/></br>
<button onclick='test()'>提交</button></br>
<div id="tip"></div>
<script src="jquery.min.js"></script>
<script>
function test(){
var name = $("#name").val();
var sex = $("#sex").val();
$.ajax({
url: 'http://localhost:8080/api/test',
type: "post",
contentType: 'application/json;charset=utf-8',
dataType: 'json',
data: JSON.stringify({
name: name,
sex: sex
}),
success: function (data) {
$("#tip").html("姓名="+data.name+" 性別="+data.sex);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#tip").html(XMLHttpRequest.responseText);
}
});
}
</script>
</body>
</html>
5.執行效果如下
-----------------------------------------------