目录
3、HTTP请求的两种方法(get和post)及区别 (面试题)
1、HTTP是什么
HTTP协议是在Web上进行数据交换的基础,是一种"客户端-服务器端"(B/S 架构)协议。作用于应用层。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
HTTP 是一个简单的请求/响应协议,通常运行在 TCP(Transmission Control Protocol 的简称,是一种面向连接的、可靠的、基于字节流的传输层通信协议)之上。HTTP 协议指定了客户端能够发送什么样的消息给服务端,以及服务端要做出怎样的响应。服务器会默认监听 TCP 协议的 80 端口,当然后期您也可以修改为其它端口。
HTTP 协议为计算机之间的通信提供了一种标准和规范,它规定了:
- 如何构造客户端的请求数据(也称报文);
- 如何将请求数据发送到服务器;
- 服务器端如何响应客户端的请求。
2、HTTP请求与响应
客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。
- 由像浏览器这样的客户端发出的消息叫做请求( requests )
- 被服务端回应的消息叫做响应( responses)
3、HTTP请求的所有方法:
- HTTP1.0 : 三种:post,get,head
- HTTP1.1: 八种:post,get,head,options,put,delete,trance,connect
4、HTTP请求的两种方法(get和post)及区别 (面试题)
区别:其实本质上没有太大区别,但非要说个区别,如下:
- get请求一般用来请求获取数据,post请求一般作为发送数据到后台,传递数据,创建数据。例如登录,上传等。
- get请求也可以传参到后台,但是传递的参数则显示在地址栏,安全性低,且参数的长度也有限制(2048字符),post请求则是将传递的参数放在request body中,不会在地址栏显示,安全性比get请求高,参数没有长度限制
- get请求刷新浏览器或者回退没有影响,post请求则会重新请求一遍
- get请求可以被缓存,也会保留在浏览器的历史记录中,post请求不会被缓存,也不好保留在浏览器的历史记录中
- get请求通常是通过url地址请求,post常见的则是form表单请求
- get产生一个tcp数据包,post产生两个tcp数据包
- get产生的URL地址可以被Bookmark,而post不可以
- get请求会被浏览器主动cache(缓存),而post不会,除非手动设置
- 对参数的数据类型,get只接受ASCII字符,而post没有限制。
- get比post更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET 和 POST都是http请求方式, 底层都是 TCP/IP协议;通常GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(但firefox是发送一个数据包),
- 对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)表示成功;而对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服务器响应 200 (返回数据)。
5、几种常见的错误的说法
1.get请求能传递的数据量有限,post传递的数据量没有上限。
- 但是标准文档中并没有明确规定URL有多长。
2.get请求数据不安全,post请求数据更安全。
- 依据是:若使用get实现登录操作,用户名和密码会暴露在URL中,也就是地址栏里。人们可以看到。而使用post操作则是把用户名和密码放在body中,不会在地址栏里显示。
- 但其实这种说法也是有问题的,所谓的安全是是指不容易被黑客获取,或者是获取之后不容易被破解。
3.get只能给服务器传输文本数据,post可以给服务器传输文本和二进制数据。
- get也是可以传输二进制数据的。
4.get请求是幂等的,post请求不是幂等的。
- 这里的幂等指的是输入相同的内容,输出是稳定的。这种说不也不完全对。
6、HTTP协议的特点
1) 简单快速
- HTTP 协议支持客户端、服务器端模式,简单快速,当客户端向服务器端发送请求时,只需要传送请求方法和路径即可,常用的请求方法有 GET、HEAD、POST 等,每种方法都定义了客户端与服务器之间不同的信息交换方式。
2) 灵活
- HTTP 允许传输任意类型的数据对象,包括音频、视频、图片、文本等等。
3) 无连接
- HTTP 是无连接的,当服务器接受到来自客户端的请求后,会按顺序依次处理这些请求,处理完成一个就关闭一个,然后开始处理下一个请求。无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,随即断开连接,采用这种方式可以节省传输时间。
4) 无状态
- HTTP 协议是无状态协议,无状态是指协议对于信息的处理没有记忆能力。也就是说来自同一个客户端的多个请求之间没有上下文关系,每次的请求都是独立的,一次请求的执行情况和结果与它前面的请求或后面的请求没有直接关系。
- 服务器中并不会保存客户端的状态,也就意味着如果后续处理中需要用到前面的信息,那么您就需要将它重新发送到服务端,这样可能会导致每次连接传送的数据量增大。但从另一方面来讲,如果服务器不需要先前信息时它的响应就会比较快。
7、应用场景
(1)网页和后台服务器的交互。
(2)app和后台服务器的交互。
8、HTTP报文格式
HTTP报文,又称为HTTP消息,是服务器和客户端之间交换数据的方式。有两种类型的消息︰请求,由客户端发送用来触发一个服务器上的动作;响应,来自服务器的应答。
8.1 请求
请求报文由以下元素组成:一个HTTP的method、要获取的资源的路径、HTTP协议版本号、为服务端表达其他信息的可选头部headers以及对于一些像POST这样的方法。具体格式如下:
- 首行:方法 URL 版本号
- 请求头(header)键值对形式
- 空行
- 正文(body)
接下来主要说说请求里的响应header。
- Host: 表示服务器主机的地址和端口。
- Content-Length : 表示body中的数据长度,前提是请求里有body。
- Content-Type:表示请求的body中的数据格式,前提是请求里有body。
- **User-Agent:**描述了使用啥设备上网(操作系统版本及浏览器版本),可以去区分是PC端还是手机端。
- **Referer:**表示当前页面是从那个页面跳转过来的。
- cookie:由于HTTP是无状态的。没有记忆的。但在某些场景中,我们希望有些数据可以被重复使用,比如登录操作的用户名和密码。于是产生了一种会话技术,存储一些信息到浏览器中。它由服务器产生,响应中携带cookie,并且要求保存在客户端(通常指浏览器)。
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
- ...............
通常情况下,get请求没有body,post请求有body。
为什么要有空行和Content-Length?
目的是为了解决粘包问题。因为HTTP也是基于TCP的,TCP是以字节为单位传输的,传过去之后,接收方数据包都紧挨在一起,接收方也识别不出哪到哪是body,这样就需要用空行来区分body,再用content-Length来区分body中数据的长度。
8.2 响应
响应报文由以下元素组成:HTTP协议版本号、一个状态码、一个状态信息、HTTPheaders以及包含获取的资原body。
- 首行:版本号 状态码 状态码信息
- 响应头(header)键值对形式
- 空行
- 正文(body)
Content-Type的作用:
返回此次响应的数据格式。
构造请求(get,post)有json,form表单的格式,from-data的格式,ajax也能构造get和post请求。
响应有html,css,js,json,图片,text等数据格式。
9、面试题:HTTP常见的状态码都有哪些?
状态码:服务器的响应,表示了这次请求对应的响应是啥样的状态。
- 2开头的表示成功,其中200最常见。
- 3开头的表示重定向,比如我访问某个网址,他就会让我访问另一个网址,并在响应报文中携带这个新的网址。301是永久重定向,302是临时重定向。
- 4开头的是请求有误,比如网址输入错误等,其中404表示访问资源在服务器上不存在。403表示访问没有权限,禁止访问。
- 5开头的是服务器出错。