一、相干注解阐明
SpringBoot的Controller中常常会用到注解@Controller、@RestController、@RequestMapping、@RequestParam、@PathVariable、@RequestBody等。以下针对这些注解简略应用。
1、@Controller
用于定义控制器类,在spring我的项目中由控制器负责将用户发来的URL申请转发到对应的服务接口(service层),个别这个注解在类中,通常办法须要配合注解@RequestMapping。
@Controller@RequestMapping("/demo")public class HttpController { @RequestMapping(value = "/hello") public String sayHello() { System.out.println("hello world!"); return "hello"; }}
2、@RestController
用于定义控制器类,注解是@Controller和@ResponseBody的合集,示意这是个控制器bean,并且是将函数的返回值间接填入HTTP响应体中,是REST格调的控制器。
@RestController@RequestMapping("/demo")public class RestHttpController { @RequestMapping(value = "/rest") public Object rest() { Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am rest controller test"); resultMap.put("code","10000"); return resultMap; }}
申请返回:
{"msg":"i am rest controller test","code":"10000"}
3、@RequestMapping
作用于类或者办法上,用于映射URL门路,将http的申请地址映射到控制器(controller)类的解决办法上。
参数阐明:
- value:定义解决办法的申请的 URL 地址。(重点)
- method:定义解决办法的 http method 类型,如 GET、POST 等。(重点)
- params:定义申请的 URL 中必须蕴含的参数。或者不蕴含某些参数。(理解)
- headers:定义申请中 Request Headers 必须蕴含的参数。或者不蕴含某些参数。(理解)
衍生注解:
- GetMapping:等价于@RequestMapping(value = “hello”, method = RequestMethod.GET),接管Get申请办法的RequestMapping。
- PostMapping:等价于@RequestMapping(value = “hello”, method = RequestMethod.POST),接管POST申请办法的RequestMapping。
- DeleteMapping:等价于@RequestMapping(value = “hello”, method = RequestMethod.DELETE),接管DELETE申请办法的RequestMapping。
- PutMapping:等价于@RequestMapping(value = “hello”, method = RequestMethod.PUT),接管PUT申请办法的RequestMapping。
PatchMapping:等价于@RequestMapping(value = “hello”, method = RequestMethod.PATCH),接管PATCH申请办法的RequestMapping。
@RestController@RequestMapping("/demo")public class RestHttpController {@RequestMapping(value = "/rest")public Object rest() { Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am rest controller test"); resultMap.put("code","10000"); return resultMap;}@PostMapping("/post")public Object post(){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am post mapping test"); resultMap.put("code","10000"); return resultMap;}@GetMapping("/get")public Object get(){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am get mapping test"); resultMap.put("code","10000"); return resultMap;}@PutMapping("/put")public Object put(){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am put mapping test"); resultMap.put("code","10000"); return resultMap;}@DeleteMapping("/delete")public Object delete(){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am delete mapping test"); resultMap.put("code","10000"); return resultMap;}@PatchMapping("/patch")public Object patch(){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("msg","i am patch mapping test"); resultMap.put("code","10000"); return resultMap;}}
4、@RequestParam
作用于办法上,@RequestParam 注解配合 @RequestMapping 一起应用,能够将申请的参数同解决办法的参数绑定在一起。
@GetMapping("/test1") public Object requestParamTest(@RequestParam("data") String data){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("data","传入参数为:" + data); resultMap.put("code","10000"); return resultMap; }
curl http://127.0.0.1:8080/demo/test1?data=test_data{"code":"10000","data":"传入参数为:test_data"}
5、@RequestBody
作用于形参列表上,用于将前台发送过去固定格局的数据【xml 格局或者 json等】封装为对应的 JavaBean 对象,封装时应用到的一个对象是零碎默认配置的 HttpMessageConverter进行解析,而后封装到形参上。
@PostMapping("/test2") public Object requestBodyTest(@RequestBody UserDTO user){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("data","传入参数为:" + user); resultMap.put("code","10000"); return resultMap; }
curl http://127.0.0.1:8080/demo/test2 -X POST -d '{"username":"Trazen","address":"anhui"}' --header "Content-Type: application/json"{"code":"10000","data":"传入参数为:UserDTO{ id='ca56c077-33e7-4b9c-8ca6-72b01d931996' username='Trazen', address='anhui'}"}
6、@PathVariable
和RequestMapping配套应用,负责解析url申请中占位符参数({XXX})的值绑定到办法的形参中。
@GetMapping("/test3/{data}")public Object pathVariableTest(@PathVariable("data") String data){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("data","传入参数为:" + data); resultMap.put("code","10000"); return resultMap;}
curl http://127.0.0.1:8080/demo/test3/test_data{"code":"10000","data":"传入参数为:test_data"}
7、@ResponseBody
应用在管制层(controller)的办法上,将办法的返回值,以特定的格局写入到response的body区域,进而将数据返回给客户端。
当办法下面没有写ResponseBody,底层会将办法的返回值封装为ModelAndView对象。如果返回值是字符串,那么间接将字符串写到客户端;如果是一个对象,会将对象转化为json串,而后写到客户端。
二、HTTP接口申请实战
以GET申请为例,POST,PUT,DELETE相似。
1、PathVariable中获取字段
/** * 通过@PathVariable解析url申请中占位符参数({XXX})的值绑定到办法的形参中 * @param deptId * @param userId * @return */ @GetMapping("/{deptId}/{userId}") public Object queryUser(@PathVariable("deptId")String deptId, @PathVariable("userId")String userId){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("deptId",deptId); resultMap.put("userId",userId); return resultMap; }
申请测试后果:
2、params中获取参数
/** * params中获取参数 * @param pageSize * @param pageNo * @return */ @GetMapping(value = "/v1/page") public Object page1(int pageSize,int pageNo){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("pageSize",pageSize); resultMap.put("pageNo",pageNo); return resultMap; }
申请测试后果:
3、通过RequestParam参数设定获取
/** * 通过RequestParam参数设定获取 * RequestParam可设置默认值 * @param pageSize * @param pageNo * @return */ @GetMapping(value = "/v2/page") public Object page2(@RequestParam(defaultValue = "10",name="pageSize") int pageSize, @RequestParam(defaultValue = "0",name="pageNo") int pageNo){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("pageSize",pageSize); resultMap.put("pageNo",pageNo); return resultMap; }
申请测试后果:
设置默认值后,不传参会应用默认值。
4、通过RequestBody封装为对应的 JavaBean 对象传参
/** * 通过RequestBody封装为对应的 JavaBean 对象传参 * @param user * @return */ @GetMapping(value = "/saveUser") public Object saveUser(@RequestBody UserDTO user){ Map<String,Object> resultMap = new HashMap<>(8); user.setId(UUID.randomUUID().toString()); resultMap.put("user",user); return resultMap; }
申请测试后果:
5、header获取参数
/** * 从header获取参数 * @param accessToken * @param userId * @return */ @GetMapping(value = "/getHeader") public Object getHeader(@RequestHeader("accessToken") String accessToken,String userId){ Map<String,Object> resultMap = new HashMap<>(8); resultMap.put("accessToken",accessToken); resultMap.put("userId",userId); return resultMap; }
申请测试后果:
6、HttpServletRequest获取申请中的参数
/** * HttpServletRequest中获取 * @param request * @return */ @GetMapping(value ="/servletRequest") public Object testRequest(HttpServletRequest request){ Map<String,Object> resultMap = new HashMap<>(8); String userId = request.getParameter("userId"); resultMap.put("userId",userId); return resultMap; }
申请测试后果: