SpringBoot ResponseEntity标识Http响应方式

 更新时间:2024年07月10日 16:59:23   作者:fengyehongWorld  
这篇文章主要介绍了SpringBoot ResponseEntity标识Http响应方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一. 说明

  • ResponseEntity用来标识整个Http响应,可以标识状态码,Head头部信息,以及响应体。
  • ResponseEntity的优先级高于@ResponseBody。

在返回值不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。

如果响应类型是ResponseEntity可以不写@ResponseBody注解,便可返回JSON数据或其他类型的数据,如果同时使用ResponseEntity和@ResponseBody注解也不会报错。

  • ResponseEntity是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码)。作用是和@ResponseStatus@ResponseBody结合起来的功能一样的。
  • @ResponseBody可以直接返回JSON结果, @ResponseEntity不仅可以返回JSON结果,还可以返回自定义的HttpHeaders和HttpStatus。

二. ResponseEntity.ok().headers(响应头).body(响应体)

可用于文件下载

与直接向HttpServletResponse中写入OutputStream和header的效果相同

HttpServletResponse是servlet式的写法,而ResponseEntity是Springt式的写法

  • new ResponseEntity<>(响应体, 响应头, 状态码) 是非简写方式
  • ResponseEntity.ok().headers(响应头).body(响应体) 是简写方式
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@GetMapping("/testResponseEntity1")
public ResponseEntity<byte[]> testResponseEntity1() throws Exception {

    // 读取本地的文件
    String filePath = "/temp/A110120119/测试文件.text";
    ClassPathResource readFile = new ClassPathResource(filePath);

    // 设置响应头,把文件名称放入响应头中,确保文件可下载
    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Disposition", "attachment;filename=" + URLEncoder.encode(readFile.getFilename(), "UTF-8"));
    // 设置内容类型为「application/octet-stream」二进制流
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    // 获取File对象
    File file = readFile.getFile();
    Path path = Paths.get(file.toURI());
    // 获取File对象的字节码文件
    byte[] bytes = Files.readAllBytes(path);

    /*
     * 表示返回一个字节码类型的响应
     * 同时设置了响应头和状态码
     * */
    if (ObjectUtils.isEmpty(readFile.getFilename())) {
        // 👉👉👉简写形式
        return ResponseEntity.ok().headers(headers).body(bytes);
    }

    // 👉👉👉非简写形式
    return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}

三. ResponseEntity.ok(响应内容)

请求成功,直接把后台的数据响应给前台

@GetMapping("/testResponseEntity2")
public ResponseEntity<List<String>> testResponseEntity2() {

    List<String> list = Arrays.asList("1", "2");
    return ResponseEntity.ok(list);
}

与下面这种写法 功能相同

@GetMapping("/testResponseEntity2")
@ResponseBody
public List<String> testResponseEntity2() {

    List<String> list = Arrays.asList("1", "2");
    return list;
}

四. ResponseEntity<Void>

  • HttpStatus.NO_CONTENT状态码为204,表示服务器成功的处理了请求,但是没有返回任何内容

