8.HttpEntity,ResponseEntity

article/2025/9/30 23:35:05
@RequestBody请求体,获取一个请求的请求体内容
就不用@RequestParam
@RequestMapping("/testRequestBody")public String testRequestBody(@RequestBody String body){System.out.println("请求体: "+body);return "success";}

只有表单才有请求体,点链接没有请求体。

enctype就是encodetype就是编码类型的意思。multipart/form-data
multipart是指表单数据有多部分构成,
既有文本数据(form),又有文件等二进制数据(data)。
multipart/form-data是将文件以二进制的形式上传<form action="${ctp}/testRequestBody" method="post" enctype="multipart/form-data"><input name="username" value="tomcat"/><input name="password" value="123456"><input type="file"    name="file"/><input type="submit"/></form>

图片没在字符集范围的,所以她显示乱码正常的。
文本数据是字符编码的。

HttpEntity除了获取请求的请求体(表单),还可以获取请求的请求头

@RequestMapping("/testHttpEntity")public String testHttpEntity(HttpEntity<String> Body){System.out.println("请求体: "+Body);return "success";}

在这里插入图片描述
请求头的全部信息。

,{accept=[image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /],
referer=[http://localhost:8080/ssm/testOther.jsp],
accept-language=[zh-Hans-CN,zh-Hans;q=0.5],
ua-cpu=[AMD64],
accept-encoding=[gzip, deflate],
user-agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko],
host=[localhost:8080],
content-length=[487],
connection=[Keep-Alive],
cache-control=[no-cache],
cookie=[JSESSIONID=6A5B641C8EF5F4C9E2BDF3641CC546F2; com.springsource.sts.run.embedded=true],
Content-Type=[multipart/form-data;boundary=7e415f2730424;
charset=UTF-8]}


1.@ResponseBody 将返回的数据转化成json字符串,放在响应体中。

2.如果返回的是页面,能转化成json字符串吗,然后放在响应体里面。

