1. 程式人生 > >4.SpringBoot建立API介面並接收處理引數

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.執行效果如下

-----------------------------------------------

原始碼下載