HTTP请求
超文本传输协议(HTTP, HyperText Transfer Protocol)是一种无状态的协议,它位于OSI七层模型的传输层。
HTTP客户端会根据需要构建合适的HTTP请求方法,而HTTP服务器会根据不同的HTTP请求方法做出不同的响应。
HTTP请求是客户端发给服务器端的请求消息。请求信息不仅包含客户端要访问的信息,还包含客户端的配置信息以及传输方式信息。服务器端根据这些请求信息,决定如何向客户端返回信息。
HTTP请求的构成
HTTP请求消息由3部分构成,分别是请求行、请求头、请求体。如图
1、请求行
请求行分为三个部分:请求方法、请求地址URL、HTTP协议版本。
请求方法
- GET:用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。GET请求参数放在URL里(在浏览器地址栏中可以直接看到),但URL有长度限制(每个浏览器不同),参数数量不能过多。GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求。
- POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。请求数据放在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。POST请求不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。
- PUT:PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。
- DELETE:用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。
- OPTIONS:一般用于客户端查看服务器的性能。这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用 '*' 来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
- CONNECT:该方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
- TRACE:该方法请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。
GET:查询,没有请求体; POST:添加(登录、注册); DELETE:删除; PUT:修改
get和post的区别(面试题)
传参方式不同:get请求没有方法体,请求参数放在URL地址里,浏览器地址栏直接可以看到;post请求的请求参数放在请求体里,相对安全。
不同浏览器对URL的长度有限制,所以get请求的请求参数不能太长;而请求体没长度限制,post请求的请求参数也就不限长度。
post请求不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中;get请求的是静态资源,则会缓存,如果是数据,则不会缓存。
get产生一个TCP数据包;post产生两个。
请求地址URL
http默认端口80,https默认端口443
HTTP协议版本
- HTTP/0.9:这是HTTP最早大规模使用的版,现已过时。在这个版本中 只有 GET 一种请求方法,在HTTP通讯也没有指定版本号,也不支持请求头信息。
- HTTP/1.0:支持 GET、POST、HEAD三种HTTP请求方法。
- HTTP/1.1:新增了 OPTIONS、PUT、DELETE、TRACE、CONNECT 五种HTTP请求方法。该版本默认采用持久连接,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
2、请求头(Request Header)
请求头部用来描述客户端的基本信息,从而把客户端相关的信息告知服务器 。
下面是一个HTTP请求的请求头:
- Accept:表示当前浏览器可以接受的文件类型(如 text/html、*/*表示所有类型)。
- Accept-Encoding:表示当前浏览器可以接受的数据编码,如果服务器吐出的数据不是浏览器可接受的编码,就会产生乱码。通常指定压缩方法,是否支持压缩,支持什么压缩方法(如 gzip,deflate,br)。
- Accept-Language:表示当前使用的浏览语言。
- Connection:keep-active。当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的链接。
- Connection:close。代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭。当客户端再次发送Request,需要重新建立TCP连接。
- Host:用于指定被请求资源的Internet主机和端口号,发送请求时,这个字段是必需的。如:Host: en.wikipedia.org:80
- Referer:当浏览器向Web服条器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。
- User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
- Cache-Control:默认为 private,响应只能够作为私有的缓存,不能在用户间共享。
- Cache-Control:public。响应会被缓存,并目在多用户间共享、正常情况,如果要求HTTP认证,响应会自动设置为private。
- Cache-Control:must-revalidate。响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。
- Cache-Control:no-cache。响应不会被缓存,而是实时向服务器端请求资源。
- Cache-Control:max-age。设置缓存最大的有效时间,但是这个参数定义的是时间大小,而不是确定的时间点。单位是秒。
- Cache-Control:no-store。在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
- Cookie:用来存储一些用户信息,以便让服务器辨别用户身份(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie信息,去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储在cookie里面。
- Range:bytes=0.5。指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。
- Content-Type:指定请求体的数据类型。(要求能默写出来)
3、请求体
请求体中存放的,是要通过POST方式提交到服务器的数据。
注意:只有POST请求才有请求体,GET请求没有请求体。