03-接口请求体类型
...大约 3 分钟Java
一、Content-Type类型
Content-Type
请求头:作用:
Content-Type
请求头告诉服务器请求体的数据格式。例如,它可以指示请求体是 JSON、XML、表单数据等。常见的
Content-Type
值:
application/json
:表示请求体是 JSON 格式。application/xml
:表示请求体是 XML 格式。application/x-www-form-urlencoded
:表示请求体是表单数据,键值对格式。multipart/form-data
:表示请求体是多部分表单数据,通常用于文件上传。
要判断应该使用 Content-Type: application/json
还是 Content-Type: application/x-www-form-urlencoded
,需要看Spring Boot 控制器方法是如何定义的。
1、使用 application/x-www-form-urlencoded
当 SubscriptionPlanController
中的 createPlan
方法使用了 @RequestParam
注解,这意味着它期望的是表单参数(application/x-www-form-urlencoded
),而不是 JSON 格式的请求体。
@PostMapping("/createPlan")
public SubscriptionPlan createPlan(@RequestParam String description, @RequestParam String name, @RequestParam Double price) {
return subscriptionPlanService.createSubscriptionPlan(description, name, price);
}
如果想保持现有的控制器方法定义不变,那么你应该使用 application/x-www-form-urlencoded
:
POST http://localhost:8080/api/subscriptionplan/createPlan
Content-Type: application/x-www-form-urlencoded
description=Unlimited monthly&name=month&price=19.8
2、使用 application/json
如果想使用 JSON 格式的请求体,那么需要修改控制器方法,使其接受 @RequestBody
注解的参数:
import org.springframework.web.bind.annotation.RequestBody;
@PostMapping("/createPlan")
public SubscriptionPlan createPlan(@RequestBody SubscriptionPlanRequest request) {
return subscriptionPlanService.createSubscriptionPlan(request.getDescription(), request.getName(), request.getPrice());
}
public static class SubscriptionPlanRequest {
private String description;
private String name;
private Double price;
// Getters and Setters
}
然后可以使用 application/json
进行测试:
POST http://localhost:8080/api/subscriptionplan/createPlan
Content-Type: application/json
{
"description": "Unlimited monthly",
"name": "month",
"price": 19.8
}
3、总结
application/x-www-form-urlencoded
:适用于当前控制器方法定义,使用@RequestParam
注解。application/json
:需要修改控制器方法,使用@RequestBody
注解。
二、@RequestBody和@RequestParam
在 Spring MVC 中,选择使用 @RequestBody
还是 @RequestParam
取决于希望如何接收和处理客户端发送的数据。以下是一些指导原则:
1、使用 @RequestBody
- JSON 或 XML 数据:当客户端发送 JSON 或 XML 格式的数据时,使用
@RequestBody
。Spring 会自动将请求体反序列化为 Java 对象。 - 复杂对象:当你需要接收一个复杂的对象(包含多个字段)时,使用
@RequestBody
更加方便和直观。 - RESTful API:在设计 RESTful API 时,通常使用
@RequestBody
来接收请求体中的数据。
示例:
import org.springframework.web.bind.annotation.RequestBody;
@PostMapping("/createPlan")
public SubscriptionPlan createPlan(@RequestBody SubscriptionPlanRequest request) {
return subscriptionPlanService.createSubscriptionPlan(request.getDescription(), request.getName(), request.getPrice());
}
public static class SubscriptionPlanRequest {
private String description;
private String name;
private Double price;
// Getters and Setters
}
对应的 HTTP 请求:
POST http://localhost:8080/api/subscriptionplan/createPlan
Content-Type: application/json
{
"description": "Unlimited monthly",
"name": "month",
"price": 19.8
}
2、使用 @RequestParam
- 简单参数:当只需要接收简单的参数(如字符串、数字等)时,使用
@RequestParam
。这些参数通常在 URL 查询字符串或表单数据中传递。 - 表单提交:当处理传统的表单提交时,使用
@RequestParam
来接收表单字段。 - 单个或少量参数:当你只需要接收少量参数时,使用
@RequestParam
更加简洁。
示例:
@PostMapping("/createPlan")
public SubscriptionPlan createPlan(@RequestParam String description, @RequestParam String name, @RequestParam Double price) {
return subscriptionPlanService.createSubscriptionPlan(description, name, price);
}
对应的 HTTP 请求:
POST http://localhost:8080/api/subscriptionplan/createPlan
Content-Type: application/x-www-form-urlencoded
description=Unlimited monthly&name=month&price=19.8
3、选择依据
(1)数据格式:
- 如果客户端发送 JSON 或 XML 数据,使用
@RequestBody
。 - 如果客户端发送表单数据或 URL 查询参数,使用
@RequestParam
。
(2)数据复杂度:
- 如果需要接收复杂对象或嵌套结构,使用
@RequestBody
。 - 如果只需要接收简单的键值对,使用
@RequestParam
。
(3)API 设计:
- 在 RESTful API 设计中,通常使用
@RequestBody
来接收请求体中的数据。 - 在传统的 Web 应用中,处理表单提交时,使用
@RequestParam
。
4、总结
@RequestBody
:用于接收请求体中的 JSON 或 XML 数据,并将其反序列化为 Java 对象。@RequestParam
:用于接收 URL 查询参数或表单数据,并将其映射为方法参数。
Powered by Waline v3.2.0