HTTP面试题

HTTP概述

  • 超文本传输协议

HTTPS

  • 在http的基础上增加了ssl层,提供了身份验证和加密通讯方法。http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP的不安全而生的。

非对称加密:

  • 私钥 + 公钥= **对
  • 即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密
  • 因为通信双方的手里都有一套自己的**对,通信之前双方会先把自己的公钥都先发给对方
  • 然后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用自己的私钥进行解密

HTTP的请求报文是什么样的

四部分:请求行,请求头部,空行,请求体
HTTP面试题

  • 请求行包括:请求方法字段、URL字段、HTTP协议版本字段。它们用空格分隔。例如,GET /index.html HTTP/1.1。
  • 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔
  1. User-Agent:产生请求的浏览器类型。
  2. Accept:客户端可识别的内容类型列表。
  3. Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
  • 请求体: post,put等请求携带的数据

HTTP的响应报文

四部分:响应行,响应头,空行,响应体
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 服务器出现错误
  • 服务器出现错误