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

简介: ResponseEntity类和HttpEntity及跨平台路径问题

1. 简介


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


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

1673437815384.jpg

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");
    }
}

1673437863970.jpg


2.3 指定响应状态码


静态方式

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

1673437884990.jpg

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

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

1673437901202.jpg


2.4 自定义响应头


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

1673437919632.jpg


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标识路径分隔符,不要直接用字符串’\\'来表示

相关文章
|
7月前
|
算法 Linux 开发者
CMake深入解析:打造高效动态链接库路径设置
CMake深入解析:打造高效动态链接库路径设置
584 0
|
C# Windows
WPF 获取程序路径的一些方法,根据程序路径获取程序集信息
原文:WPF 获取程序路径的一些方法,根据程序路径获取程序集信息 一、WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.
1729 0
|
6月前
|
Rust 安全
Rust中的模块与路径管理
Rust中的模块与路径管理
|
7月前
|
算法 关系型数据库 编译器
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(一)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
211 0
|
7月前
|
C++
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(二)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
115 0
|
C#
56【WinForm】WinForm创建类库项目,并同时在项目中调用类库文件C#
【WinForm】WinForm创建类库项目,并同时在项目中调用类库文件C#
260 0
|
Java 应用服务中间件 容器
javaweb项目中引用带有dll文件处理方式
javaweb项目中引用带有dll文件处理方式
|
XML C++ 数据格式
关于类库项目不能新增资源文件的解决方案
关于类库项目不能新增资源文件的解决方案
关于类库项目不能新增资源文件的解决方案
|
Unix Linux C++
LeetCode.71-简化路径
LeetCode.71-简化路径
202 0
C#(三十六)之文件夹、路径、环境特殊目录类
本篇内容记录了文件类操作、文件夹操作、Directory类方法、Path类方法和字段、Environment获取电脑的相关属性方法。
250 0
C#(三十六)之文件夹、路径、环境特殊目录类

热门文章

最新文章