多用于 更新删除 的时候,响应给前台一个状态码,表示操作成功。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@GetMapping("/testResponseEntity3")
public ResponseEntity<Void> testResponseEntity3(String param) {

    // ⏹http状态码 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
    if (ObjectUtils.isEmpty(param)) {
    	// ⏹简写方式
        return ResponseEntity.noContent().build();
    }
	
	// ⏹非简写方式
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

五. ResponseEntity.status(状态码)

用于向前台返回指定的状态码,还可以返回Header和响应内容

  • HttpStatus.CREATED201状态码表示请求成功并且服务器创建了新的资源。
@GetMapping("/testResponseEntity4")
public ResponseEntity<Void> testResponseEntity4() {
	
	// 向数据库中插入数据
	// ......
	
    // ⏹http状态码 201 (已创建) 请求成功并且服务器创建了新的资源。
    return ResponseEntity.status(HttpStatus.CREATED).build();
}

@GetMapping("/testResponseEntity5")
public ResponseEntity<String> testResponseEntity5(String param) {
	
	// 如果参数不存在就返回默认的图片url,并返回状态码201
    if (!ObjectUtils.isEmpty(param)) {
        return new ResponseEntity<>("默认的图片URL", HttpStatus.CREATED);
    }
	
	// 向数据库中插入图片,并返回能访问图片地址的url
	// ......
	// ⏹用于插入数据成功之后返回数据给前台

    // ⏹201 状态码,并返回图片的url
    return ResponseEntity.status(HttpStatus.CREATED).body("图片的url");
}

六. ResponseEntity.status(状态码).body(响应体)

  • HttpStatus.BAD_REQUEST表示状态码400,异常的请求。
@GetMapping("/testResponseEntity6")
public ResponseEntity<Map<String, Object>> testResponseEntity6(String param) {
	
	// 用来存放校验信息的Map
    Map<String, Object> map = new HashMap<>();
	
	// 进行参数校验
    if (param == null) {
    	// 参数为null,直接返回错误码400
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
    } else if ("".equals(param.trim())){
    	// 参数为空字符串,返回错误码400的同时,还返回错误信息
        map.put("errorMsg","参数为空");
        return ResponseEntity.badRequest().body(map);
    }

    // 200 状态码,并指定请求成功的响应体
    map.put("successMsg", "参数通过校验");
	
    return ResponseEntity.status(HttpStatus.OK).body(map);
    
    // 这种写法更加简单,本质上和上面是一种写法
    // return ResponseEntity.ok(map);
}

七. 前台ajax

$.ajax({
    url: `请求URL`,
    type: '请求方式',
    // data: JSON.stringify(param),
    // 向服务器发送的数据类型
    // contentType: 'application/json;charset=utf-8',
    // dataType: 'json',
    success: function (data, status, xhr) {

        // 请求成功的响应体
        console.log(data);

        // 请求成功的状态文字描述(success,nocontent等)
        console.log(status);

        // 请求成功的状态码(200,201,204等)
        const {
            status: stateCode
        } = xhr;
        console.log(stateCode);
    },
    error(xhr, status, error) {

        const {
            // 请求异常时的json格式响应体
            responseJSON,
            // 请求异常时的文本响应内容
            responseText,
            // 请求异常时的状态码
            status: stateCode
        } = xhr;
        console.log(responseJSON);
        console.log(responseText);
        console.log(stateCode);

        // 请求成功的状态文字描述(error等)
        console.log(status);
    }
});

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中计算集合中元素的出现次数统计

    Java中计算集合中元素的出现次数统计

    本文主要介绍了Java中计算集合中元素的出现次数统计,使用Collections类配合HashMap来统计和java lamb 计算这两种方式,具有一定的参考价值,感兴趣可以了解一下
    2024-02-02
  • JavaWeb 中的 Filter组件详解

    JavaWeb 中的 Filter组件详解

    本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后处理、链式处理等功能,通过配置文件或注解进行设置,适用于字符编码、身份认证、日志记录等多种场景,感兴趣的朋友一起学习吧
    2025-11-11
  • MySQL和Java通用加密解密方式小结

    MySQL和Java通用加密解密方式小结

    这篇文章主要介绍了MySQL和Java通用加密解密方式,加密方式使用AES加密,在转成Base64,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-12-12
  • Java Mybatis框架由浅入深全解析上篇

    Java Mybatis框架由浅入深全解析上篇

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码本文将为大家初步的介绍一下MyBatis的使用
    2022-07-07
  • 使用Java生成JWT令牌的示例代码

    使用Java生成JWT令牌的示例代码

    json-web-token简称java web令牌,也称作JWT,是一种可以实现跨域身份验证身份的方案,jwt不加密传输数据,但能够通过数据前面验证数据的未被篡改,本文给大家介绍了如何使用Java生成JWT令牌,需要的朋友可以参考下
    2024-04-04
  • Java使用dom4j解析XML

    Java使用dom4j解析XML

    dom4j是一个开源的、基于Java的XML解析库,而在Java中使用dom4j库解析XML是一种常见的方法,下面就跟随小编一起来学习一下Java如何使用dom4j解析XML吧
    2024-12-12
  • IDEA使用Tomcat运行web项目教程分享

    IDEA使用Tomcat运行web项目教程分享

    在非Spring Boot项目中运行Nacos示例,需要手动配置Tomcat容器,本文介绍了如何在IDEA中配置Tomcat,并详细解决了配置过程中可能遇到的异常情况,步骤包括修改IDEA项目结构、添加Web模块、配置Artifacts和Tomcat Server
    2024-10-10
  • springMVC拦截器HandlerInterceptor用法代码示例

    springMVC拦截器HandlerInterceptor用法代码示例

    这篇文章主要介绍了springMVC拦截器HandlerInterceptor用法代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • java中的Io(input与output)操作总结(一)

    java中的Io(input与output)操作总结(一)

    所谓IO,也就是Input与Output的缩写。在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写,感兴趣的朋友可以了解下
    2013-01-01
  • Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

    Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

    文章讲述了MyBatis-Plus中MetaObjectHandler接口的使用方法,通过在实体类中添加@TableField注解并实现MetaObjectHandler接口的insertFill和updateFill方法,为新增和更新操作时自动填充公共字段如createTime、updateTime等的默认值
    2026-04-04

最新评论