spring后端处理各种请求

在Spring MVC中处理JSON请求和返回JSON消息的步骤如下:

1. 添加依赖

确保项目中包含处理JSON的库,如Jackson。

Maven配置(pom.xml)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

Gradle配置(build.gradle)

implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'

2. 启用Spring MVC注解驱动

在Spring Boot中自动配置,非Boot项目需配置<mvc:annotation-driven>或使用Java配置类。

Java配置类示例

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // 自动注册消息转换器,包括Jackson
}

3. 创建实体类

定义用于接收和返回数据的Java对象。

public class User {
    private String name;
    private int age;
    
    // 必须有无参构造函数
    public User() {}
    
    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

4. 编写控制器处理JSON

使用@RestController@ResponseBody注解返回JSON,@RequestBody接收JSON数据。

示例控制器

@RestController // 组合了@Controller和@ResponseBody
@RequestMapping("/api/users")
public class UserController {

    // 处理POST请求,接收JSON并返回JSON
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // 模拟业务处理,如保存用户
        user.setName(user.getName() + "-processed");
        return ResponseEntity.ok(user); // 返回200状态码和JSON数据
    }

    // 处理GET请求,返回用户列表JSON
    @GetMapping
    public List<User> getUsers() {
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 30));
        users.add(new User("Bob", 25));
        return users; // 自动转换为JSON数组
    }
}

5. 发送JSON请求测试

使用工具(如Postman)或curl命令测试API。

POST请求示例
URL: POST http://localhost:8080/api/users
Headers:
Content-Type: application/json
Accept: application/json
Body (raw JSON):

{
    "name": "John",
    "age": 28
}

响应示例

{
    "name": "John-processed",
    "age": 28
}

6. 关键注解说明

@RequestBody:将HTTP请求体中的JSON绑定到方法参数的对象上。
@ResponseBody:将方法返回值直接写入HTTP响应体,而非视图解析。
@RestController:类级别的注解,组合@Controller@ResponseBody,所有方法默认返回数据而非视图。

7. 处理复杂场景

日期格式化:在实体类字段使用@JsonFormat

@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthDate;

忽略未知字段:在类上添加@JsonIgnoreProperties(ignoreUnknown = true),避免JSON包含未定义字段时报错。
自定义序列化/反序列化:实现JsonSerializerJsonDeserializer,并通过@JsonSerialize@JsonDeserialize指定。

8. 异常处理

全局处理JSON解析异常,返回友好错误信息。

示例异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<Map<String, String>> handleJsonParseException(HttpMessageNotReadableException ex) {
        Map<String, String> error = new HashMap<>();
        error.put("error", "Invalid JSON format");
        error.put("details", ex.getMessage());
        return ResponseEntity.badRequest().body(error);
    }
}

9. 验证JSON数据

结合JSR-303验证框架,确保输入数据合法。

示例

@PostMapping
public ResponseEntity<?> createUser(@Valid @RequestBody User user, BindingResult result) {
    if (result.hasErrors()) {
        // 返回验证错误信息
        return ResponseEntity.badRequest().body(result.getAllErrors());
    }
    // 处理有效数据
    return ResponseEntity.ok(user);
}

实体类添加验证注解

public class User {
    @NotBlank(message = "Name is required")
    private String name;
    
    @Min(value = 0, message = "Age must be positive")
    private int age;
}

10. 配置Spring Boot(可选)

在Spring Boot中,默认已配置Jackson,只需添加spring-boot-starter-web依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

小结

通过上述步骤,Spring MVC能够高效处理JSON请求和响应,关键在于正确使用注解和配置消息转换器。Spring Boot进一步简化了配置,使开发者更专注于业务逻辑。

在 Spring MVC 中,除了 JSON 请求,常见的请求内容类型还包括以下几种形式。以下是它们的用途、处理方式及代码示例:


