简介
HTTP协议,即 超文本传输协议(Hypertext transfer protocol) 。是一种详细规定了浏览器和万维网(WWW =World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。是浏览器和服务器之间进行“沟通"的一种规范,是基于TCP/IP的应用层协议。由请求和响应构成。HTTP默认的端口号为80, HTTPS的端口号为443。浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览,只要通信的双方都遵守这个协议,HTTP就能有用武之地。
HTTP是基于 客户/服务器(B/S) 模式,且面向连接的。典型的HTTP事务处理有如下的过程:(1)客户与服务器建立连接; (2)客户向服务器提出请求; (3)服务器接受请求,并根据请求返回相应的文件作为应答; (4)客户与服务器关闭连接。
HTTP协议特点
- 无连接:客户与服务器之间的HTTP连接是一种一次性连接,当服务器返回本次请求的应答后便立即关闭连接。请求发送后,数据一返回连接就断了,下次请求再重新建立连接。服务器面向的是成千上万个用户,及时地释放连接可以大大提高服务器的执行效率。
- 无状态:HTTP是一种无状态协议,即服务器不保留与用户交易时的任何状态,服务器不知道是谁访问的我。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。
- 灵活:HTTP是一种面向对象的协议,允许传送任意类型的数据对象。它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送,正在传输的类型由Content-Type(Content-Type是HTTP报文中用来表示内容类型的标识)加以标记。
- 持久连接:在HTTP / 0.9和1.0中,连接在单个 请求/响应对 之后关闭。在HTTP / 1.1中,引入了保持活动机制,其中连接可以重用于多个请求,连接可以长时间建立。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商连接。
头部字段
头部字段是 key-value 的形式,key 和 value 之间用 “:” 分隔,最后用 CRLF 换行表示字段结束。比如在“ Host: 127.0.0.1 ”这一行里 key 就是 “Host”,value 就是“127.0.0.1”。
HTTP 头字段非常灵活,不仅可以使用标准里的 Host、Connection 等已有头,也可以任意添加自定义头,这就给 HTTP 协议带来了无限的扩展可能。
不过使用头字段需要注意下面几点:
- 字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
- 字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名;
- 字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
- 字段的顺序是没有意义的,可以任意排列不影响语义;
- 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。
HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:
- 通用字段:在请求头和响应头里都可以出现;
- 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;
- 响应字段:仅能出现在响应头里,补充说明响应报文的信息;
- 实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。
常用头字段请参考:https://blog.csdn.net/weixin_43953753/article/details/86821700
HTTP报文
请求报文
HTTP 请求报文由三大部分组成(请求行+请求头+请求体)
(1)请求行:
由请求方法(如 GET/POST 等)、请求目标(通常是一个 URI,标记了请求方法要操作的资源)、协议版本(报文使用的 HTTP 协议版本)组成。
GET / HTTP/1.1 //在这个请求行里,“GET”是请求方法,“/”是请求目标,“HTTP/1.1”是协议版本
(2)请求头:
由请求行和请求字段构成
(3)请求体:
它将要传输的值通过 param1=value1¶m2=value2 的键值对形式编码成一个格式化串,它承载多个请求参数的数据。get请求的请求体为空,post可以不为空(携带参数)
响应报文
HTTP 响应报文由三大部分组成(响应行+响应头+响应体)
(1)响应行:
由协议版本(报文使用的 HTTP 协议版本);状态码(比如 200 是成功);原因字符串(作为数字状态码补充,如状态码200对应OK)组成。
HTTP/1.1 200 OK //报文使用的协议版本号是 1.1,状态码是 200,一切 OK。”
(2)响应头:
由响应行和响应字段构成
(3)响应体:
服务器返回的数据,即我们真正需要的“干货”
在浏览器中查看报文
响应头和请求头
响应体
请求体(post请求)
HTTP状态码
1.信息(1开头的状态码)
这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
- 100:服务器仅接收到部分请求,并没有拒绝该请求,客户端应该继续发送其余的请求。
- 101:服务器转换协议,服务器将遵从客户的请求转换到另外一种协议。
2.成功(2开头的状态码)
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
- 200:请求成功,服务器已成功处理了请求。
3.重定向(3开头的状态码)
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
- 301:永久性重定向。请求的页面已经转移至新的url。
- 302:临时性重定向。请求的页面已经临时转移至新的url。
- 303:请求的页面可在别的url下被找到。表示资源存在另一个URL,用GET方法获取资源
- 304:未按预期修改文档。自从上次请求后,请求网页未修改过。服务器返回此响应时,不会返回网页内容
4.客户端错误(4开头的状态码)
这类的状态码代表了客户端可能发生了错误,妨碍了服务器的处理。
- 400:语义有误。当前请求无法被服务器理解。
- 401:当前请求需要用户验证。表示发送的请求需要有通过HTTP认证的认证信息。
- 403:服务器拒绝请求。服务器已经理解请求,但是拒绝执行它。
- 404:未找到。请求所希望得到的资源未被在服务器上发现。
5.服务器错误(5开头的状态码)
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
- 500:(服务器内部错误)服务器遇到错误,无法完成请求
- 503:由于临时的服务器维护或者过载,服务器当前无法处理请求。
更多状态码请参考:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
HTTP请求方法
HTTP规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是 GET 和 POST 。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。
- GET: 获取数据。请求指定的页面信息,并返回实体主体。
- HEAD: 获取报头。类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST: 提交数据。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT: 修改数据。从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE: 删除数据。请求服务器删除指定的页面。
- CONNECT: HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS: 允许客户端查看服务器的性能。
- TRACE: 回显服务器收到的请求,主要用于测试或诊断。
- PATCH: 是对 PUT 方法的补充,用来对已知资源进行局部更新 。