注意:由于内容有点多,在看本文章前,一定要按照下面菜单中的教程,一步一步来
菜单
在第二篇博客中,讲了如何创建一个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.运行效果如下
-----------------------------------------------