1. 表单数据(application/x-www-form-urlencoded

场景:传统的 HTML 表单提交(非 AJAX)。
数据格式:键值对,如 name=John&age=25
Spring MVC 处理方式
• 使用 @RequestParam 接收单个参数。
• 使用 @ModelAttribute 绑定到对象。

示例代码

@PostMapping("/form")
public String handleForm(
    @RequestParam String name,
    @RequestParam int age) {
    // 处理逻辑
    return "success";
}

// 或绑定到对象
public class User {
    private String name;
    private int age;
    // getters/setters
}

@PostMapping("/form-object")
public String handleFormObject(@ModelAttribute User user) {
    // user.getName(), user.getAge()
    return "success";
}

2. 多部分文件上传(multipart/form-data

场景:上传文件(如图片、文档)。
数据格式:分段传输,支持文件二进制数据。
依赖:需添加 spring-boot-starter-web(默认包含 Multipart 支持)。
Spring MVC 处理方式
• 使用 @RequestParamMultipartFile 接收文件。

示例代码

@PostMapping("/upload")
public String uploadFile(
    @RequestParam("file") MultipartFile file,
    @RequestParam String description) {
    if (!file.isEmpty()) {
        String fileName = file.getOriginalFilename();
        // 保存文件到磁盘或云存储
    }
    return "redirect:/success";
}

配置上传文件大小限制application.yml):

spring:
  servlet:
    multipart:
      max-file-size: 10MB       # 单个文件最大大小
      max-request-size: 100MB   # 整个请求最大大小

3. XML 数据(application/xmltext/xml

场景:传统企业级系统或 SOAP 协议交互。
依赖:需添加 XML 解析库(如 JAXB)。
Spring MVC 处理方式
• 使用 @RequestBody 绑定 XML 到对象。

示例代码

@PostMapping(value = "/xml", consumes = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<User> handleXml(@RequestBody User user) {
    // 处理 XML 数据
    return ResponseEntity.ok(user);
}

实体类需添加 JAXB 注解

@XmlRootElement
public class User {
    private String name;
    private int age;
    // getters/setters
}

4. 纯文本(text/plain

场景:接收简单文本(如日志、配置)。
Spring MVC 处理方式
• 直接读取请求体内容。

示例代码

@PostMapping(value = "/text", consumes = MediaType.TEXT_PLAIN_VALUE)
public String handleText(@RequestBody String text) {
    // 处理纯文本
    return "Processed: " + text;
}

5. 二进制数据(application/octet-stream

场景:传输二进制文件(如图片、视频、Protobuf 数据)。
Spring MVC 处理方式
• 通过 InputStreambyte[] 接收原始数据。

示例代码

@PostMapping(value = "/binary", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void handleBinary(InputStream inputStream) {
    // 读取二进制流
    try (InputStream is = inputStream) {
        byte[] data = is.readAllBytes();
        // 处理数据
    } catch (IOException e) {
        e.printStackTrace();
    }
}

6. GraphQL 查询

场景:复杂数据查询(替代 REST API)。
数据格式:GraphQL 查询字符串。
依赖:需集成 graphql-javaspring-graphql
处理方式:通过专用端点处理查询。

示例代码

@PostMapping(value = "/graphql", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> handleGraphQL(@RequestBody Map<String, String> request) {
    String query = request.get("query");
    // 执行 GraphQL 查询
    return ResponseEntity.ok(result);
}

7. Protocol Buffers(Protobuf)

场景:高性能、跨语言数据交换(如微服务通信)。
依赖:需添加 Protobuf 依赖。
Spring MVC 处理方式
• 使用 @RequestBody 绑定到 Protobuf 生成的类。

示例代码

@PostMapping(value = "/proto", consumes = "application/x-protobuf")
public ResponseEntity<UserProto.User> handleProto(@RequestBody UserProto.User user) {
    // 处理 Protobuf 数据
    return ResponseEntity.ok(user);
}

总结:常见请求类型对比

内容类型用途Spring MVC 处理方式
application/jsonAPI 数据交互@RequestBody + 对象
application/x-www-form-urlencodedHTML 表单提交@RequestParam@ModelAttribute
multipart/form-data文件上传MultipartFile
application/xmlXML 数据交互@RequestBody + JAXB 注解
text/plain纯文本传输@RequestBody String
application/octet-stream二进制文件传输InputStreambyte[]

注意事项

  1. 明确指定 consumes
    @PostMapping 中指定 consumes 属性以限制接受的请求类型:
    @PostMapping(value = "/data", consumes = MediaType.APPLICATION_XML_VALUE)
    
  2. 依赖管理
    XML 需要 JAXB,Protobuf 需要 Protobuf 库,GraphQL 需要对应框架。
  3. 异常处理
    全局捕获 HttpMediaTypeNotSupportedException,返回友好的错误提示。

通过灵活使用这些内容类型,可以满足不同场景下的 HTTP 请求处理需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值