HTTP面试题
HTTP概述
- 超文本传输协议
HTTPS
- 在http的基础上增加了ssl层,提供了身份验证和加密通讯方法。http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP的不安全而生的。
非对称加密:
- 私钥 + 公钥= **对
- 即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密
- 因为通信双方的手里都有一套自己的**对,通信之前双方会先把自己的公钥都先发给对方
- 然后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用自己的私钥进行解密
HTTP的请求报文是什么样的
四部分:请求行,请求头部,空行,请求体
- 请求行包括:请求方法字段、URL字段、HTTP协议版本字段。它们用空格分隔。例如,GET /index.html HTTP/1.1。
- 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔
- User-Agent:产生请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
- 请求体: post,put等请求携带的数据
HTTP的响应报文
四部分:响应行,响应头,空行,响应体
- 响应行: 由协议版本,状态码和状态码的原因短语组成,例如HTTP/1.1 200 OK。
- 响应头:响应部首组成
- 响应体:服务器响应的数据
方法种类
- GET:获取资源,幂等操作
- HEAD:获取报文首部,和GET很像但是不返回报文主体,幂等操作
- POST: 创建或更新资源,非幂等操作
- PUT: 创建或更新资源本身,幂等操作
- PATCH:对资源进行局部更新,非幂等操作
- DELETE:删除资源,和PUT功能相反,幂等操作
- OPTIONS:查询服务器端支持的HTTP方法种类(幂等操作):
幂等
- 如果一个方法重复执行多次,产生的效果是一样的,那这个方法就是幂等的
- GET用于获取资源,不应该有副作用,所以他是幂等的。例如GET:https://via.placeholder.com/150 不会改变资源的状态,无论是调用1次还是N次都没有副作用。但是要注意,并不是每次GET的结果都相同,因为有可能直接去改了数据库的这条数据,拿下次获取到的可能就不一样了,但是他本身并没有产生副作用。
- HEAD和GET情况一样,只不过他用来获取报文首部,不返回报文主体,所以也是幂等的。
- POST和PUT很容易混淆,都可以用来创建和更新资源,本质差别在幂等性上。POST所对应的URI并非创建资源的本身,而是资源的接收者。如:POST http://kaba.com/articles
的语义是在http://kaba.com/articles 下创建一个文章,HTTP响应中应包含帖子的创建状态和帖子的URI。POST两次会创建两个不同的资源,具有不同的URI,所以POST是非幂等的。
- PUT方法:创建或更新资源本身,幂等。例如PUT http://kaba.com/articles/123 的语义是创建或更新id为123的帖子,第一次PUT执行后,其在服务器上生成的资源不能被后续的PUT更改,所以对同一URI进行多次PUT的副作用和一次PUT是一样的,因而是幂等的。
- PATCH方法:和PUT都是更新资源,PATCH用来对已知资源进行局部更新。
- DELETE用于删除资源,有副作用(会修改服务器上的资源内容),但他是幂等的。因为例如DELETE http://kaba.com/articles/123 调用一次和N次产生的副作用是相同的,都是为了删掉id为123的文章,因而是幂等的。
- OPTIONS 幂等的。获取服务器支持的方法,我知道的一般是使用了代理,然后进行预请求的时候会用到。
面试时答法:
一个方法是不是幂等,其实就是判断一个方法重复执行多次,产生的效果是不是一样的,如果是幂等的话,它本质上意味着成功执行请求的结果和它的执行次数无关。我所知道的,只有「POST」和「PATCH」是非幂等的,其它都是幂等操作。
GET和POST区别
- 从缓存的角度上说,GET会被浏览器主动缓存下来,留下历史记录,但是POST不会。
- 从编码的角度上说,GET只能进行URL编码,它只能接收ASCII字符,但是POST没有限制。
- 从参数的角度上说,GET一般放在URL上传递参数,POST放在请求体里,更适合传递敏感信息。
- 从幂等的角度上说,GET是幂等的,而POST不是。
- 不过据我了解的,其实GET和POST本质上都是TCP连接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致它们在应用过程中体现出一些不同。
- 还有可以从TCP的角度上说,GET请求会把请求报文一次性发出去,但是POST会分为两个TCP数据包。首先发送的是header部分,若是服务器响应100(continue),则会发送body部分,当然「火狐」浏览器除外,它的 POST 请求只发一个 TCP 包。
这时候面试官可能还会追加着问你:既然POST要分为两个TCP数据包发送,那GET是不是会比POST更有效?
回答:
- 首先,GET和POST都有它们自己的语义的,最好不要混用
- 另外,虽然说POST会分为两个数据包发送,但是其实在网络条件好的情况下,发一次包和发两次包的相差的时间基本可以被无视了。并且在网络条件差的情况下,两次包的TCP在验证数据包的完整性上还有更大的优点。
- 再者,也并不是所有的浏览器的POST请求都会发送两次TCP数据包的,比如火狐就不会。
HTTP状态码
1xx 信息性
- 请求已经接收到,需要进一步处理才能完成,但是HTTP/1.0 不支持
2xx 成功状态
- 成功处理请求
3xx 重定向
- 重定向状态,资源位置,需要重新请求。
4xx 客户端错误
- 客户端错误
5xx 服务器出现错误
- 服务器出现错误