【JavaWeb】Http请求与响应

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 邮件中使用文件扩展名(主类型/子类型)
txttext/plain
htmltext/html
jsonapplication/json
jpgimage/jpeg
avivideo/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.propertiesapplication.yml)进行编码设置:

spring:
  web:
    encoding:
      charset: UTF-8
      enabled: true
  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scj1022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值