0.前言
不同的人维护同一套代码,不同的代码习惯都能实现最后的功能,但是写法不一样。这篇文章总结一下在controller层常见的接口的一些写法。
1.get与@RequestMapping
用的比较多的是get。
最简单的写法:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/list") public String list() { return "sucess find all users"; } @RequestMapping("/find") public String find() { return "find one"; } }这是比较基础的写法:
我们可以通过ip+端口+[项目名]+/user/list 来返回所有学生的列表。比如:
localhost:8080/xxx/user/list。
同理,下方find方法也是可以使用的
可以通过localhost:8080/xxx/user/find来执行另一个功能。
但是我们上面的方法没有指定方式,我们给它指定GET请求。
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/list",method=RequestMethod.GET) public String list() { return "sucess find all users"; } @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find() { return "find one"; } }注:实际开发中,我们一般加上@ResponseBody,可理解为把 结果放入到HTTP response body 中(数据转换成json格式),便于前端处理数据。
2.get请求传参的几种方法
1.占位符
我们可以定义后台的接口配置占位符,通过配置的占位符来要求前端传递参数。
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find/{id}/{name}",method=RequestMethod.GET) @ResponseBody public String find(@PathVariable("id") String id, @PathVariable("name") String name) { return "find one"; } }RequestMapping中的value中有两个占位符,id和name,表示get请求中应该加入这两个参数的值,可以参考下面的写法来请求后台
localhost:8080/xxx/user/find/1001/zhangsan
2.RequestParam
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find(@RequestParam("id") String id, @RequestParam(value="name",required=true) String name, @RequestParam(value="age",required=false) String age) { return "find one"; } }像第一个id这种写法,get请求必须带这个参数。name这种写法,required为true,这种写法也必须带这个参数,而第三个age,可带可不带,那么下面两种写法都是对的。
localhost:8080/xxx/user/find?id=1001&name=zhangsan
localhost:8080/xxx/user/find?id=1001&name=zhangsan&age=11
你如果缺少了必填的参数,则会报错。
当然,对于RequestParam 还有更复杂更详细的用法,但是实际开发中用的不多,稍作了解。
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find((@RequestParam(defaultValue = "1",required = false,/*value = "ss",*/name = "iddddd") String id) { return "find one"; } }说明:
(1) @RequestParam,对于参数入参,这个注解可以不必须有,但只能匹配和你定义的入参,完全一样的名称,对应则匹配,不对应就不匹配。
(2)required ,是否必须,默认为 true,也就是说,当@RequestParam存在时,是默认required = true条件的,@RequestParam不存在时,返回 (1) 的解释。
(3)defaultValue ,设置初始值,一般和required = false一起使用,如果不传值,则使用默认值。
(4)value ,和name,一样,给变量起别名,一一对应于前端传的属性名,映射到后端接口变量名,有时前端无法按要求传给你你所希望的变量名,这个就发挥用处了。
(5)name ,和value一样,给变量起别名,两个同时存在时,访问时就会出错。
3.Param
个人用的最多,因为很方便,配合mybaits,需要的参数之间不传(就跟上面的required=false一样的效果)
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.GET) @ResponseBody public String find(@Param("id") String id, @Param("name") String name, @Param("age") String age) { return "find one"; } }这样写的好处就是不需要的参数不用写,需要什么就写什么,不传递的参数默认就是null,在mybatis中的if语句中直接加判断就可以,比较方便。
3.POST请求的几种写法
post请求的几种写法跟上面类似,只不过我们一般要加上@RequestBody。
比如下面这样
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody Student student) { return "find one"; } }请求参数里加入了RequestBody。那么你前端请求的时候就要构造一个和Student这个实体类一模一样的对象(字段名称必须一一对应,前台给的参数可以少不可以多)
注:实际开发中的增删改查用的非常多,你不用没考虑筛选哪些条件,直接从前台把对象映射到后台的实体类中,由mybaits判断筛选哪些字段,十分好用。像若以那种代码生成器就是这种方式。
当然,觉得实体类麻烦怎么办,我们可以用JSONObject啊。
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody JOSNObject student) { return "find one"; } }这样就可以按照自己喜好随意添加删除字段了。
除此之外,你还可以这么写:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/find",method=RequestMethod.POST) @ResponseBody public String find(@RequestBody JOSNObject student, @Param("id") String id ) { return "find one"; } }也就是你在post请求的时候可以在URL中加参数,而且这个参数可有可无,那么你的请求可以这么写
let url= localhost:8080/xxx/user/find?id=1001
this.http.post(url,{data})
url中加了参数,data是post的内容,由后台的RequestBody接收。
当然,用的不多,一般在接口需要加参数的时候才会这么干,如果一开始设计的好话一般就不这么写了。