在第二篇博客中,讲了如何创建一个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.运行效果如下