HTTP请求
HTTP请求由三部分组成:
- 请求行:包含请求方法、地址和HTTP的协议版本
- 消息报头:包含一系列的键值对
- 请求正文(可选):和消息报头之间有一个空行
信息报头中的主要信息有
- Host 是请求报头域,用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来;
- Connection 表示连接状态,keep-alive 表示该连接是持久连(persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用,如果客户端和服务器发现对方有一段时间没有活动,就可以主动关闭连接;
- Cache-Control 用于指定缓存指令,它的值有 no-cache, no-store, max-age 等,max-age=秒表示资源在本地缓存多少秒;
- User-Agent 用于标识请求者的一些信息,比如浏览器类型和版本,操作系统等; Accept
用于指定客户端希望接受哪些类型的信息,比如 text/html, image/gif 等; - Accept-Encoding 用于指定可接受的内容编码;
- Accept-Language 用于指定可接受的自然语言;
- Cookie 用于维护状态,可做用户认证,服务器检验等,它是浏览器储存在用户电脑上的文本片段;
HTTP的请求方式
HTTP请求方式通常有几种方式
- GET(SELECT):
从服务器取出资源(一项或多项),从服务器获取指定(请求地址)的资源信息,它通常只用于读取数据,就像数据库查询一样,不会对资源进行修改 - POST(CREATE):在服务器新建一个资源。向指定资源提交数据(比如提交表单,上传文件),请求服务器进行处理。数据被包含在请求正文中,这个请求可能会创建新的资源,或者更新现有的资源
- PUT(UPDATE): 在服务器更新资源(客户端提供改变后的完整资源)。通过指定资源的唯一标识(在服务器上的具体存放位置),请求服务器创建或更新资源。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
- HEAD:获取资源的元数据
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
GET和POST的区别:
- get的数据在url上,post在request body上
- get只能进行url编码,post有多种编码方式
- get是tcp/ip一次,post是两次
- 对get的参数有字符限制,而post没有(浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据)
- get请求会被浏览器缓存,但是post不会,除非手动设置
- 当浏览器回退时,get是没有影响的,但是post会再次提交请求
- 对参数的数据类型,get只能是ASCII字符,但是post没有限制
- 对于第三点中的:get只产生一个TCP数据包,post是两个数据包。get请求中会把header和data一并发送,但是post会先发送header,浏览器响应100 continue之后,再发送data。
- GET请求是幂等的
举个例子:
GET只需要汽车跑一趟就能把货送到,而POST要跑两趟。第一趟先去和服务器打个招呼“hi,我等下要送一批货,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效,但是不能随便改变两种请求方式
1.get和post都有自己的语义,不能随便混用
2.网络环境好的时候,发一次包的时间和发两次宝的时间基本可以忽略。但是在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点
3.并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
HTTP特点
- 客户端/服务端模式
- 简单快速:客户端向服务器请求服务时,通过传送请求方式、请求地址和数据体(可选)即可
- 灵活:允许传输任意类型的数据对象,通过Content-Type标识
- 无状态:对事物处理没有记忆能力
小结
- HTTP 是在网络上传输 HTML 的协议,用于浏览器和服务器的通信,默认使用 80 端口。
- URL 地址用于定位资源,HTTP 中的 GET, POST, PUT, DELETE 用于操作资源,比如查询,增加,更新等
- GET, PUT, DELETE 是幂等的,POST 是不幂等的。
-
POST VS PUT
- 使用 PUT 创建资源需要提供资源的唯一标识(具体存放位置),POST 不需要,POST 的数据存放位置由服务器自己决定 - 使用 PUT 更新某一资源,需要更新资源的全部属性;而使用 POST,可以更新全部或一部分值 - POST 是不幂等的,PUT 是幂等的,这是一个很重要的区别
- GET 可提交的数据量受到 URL 长度的限制,HTTP 协议规范没有对 URL 长度进行限制,这个限制是特定的浏览器及服务器对它的限制。
- 理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制
参考链接:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。