HTTP协议理解
0、全文核心:
1、HTTP协议的特点以及cookie、session技术。
2、HTTP请求和响应的四部分构成
3、响应状态码
4、请求的GET和POST方式的区别
1、概念以及作用
概念:Hyper Text Transfer Protocol,超文本传输协议。
作用:规范浏览器和服务器之间数据交换格式。因为客户端(浏览器)版本众多,像谷歌浏览器、360浏览器等等。而服务器也版本众多,那么如何实现不同版本的浏览器和不同版本的服务器之间数据交互呢?于是诞生了Http协议。
2、特点
2.1、无状态(重点)
HTTP协议无状态指该协议对于事务处理是没有记忆能力的。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,导致每次连接传送数据量增大。简单理解为:HTTP协议不对之前发生过的请求和响应的状态进行管理。假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面都会要求重新登录。正因此诞生后面的cookie、session、token等技术。
http无状态协议与cookie、session联系
2.2、无连接(重点)
HTTP协议无连接指限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户的应答后,立即断开连接(TCP连接。HTTP协议是应用层协议,会下沉到传输层使用TCP)。
在HTTP1.1版本之后支持可持续连接,即在某一规定时间内保持连接,若超过规定时间立即断开连接,通常是在规定时间内没有任何数据传输条件下断开连接。个人感觉和TCP使用三次握手建立连接的目的一样!
2.3、简单快速且灵活
HTT通过Content-Type可以传输任意类型的数据对象,相对灵活。并且当客户端向服务器发出请求时,只需要传送请求方式(GET、POST等等)和路径(IP地址、资源名)即可。由于HTTP协议简单,使得HTTP服务器进程规模小,压力小,通信速度快。
2.4、支持B/S和C/S模式
3、HTTP数据交互流程
HTTP一次完整的请求包含四步:
步骤1:客户端与服务器建立连接;
步骤2:客户端发送请求数据到服务器;
步骤3:服务器接收请求并作出响应;
步骤4:关闭连接(HTTP1.1之后不会立即关闭连接)。
web交互基本流程
4、HTTP之URI、URL、URN
Uniform Resource Identifiers(URI)统一资源标识符
Uniform Resource Locator(URL)统一资源定位符
Uniform Resource Name(URN)统一资源命名
HTTP使用URI来传输数据和建立连接。URL是一种特殊类型的URI,它不仅标识了资源,还定位资源。(URI是一种抽象的、高层次概念定义了统一资源标识。而URL是具体的资源标识方式。)
5、HTTP之请求request
一个HTTP请求包含以下四部分:
5.1、请求行request line
构成要素:请求类型、要访问资源地址URL、HTTP版本
以请求类型来说有GET、POST、HEAD、PUT、DELETE等8种,要掌握GET和POST的区别;以及REST风格的四种请求方式。
5.2、请求头header
用于说明服务器要使用的附加信息。几个重要参数如下:
Host:服务器的域名和端口号
User Agent:浏览器版本和所用操作系统
Accept:服务器返回客户端所能接收内容的类型
Connection:是否需要持久连接,HTTP1.1默认持久
Content-Length:请求内容长度
5.3、空行
请求头部后面的空行是必须存在的,即使请求数据为空。
5.4、请求数据(主体)
例如以GET方式发出请求所携带参数;或者以POST方式提交表单所携带参数;等等都为请求数据。
GET /index.html HTTP/1.1 --->请求行
Host: server-4d4d4d66.example.int ----->服务器的域名和端口
Connection: Keep-Alive ------>保持连接
If-None-Match: 4ec19d31875ef16f09b8ab920ad2ee32
User-Agent: Client Agent
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip,deflate
UA-CPU: x86
(空行)
username=admin&password=123456 ---->请求数据
6、HTTP之响应response
一个HTTP响应同样由四部分构成:
6.1、响应行(状态行)
构成要素:HTTP版本、状态码、状态信息
a、状态码5种类型
1XX:服务器收到请求,需要请求者继续执行操作
2XX:成功,操作被成功接收并处理
3XX:重定向,需要进一步的操作以完成请求
4XX:客户端错误,请求包含语法错误或无法完成请求
5XX:服务器错误,服务器在处理请求的过程中发生错误
b、常见状态码
200 - 请求成功,已经正常处理完毕
301 - 请求永久重定向,转移到其它URL
302 - 请求临时重定向
304 - 请求被重定向到客户端本地缓存
400 - 客户端请求存在语法错误
401 - 客户端请求没有经过授权
403 - 客户端的请求被服务器拒绝(一般为客户端没有访问权限)
404 - 客户端请求的URL在服务端不存在(服务器找不到该资源)
500 - 服务端永久错误(服务器端代码出bug)
6.2、响应头
用于说明客户端要使用的附加信息几个重要参数如下:
Data:原始服务器做出响应的时间
6.3、空行
同HTTP请求的空行相同,必须存在。
6.4、响应数据(响应正文)
HTTP/1.1 200 OK ------->响应行
Date: Tue, 05 May 20 06:00:40 GMT ----->原始服务器响应时间
Last-Modified: Sat, 07 Mar 20 17:38:15 GMT ---->资源最后修改时间
ETag: b8fa9ba13a28f56b712d37fcb42417e3
Connection: Keep-Alive ----->保持连接
Server: Microsoft-IIS/7.0 ----->Web服务器软件的名称
Cache-Control: private ------>缓存控制
Content-Type: text/html ------>响应的是一个html页面
Content-Length: 3274 ----->响应体的长度
(空行)
<html>
<head>
.........
</head>
<body>
.........
</body>
</html>
7、地址栏输入URL的过程
1、例如在地址栏输入https://www.baidu.com,DNS域名服务器会将该域名解析为IP地址(毕竟用户不会记得ip,所以才有DNS诞生)。2、解析出IP后,根据IP+端口可以唯一确定服务器进程,然后建立TCP连接。
3、浏览器发出HTTP请求,该请求报文会作为TCP三次握手的第三个报文的数据发送给服务器。
4、服务器响应客户端,发送html页面。
5、释放TCP连接(HTTP1.1不会立即释放)。
6、浏览器渲染html展示给用户。
8、Java获取HTTP请求内容并响应
/*
* 可以使用PostMan发出各种请求,方便起见直接在地址栏发出GET请求了。
* HttpServletRequest获取请求信息网址:https://blog.csdn.net/cold___play/article/details/100920952
*/
@Controller
public class HttpController {
@GetMapping("/getHttp")
@ResponseBody //方便起见就直接返回json格式数据
public String getHttpContent(HttpServletRequest request,@RequestParam("pwd") Integer d) {
String method = request.getMethod();
String protocol = request.getProtocol();
System.out.println("当前请求方式为--->"+method);
System.out.println("请求行中的协议名和版本---->"+protocol);
StringBuffer url = request.getRequestURL();
System.out.println("客户端发出请求时的完整URL:"+url);
System.out.println("请求数据---->"+d);
return "Java获取HTTP信息";
}
}