文章目录
- Http 请求与响应
- 一、Http 请求格式
- 1、请求行
- 2、请求头
- 3、请求体(post请求才有)
- 二、HttpServletRequest
- 1、获取 请求行 信息
- 2、获取 请求头 信息
- 3、获取 请求参数 信息
- 三、Http 响应格式
- 1、响应行
- 2、响应头
- 3、响应体(正文)
- 四、HttpServletResponse
- 1、设置 响应行 信息
- 2、设置 响应头 信息
- 3、设置 响应体 信息
- 五、附录
- 1、状态码
- 2、MIME 扩展名
- 3、编码问题
Http 请求与响应
一、Http 请求格式
1、请求行
# 格式
POST:请求方式 请求地址 请求协议/版本号
GET: 请求方式 请求地址?请求参数 请求协议/版本号
# 举例
POST /app/static/login.html HTTP/1.1
GET /app/static/login.html?username=jack&password=123 HTTP/1.1
2、请求头
# 格式
name: value
name --> 请求头名称,固定值,可能重复
value --> 对应的属性值,动态变化
# 常见请求头
---------------------------------------------------【了解】
1. Host: localhost:8080 访问的服务器地址(域名+端口)
2. Connection: keep-alive 长连接(http1.1协议)
3. Upgrade-Insecure-Requests:1 客户端支持https加密协议
---------------------------------------------------【重点】
4. Referer: http://baidu.com 上一次访问的地址(用于防盗链...)
5. User-Agent: xxx 客户端的系统和浏览器版本(如下所示)
以谷歌浏览器为例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/63.0 Safari/537.36
浏览器兼容性:
服务器会根据用户的浏览器版本,返回响应的数据(相应的浏览器可以解析的数据)
3、请求体(post请求才有)
# 格式
参数名=参数值&参数名=参数值...
# 例如
username=jack&password=123...
# 注意
get方式没有请求体,post方式才有
post的请求参数是放在请求体中的
二、HttpServletRequest
- 原理:Tomcat 支持 HTTP 协议,用户通过浏览器请求服务器时,Tomcat 会将 请求的信息 都封装在 Request 对象中。
- 作用:开发人员可以通过 Request 对象,获取浏览器发送给服务器的请求信息。
public interface HttpServletRequest extends ServletRequest {...}
ServletRequest (JavaEE中的接口,兼容大部分协议)
|
HttpServletRequest (JavaEE中的接口,HTTP协议)
1、获取 请求行 信息
请求行: GET /test/requestDemo HTTP/1.1
public interface HttpServletRequest extends ServletRequest {
// 获取请求方式 --> GET/POST
String getMethod();
// 获取URL --> http://localhost:8080/test/requestDemo
StringBuffer getRequestURL();
// 获取URI --> /test/requestDemo
String getRequestURI();
// 获取协议和版本号 --> HTTP/1.1
String getProtocol();
// 获取客户端ip --> 0:0:0:0:0:0:0:1
String getRemoteAddr();
}
2、获取 请求头 信息
public interface HttpServletRequest extends ServletRequest {
// 获取指定请求头名称 对应的值(名称不区分大小写)
String getHeader(String name);
// 获取所有请求头的名称(Enumeration是Iterator迭代器前身)
Enumeration<String> getHeaderNames();
}
Tips:如果在浏览器抓包时,看不到某个header,就表示这个header所对应的值是null
3、获取 请求参数 信息
虽然GET请求的参数在请求行,POST请求的参数在请求体,但是都可以使用下列方法来获取请求参数。
public interface HttpServletRequest extends ServletRequest {
// 获取指定参数名对应的值 --> username - jack
String getParameter(String name);
// 获取指定参数名对应的值数组 --> hobby - [drink, perm]
String[] getParameterValues(String name);
// 获取所有参数名和对应的值数组,封装到map集合
Map<String,String[]> getParameterMap();
}
三、Http 响应格式
1、响应行
格式: 协议/版本号 状态码
举例: HTTP/1.1 200
2、响应头
格式: 响应头名称: 响应头的值
举例: Content-Length: 5 (指的是响应体内容长度5个字符)
# 常见响应头
1. Refresh:
在指定间隔时间后,跳转到某个页面
Refresh:5;http://www.tb.cn
2. Content-Type:
服务器告诉客户端,返回响应体的数据类型和编码方式
Content-Type:text/html;charset=utf-8
3. Location:
通常与状态码302一起使用,实现重定向操作
Location:http://www.tb.cn
4. Content-Disposition:服务器告诉客户端,以什么样方式打开响应体
* in-line(默认):浏览器直接打开相应内容,展示给用户
* attachment;filename=文件名:浏览器以附件的方式保存文件 【文件下载】
3、响应体(正文)
服务器返回的数据,由浏览器解析后展示给用户
四、HttpServletResponse
- 原理:服务器向浏览器返回请求响应时,Tomcat 会将 响应的信息 都封装在 Response 对象中。
- 作用:开发人员可以通过 Response 对象,获取服务器返回给浏览器的响应信息。
public interface HttpServletResponse extends ServletResponse {...}
ServletResponse (JavaEE中的接口,兼容大部分协议)
|
HttpServletResponse (JavaEE中的接口,HTTP协议)
1、设置 响应行 信息
public interface HttpServletResponse extends ServletResponse {
// 设置状态码(通常是由tomcat服务器 自动响应 给浏览器,不需要手动设置)
void setStatus(int sc);
}
2、设置 响应头 信息
public interface HttpServletResponse extends ServletResponse {
// 设置 header
void setHeader(String name, String value);
}
// value值可以由多个参数组成,不同参数之间使用分号隔开
response.setHeader("name", "value1;value2");
3、设置 响应体 信息
public interface HttpServletResponse extends ServletResponse {
// 字符输出流 : 用于向浏览器输出字符数据 (文本)
PrintWriter getWriter();
// 字节输出流 : 用于向浏览器输出二进制数据 (文件)
ServletOutputStream getOutputStream();
}
String responseData = "这是ResponseData";
response.getWriter().print(responseData);
byte[] bytes = responseData.getBytes(StandardCharsets.UTF_8);
response.getOutputStream().write(bytes);
五、附录
1、状态码
200: 请求和响应都OK
302: 重定向
304: 浏览器从缓存中加载数据(如果是从缓存中获取的数据,状态码是304;否则是200)
400: 请求参数有误
401: 未授权(未登录)
403: 禁止访问(登录了,没有权限)
404: 请求的路径错误或请求的资源不存在
405: 请求的 Method 不正确(如:POST请求写成了GET请求)
406: 请求的 MediaType 不支持
415: 请求的 MediaType 不正确
500: 服务器内部异常
2、MIME 扩展名
windows 系统文件扩展名 | MIME 邮件中使用文件扩展名(主类型/子类型) |
---|---|
txt | text/plain |
html | text/html |
json | application/json |
jpg | image/jpeg |
avi | video/x-msvideo |
具体映射关系 可以在
tomcat安装目录/conf/web.xml
文件查看
3、编码问题
出现编码问题,一般是由于编解码所使用的字符集不一致导致的。(浏览器通常使用)
- 浏览器:默认使用 UTF-8 编码
- 服务器:Tomcat 默认使用 ISO-8859-1 编码
对于请求,设置服务器的解码格式。通常在处理请求之前设置编码可以避免乱码问题。
request.setCharacterEncoding("UTF-8");
对于响应,设置浏览器的解码格式(默认由 Tomcat 设置为 ISO-8859-1)
// 服务器告诉浏览器: 以 text/html 的格式 解析 响应体;以 utf-8 的 字符集 解码 响应体
response.setHeader("content-type", "text/html;charset=utf-8");
response.setContentType("text/html;charset=UTF-8");
Spring Boot 在启动时,会自动将请求和响应的编码设置为 UTF-8,以确保默认的字符处理不会出现乱码问题。
可以通过配置文件(如 application.properties
或 application.yml
)进行编码设置:
spring:
web:
encoding:
charset: UTF-8
enabled: true