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









猜你喜欢

转载自blog.csdn.net/cc_want/article/details/80550415
今日推荐