一、请求响应概述
- 基本概念:在 JavaWeb 中,请求(Request)是客户端(如浏览器)向服务器发送的获取数据或服务的操作;响应(Response)是服务器对客户端请求的回应。
二、使用 postman 工具进行请求
- 简介:一款强大的 API 测试工具,可用于模拟发送各种 HTTP 请求,方便开发者调试和测试 Web 服务。
- 使用方法:安装 postman 后,可设置请求方法(如 GET、POST 等)、URL、请求头、请求参数等,然后发送请求查看服务器的响应结果,帮助理解请求响应的实际交互过程。
三、请求
1.简单参数
-
GET请求:参数在URL中以
?param1=value1¶m2=value2
的形式传递。在Servlet中可以使用request.getParameter("param1")
获取参数值。在Spring Boot中,可以直接通过方法参数接收简单参数,形参名与请求参数名一致时无需额外注解。如果需要指定参数名或设置默认值等,则可以使用@RequestParam
注解。例如:java复制
@GetMapping("/greet") public String greet(@RequestParam(defaultValue = "Guest") String name) { return "Hello, " + name; }
-
POST请求:如果是表单提交,也可以通过相同的方式获取参数。例如:
@PostMapping("/postHello1") public String postHello1(@RequestParam("name") String name, @RequestParam("age") Integer age) { return "name:" + name + "\nage:" + age; }
2.实体参数
-
概念:当请求需要传递复杂的数据结构时,通常将这些数据封装成实体对象。例如,用户注册请求可能需要传递用户名、密码、年龄等信息,这些信息可以封装在User实体类中。
-
处理方式:服务器端需要定义对应的实体类,然后通过Spring Boot提供的自动类型转换机制,将请求中的数据映射到实体对象中。例如:
@PostMapping("/user") public String createUser(@RequestBody User user) { return "Created user: " + user.getName(); }
请求参数名与实体类属性名保持一致。如果传递的JSON数据是一个数组,也可以直接接收为数组或集合类型。例如:
@PostMapping("/helloList") public String helloList(@RequestBody List<User> users) { String result = ""; for (User user : users) { result += user.getName() + " " + user.getAge() + "\n"; } return result; }
3.数组集合参数
-
数组参数
-
传递方式:在URL中通过重复参数名来传递,例如
?ids=1&ids=2&ids=3
;或者在请求体中以JSON数组格式传递。 -
服务器端处理:使用数组接收多个请求参数。例如:
@GetMapping("/users") public String getUsers(Integer[] ids) { return "User IDs: " + Arrays.toString(ids); }
-
-
集合参数
-
与数组的区别:集合参数相比数组更加灵活,可用于传递不同类型的对象集合。例如,订单详情请求可能包含多个商品信息的集合,每个商品信息又是一个包含商品ID、名称、价格等属性的对象。
-
处理方法:通常需要借助JSON解析库将请求体中的JSON格式的集合数据解析为Java中的集合对象(如List、Set等),然后进行业务逻辑处理。例如:
-
@PostMapping("/postHello4") public String postHello4(@RequestParam List<User> users) { String result = ""; for (User user : users) { result += user.getName() + " " + user.getAge() + "\n"; } return result; }
-
4.日期参数
-
传递问题:日期数据在传输过程中需要注意格式问题,因为不同地区和系统可能对日期格式的理解和处理方式不同。
-
解决方案:客户端发送请求时,确保日期参数按照服务器端能够识别的格式进行传递。服务器端接收日期参数后,可能需要进行格式校验和转换,将其转换为Java中的Date对象或其他日期相关的类(如LocalDate、LocalDateTime等)进行处理。可以使用
@DateTimeFormat
注解来自定义日期格式。例如:@GetMapping("/date") public String handleDate(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { return "Date: " + date;
5.路径参数
-
概念:将参数值嵌入到URL的路径部分,例如
/user/123
,其中123就是路径参数,表示用户的ID。这种方式在RESTful风格的API设计中较为常见,能够使URL更加简洁和语义化。 -
服务器端处理:在Spring Boot中,可以通过在方法参数上添加
@PathVariable
注解来获取路径参数值。例如:java复制
@GetMapping("/user/{id}") public String getUser(@PathVariable Long id) { return "User ID: " + id; }
@PathVariable
注解中的名称应与URL路径中的变量名保持一致。
四、响应
一、@RestController 注解
注解概述
- @RestController是 Spring MVC 框架中的一个组合注解,它等效于同时使用@Controller和@ResponseBody注解。其主要作用是简化开发,让开发者能更便捷地构建出直接返回数据而非视图页面的控制器。
@Controller 注解详解
- @Controller用于标识一个类是 Spring MVC 中的控制器,负责接收客户端请求,并将请求映射到相应的处理方法上。例如:
- 在上述代码中,@Controller把MyController类标记为控制器,@RequestMapping("/hello")将hello方法映射到/hello这个 URL 路径,当客户端访问/hello时,hello方法被调用。通常,若没有@ResponseBody配合,方法返回值会被视图解析器当作视图页面的名称,去查找对应的模板文件(如 JSP、Thymeleaf 等)进行渲染,最终返回给客户端的是渲染后的页面。
@Controller public class MyController { @RequestMapping("/hello") public String hello() { return "hello"; } }
@ResponseBody 注解详解
- @ResponseBody的关键功能是将方法的返回值直接作为 HTTP 响应的内容返回给客户端,跳过视图解析步骤。例如:
- 这里,getUser方法返回一个User实体对象,由于加了@ResponseBody,Spring MVC 默认使用 Jackson(若配置正常)等工具将User对象转换为 JSON 格式,直接作为 HTTP 响应体内容发送给客户端,客户端收到的就是数据,而非指向某个视图的指令。
@Controller public class MyController { @RequestMapping("/getUser") @ResponseBody public User getUser() { User user = new User(); user.setName("张三"); user.setAge(20); return user; } }
@RestController 的优势
- 代码简洁性:避免在每个处理方法上都单独写@ResponseBody,使控制器类代码更加紧凑、易读。例如,若一个控制器中有多个返回数据的方法,使用@RestController后,代码量明显减少。
- 语义明确性:清晰表明该控制器类的所有方法都专注于返回数据,让开发者一眼就能判断其用途,利于团队协作与代码维护。