关于ResponseEntity类和HttpEntity及跨平台路径问题

 更新时间:2024年07月11日 08:40:59   作者:鱼找水需要时间  
这篇文章主要介绍了关于ResponseEntity类和HttpEntity及跨平台路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1. 简介

使用spring时,达到同一目的通常有很多方法,对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。

ResponseEntity是HttpEntity的扩展,添加一个HttpStatus状态代码。在RestTemplate和@Controller方法中使用。

ResponseEntity标识整个http相应:状态码、头部信息以及相应体内容。因此我们可以使用其对http响应实现完整配置

理解:

  • ResponseEntity的优先级高于@ResponseBody。在不是ResponseEntity的情况下才去检查有没有@ResponseBody注解。如果响应类型是ResponseEntity可以不写@ResponseBody注解,写了也没有关系。
  • ResponseEntity 是在 org.springframework.http.HttpEntity 的基础上添加了http status code(http状态码),用于RestTemplate以及@Controller的HandlerMethod。它在Controller中或者用于服务端响应时,作用是和@ResponseStatus与@ResponseBody结合起来的功能一样的。用于RestTemplate时,它是接收服务端返回的http status code 和 result的。
  • 简单粗暴的讲 @ResponseBody可以直接返回Json结果, @ResponseEntity不仅可以返回json结果,还可以定义返回的HttpHeaders和HttpStatus

2. 使用

2.1 RestTemplate

ResponseEntity<String> entity = template.getForEntity("https://hello.com", String.class);
String body = entity.getBody();
MediaType contentType = entity.getHeaders().getContentType();
HttpStatus statusCode = entity.getStatusCode();

2.2 Controller

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/get")
    public ResponseEntity<String> get() {
        return ResponseEntity.ok("hello");
    }
}

2.3 指定响应状态码

静态方式

@GetMapping("/get")
public ResponseEntity<String> get() {
    return ResponseEntity.status(HttpStatus.LOCKED).body("服务不可用");
}

也可以通过非静态方式构建

@GetMapping("/get")
public ResponseEntity<String> get() {
    ResponseEntity responseEntity = new ResponseEntity("服务不可用", HttpStatus.LOCKED);
    return responseEntity;
}

2.4 自定义响应头

@GetMapping("/get")
public ResponseEntity<String> get() {
    return ResponseEntity.ok()
        .header("Custom-Header", "lisa")
        .body("Custom header set");
}

2.5 下载文件

 @GetMapping("/download")
    public ResponseEntity<byte[]> get() throws IOException {
        // 你放的文件路径
        String filePath = "C:" + File.separator + "Users" + File.separator + "admin002" + File.separator + "Desktop" + File.separator + "work" + File.separator + "img";
        File file = new File(filePath + File.separator + "java.png");
        // 设置一个head
        HttpHeaders headers = new HttpHeaders();
        // 文件的属性,也就是文件叫什么
        headers.setContentDispositionFormData("attachment", "1.png");
        // 内容是字节流
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 开始下载
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }

2.6 直接操作HttpServletResponse

Spring 也允许我们直接 javax.servlet.http.HttpServletResponse 对象;只需要申明其作为方法参数:

@GetMapping("/get")
public void get(HttpServletResponse response) throws IOException {
    response.setHeader("Custom-Header", "lisa");
    response.setStatus(200);
    response.getWriter().println("Hello World!");
}

但需要说明,既然spring已经提供底层实现的抽象和附件功能,当然不建议直接操作response。

3. 扩展(跨平台路径问题)

  • File.separator:系统相关的默认名称分隔符,为方便起见表示为字符串。该字符串只包含一个字符,即separatorChar
  • separatorChar:系统依赖的默认名称分隔符。这个字段被初始化为包含系统属性file.separator值的第一个字符。在UNIX系统上,这个字段的值是’\‘;在Microsoft Windows系统上它是’\\’

注意:如果要考虑跨平台,则最好使用File.separator标识路径分隔符,不要直接用字符串’\\'来表示

总结

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

相关文章

  • Java之NoClassDefFoundError的原因及分析

    Java之NoClassDefFoundError的原因及分析

    在Java开发中,经常会遇到ClassNotFoundException和NoClassDefFoundError异常,ClassNotFoundException发生在编译时JVM无法找到类,而NoClassDefFoundError则发生在运行时JVM无法加载类,这两个异常虽然原因相似,但有本质区别
    2024-09-09
  • SpringBoot中的Thymeleaf模板

    SpringBoot中的Thymeleaf模板

    Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷。在这篇文中给大家介绍了这些缺陷所存在问题,对spring boot thymeleaf 模板相关知识感兴趣的朋友跟随小编一起看看吧
    2018-10-10
  • SpringBoot之瘦身部署的详细步骤

    SpringBoot之瘦身部署的详细步骤

    本篇文章主要介绍了SpringBoot之瘦身部署的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java按时间梯度实现异步回调接口的方法

    Java按时间梯度实现异步回调接口的方法

    这篇文章主要介绍了Java按时间梯度实现异步回调接口,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Java高性能缓存框架之Caffeine详解

    Java高性能缓存框架之Caffeine详解

    这篇文章主要介绍了Java高性能缓存框架之Caffeine详解,Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美,Caffeine受启发于Guava Cache的API,使用API和Guava是一致的,需要的朋友可以参考下
    2023-12-12
  • Java字符串驼峰与下换线格式转换如何实现

    Java字符串驼峰与下换线格式转换如何实现

    这篇文章主要介绍了Java字符串驼峰与下换线格式转换如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 解决微服务feign调用添加token的问题

    解决微服务feign调用添加token的问题

    这篇文章主要介绍了解决微服务feign调用添加token的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 新手了解java 异常处理基础知识

    新手了解java 异常处理基础知识

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。那么这篇文章总结了Java有效处理异常的三个原则,有需要的朋友们可以参考借鉴
    2021-07-07
  • ActiveMQ消息签收机制代码实例详解

    ActiveMQ消息签收机制代码实例详解

    这篇文章主要介绍了ActiveMQ消息签收机制代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • MyBatis多对多一对多关系查询嵌套处理

    MyBatis多对多一对多关系查询嵌套处理

    这篇文章主要为大家介绍了MyBatis多对多一对多关系查询嵌套处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论