@ResponseBody@RequestMapping("/testreturn")public String testreturn(){System.out.println("能转成json吗");return "sucess";

在这里插入图片描述
如果返回的是String类型的ResponseEntity
泛型的意义:返回的响应体(body)中内容的类型

public ResponseEntity<String> testreturn(){
new ResponseEntity<String>(body,headers,statusCode);
body:响应体
headers:响应头
statusCode:状态码

ResponseEntity可以定义
返回的HttpStatus(状态码)和HttpHeaders(响应头),body(响应体)

@RequestMapping("/testreturn")public ResponseEntity<String> testreturn(){HttpStatus statusCode;String body ="<h1>success</h1>";MultiValueMap<String,String> headers = new HttpHeaders();headers.add("Set-Cookie", "username=hahhahahaha");返回就 new一个return new ResponseEntity<String>(body,headers,HttpStatus.OK);

响应体
在这里插入图片描述
响应头:
在这里插入图片描述
扩展:
ResponseEntity<> 可以规定返回的响应体,它的内容类型
如果是文件下载的话,响应体应该是个字节流 byte[ ]

比如:
服务器(Servlet容器)一部署启动web应用,
要下载的资源在web应用的WebRoot的scripts文件夹下
在这里插入图片描述
怎么找呢,还要拿到ServletContext实例。

说起ServletContext,一些人会产生误解,以为一个servlet对应一个ServletContext。其实不是这样的,事实是一个web应用对应一个ServletContext,所以ServletContext的作用范围是整个应用,明确这点很重要,这是基础中的基础。

我曾经想,为什么不起名叫WebContext或者ApplicationContext或者WebApplicationContext?这样见名知意多好。后来我想这也可能是有历史原因的:最初的客户端-服务端的架构模型非常简单,服务端运行着一些servlet用来处理客户端的请求。那个时候服务器很轻量级,运行一个应用,应用就由一堆servlet组成。所以这样简单的服务器也被称作servlet容器,主要作用就是运行servlet的。那么提供给应用的上下文就叫做ServletContext。(这个纯属个人意淫_,不对勿喷)

一个web应用对应一个ServletContext实例,这个实例是应用部署启动后,servlet容器为应用创建的。ServletContext实例包含了所有servlet共享的资源信息通过提供一组方法给servlet使用,用来和servlet容器通讯,比如获取文件的MIME类型、分发请求、记录日志等。

这里需要注意一点,如果你的应用是分布式部署的,那么每台服务器实例上部署的Web应用实例都各自拥有一个ServletContext实例。
在这里插入图片描述

getRealPath
根据资源(所有servlet共享的资源)虚拟路径,返回实际路径(绝对路径)。
比如说web应用中有个JSP页面index.jsp,调用getRealPath(“index.jsp”),则返回index.jsp文件在文件系统中的绝对路径。在windows下或许是这样:D:\xxx\xxx\index.jsp,

这里可能存在web应用中有多个index.jsp,它们在不同的路径下。
这时候servlet容器
1.先从web应用的根目录下向下查找,
2.从/WEB-INF/lib目录下的各JAR包里面的/META-INF/resources目录查找

1.得到要下载的文件的流
new FileInputStream(realPath);

2.文件流多大,字节数组多大
fileinputstream.available();

3.要把文件流里面的所有数据读到字节数组中。
fileinputstream.read(tmp);

4.关闭文件流
fileinputstream.close();

5.要下载文件的话,那就要定制返回的响应头,要用ResponseEntity

返回的响应体的内容类型就是一个byte[] 字节数组

文件下载的响应头:Content-Disposition
1.表明这是一个需要下载的文件 2.告诉浏览器默认文件名

处理一个downlowd请求(文件下载的请求)@SuppressWarnings({ "unchecked", "rawtypes" })@RequestMapping("/download")public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {ServletContext servletcontext = request.getServletContext();1.知道下载的文件的真实路径;String realPath=servletcontext.getRealPath("/scripts/jquery.min.js");2.得到下载的文件的流;FileInputStream fileinputstream=new FileInputStream(realPath);3.文件流有多大,字节数组就有多大byte[] tmp = new byte[fileinputstream.available()];4.要把文件流里面的所有数据,读到字节数组中fileinputstream.read(tmp);5关闭文件流fileinputstream.close();6.要下载文件的话,那就要定制返回的响应头,要用ResponseEntity返回的响应体的内容类型是一个 byte[] 字节数组下载文件的响应头: Content-Disposition 1.表明这是一个要下载的文件 2.告诉浏览器,它的默认文件名HttpHeaders  httpHeaders =  new HttpHeaders();httpHeaders.set("Content-Disposition","attachment;filename="+"jquery.min.js");return new ResponseEntity(tmp,httpHeaders,HttpStatus.OK);}

如果是返回RoponseEntity,视图解析器就不拼串了。
用到HttpEntity(获取请求的请求体,或者请求头)

在这里插入图片描述

 起作用的是HttpMessageConverter<T>接口将请求信息流转换为一个对象(类型为T),将对象写到响应流根据请求头的mediaType,我能不能读取这种类型的数据
Boolean canRead(Class<?> clazz,MediaType mediaType);根据响应,我能不能写出这种类型
Boolean canWrite(Class<?> clazz,MediaType mediaType);	List<Meida Type>  getSupportMediaTypes();
能支持哪些媒体类型read write

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
适配器有MessageConverter,
适配器执行目标方法,
一旦发现目标方法的参数,不是我们默认能处理的。
或者发现目标方法的返回值,不是以前的逻辑可以处理的。
调用MessageConverter处理。

HttpMessageConverter:
在这里插入图片描述
ByteArrayHttpMessageConverter:
请求信息流(HttpMessage)转换成字节数组(ByteArray)对象

StringHttpMessageConverter:
请求信息流(HttpMessage)转换成字符串(String)对象
将字符串(String)对象写到响应流

来看一下ByteArrayHttpMessageConverter
有个supports方法,看他只支持处理字节数组类型
在这里插入图片描述
如果是读取,看readInternal,把请求信息流(HttpMessage)
里面的信息,转换成一个字节数组对象。
在这里插入图片描述
如果是写,看writeInternal,把字节数组对象 写到响应流
在这里插入图片描述
getBody() 获取一个输出流(OutputStream)
字节数组以输出流的形式写出去
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Ufl83q7q.shtml

相关文章

使用restTemplate进行feign调用new HttpEntity<>报错解决方案

使用restTemplate进行feign调用new HttpEntity<>报错解决方案 问题背景HttpEntity<>标红解决方案心得Lyric&#xff1a; 沙漠之中怎么会有泥鳅 问题背景 今天才知道restTemplate可以直接调用feign&#xff0c;高级用法呀&#xff0c;但使用restTemplate进行feign调…

HttpClient 源码详解之HttpEntity

HttpClient 源码详解 之HttpEntity 1. 类释义 An entity that can be sent or received with an HTTP message. Entities can be found in some requests and in responses, where they are optional. There are three distinct types of entities in HttpCore, depending on …

System.Net.Http.HttpClient

本文主要是介绍如何用HttpClient请求带参数的服务&#xff0c;请求服务为某翻译API 直接上源码 1.添加using System.Net;的引用 using System.Net; 2.使用HttpClient发送请求 public static async void Fanyin_HttpClient(string fromString) {Console.WriteLine($"F…

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

1. 简介 使用spring时&#xff0c;达到同一目的通常有很多方法&#xff0c;对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。 ResponseEntity是HttpEntity的扩展&#xff0c;添加一个HttpStatus状态代码。在RestTemplate和Con…

RestTemplate发送HTTP、HTTPS请求

前面我们介绍了如何使用Apache的HttpClient发送HTTP请求,这里我们介绍Spring的Rest客户端(即:RestTemplate) 如何发送HTTP、HTTPS请求。注:HttpClient如何发送HTTPS请求,有机会的话也会再给出示例。 声明:本人一些内容摘录自其他朋友的博客&#xff0c;链接在本文末给出&#…

HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。 从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。 HttpEnti…

关于HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。 HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。HttpEntit…

查询MySQL数据库中表结构的几种方法

mySQL: 方法一、二、三&#xff1a;是在本数据库中查询。 /** 方法一 **/ show columns from activity_station; /** 方法二 **/ desc activity_station; describe activity_station;/** 方法三 **/ show create table activity_station;方法四是在统计数据库中查询。 informa…

mysql 表结构查询的SQL语句

1、查看表结构 desc student;2、查看表的DDL语句 show create table student;3、查看列的结构信息 select column_name,data_type,column_comment,column_key,extra,character_maximum_length,is_nullable,column_default from information_schema.columns where table_sch…

mysql查看表结构 desc 表名;

查看表结构 语法&#xff1a;desc 表名;

MySQL之表结构

1.添加、删除字段 查看表结构 desc blog;show columns from blog;新增字段 alter table 表名 add 字段名 字段数据类型;alter table blog add age tinyint;删除字段 alter table 表名 drop 字段名;alter table blog drop age;重新添加age alter table blog add age tinyin…

mysql查看表结构和编码

show full columns from XXXXX

查看修改MySQL表结构命令

查看修改MySQL表结构命令 简述 小编经常会遇到一些数据库编码不对得问题&#xff0c;好TM头疼&#xff0c;这里做一个记录&#xff0c;供大家参考。 修改数据库字符集&#xff1a; ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE …]; 把表默认的字…

Mysql数据库常用表结构操作语句

目录 一、准备工作二、常用表结构操作语句1.在数据库表中新增 字段、约束1.1 新增字段1.2 新增约束 2.在数据库表中修改 表、字段2.1 修改表的名字2.2 修改字段名、数据类型、默认值、注释、自增属性 3.在数据库表中删除表、字段3.1 删除表3.2删除字段、字段约束 3.在数据库表中…

mysql 查询所有表结构_mysql数据库查看表结构

Mysql技术知识点 Mysql技术知识点,首先来讲一下Mysql语句精进安装数据库,然后导入tigerfive.sql。 sql见文档结尾部分MySQL示例数据库模式由以下表组成: customers: 存储客户的数据。 products: 存储汽车的数据。 productLines: 存储产品类别数据。 orde... 文章 好程序员 2…

linux mysql 结构_linux查看mysql数据表结构

展开全部 一、简单描述表结构&#xff0c;字段类型 desc tabl_name; 显示32313133353236313431303231363533e78988e69d8331333365636133表结构&#xff0c;字段类型&#xff0c;主键&#xff0c;是否为空等属性&#xff0c;但不显示外键。 例如&#xff1a;desc table_name 二、…

mysql查看表结构修改记录表_MySQL 表结构查看以及表结构修改

使用MySql数据库时&#xff0c;如果对表字典不够熟悉&#xff0c;我们就需要查看表结构。如果数据库是在远程linux上部署&#xff0c;很多时候我们只能通过mysql的命令来查看表结构。同样&#xff0c;如果我们想要修改表结构&#xff0c;添加、删除、修改列时&#xff0c;也只能…

mysql查看表描述_MySQL 查看表结构简单命令

一、简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。 例如:desc table_name 二、查询表中列的注释信息 select * from information_schema.columns where table_schema = db #表所在数据库 and table_name = tablename…

mysql查看表结构的几种方式

在我第N次忘记如何查看表结构后&#xff0c;在网上查了一下后&#xff0c;看到有好几种查看表结构的方式&#xff0c;总结一下。 以student&#xff08;sid,sname,birthday,sex&#xff09;的查看为例。 【方式一】&#xff1a;desc student; 语法&#xff1a;desc 表名;-----…

【Jon】连接Mysql数据库出现1046错误

问题&#xff1a;今天博主在使用Navicat12连接Mysql数据库的时候出现1046-UDAL-No database selected错误。 解决办法&#xff1a;直接换了一个版本的Navicat&#xff0c;就解决了问题。Nice^^