关于后端:基础篇SpringBoot-HTTP接口实战

6次阅读

共计 6200 个字符,预计需要花费 16 分钟才能阅读完成。

一、相干注解阐明

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;
    }

申请测试后果:

正文完
 0