HTTP 的一些基本概念

前言(废话)

今天同事说电话面试遇到了一些http相关的问题,在这里记录一下。(梳理完发现确实有很多遗漏的知识点


主题

今天主要分以下五个主题

  1. HTTP是什么
  2. 超文本传输协议
  3. HTTP中常见字段
  4. HTTP请求中的各种状态码
  5. HTTP中的GET和POST

HTTP是什么

HTTP HyperText Transfer Protocol,超文本传输协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。

面试官问完一般我们都说HTTP是一个超文本传输协议,那么超文本传输协议具体要怎么讲呢?

超文本传输协议

这个超文本传输协议要分成 超文本 传输 协议 分开来讲。

协议

类似于现实中的交易合同定价协议,做手术也有家属签手术协议书等等,这里的协议指的是在 双方(或者多方) 都允许的情况下,他们可以做一些协议内允许的操作。 那么网络里面也会有网络的协议,在网络双方都同意的情况下,它们就可以建立连接并 传输 数据。

传输

其实HTTP是一种双向协议

传输的话,其实很好理解,简单来说就是 客户端a服务端b 签订了协议后,可以开始传输数据了,这里的数据其实就是 超文本 ,可以理解为客户端a请求服务端b(告诉服务端b我要访问你这个网站了),完了服务端b收到请求后觉得这个请求我可以接受,就响应了相关的数据(这里的数据可以看成是文字,图片,视频等等啊)给到客户端a

对于传输的话其实还有许多可以讲的地方,不过目前就大概了解一下就好了,主要是对HTTP有个大概的概念吧。

超文本

那这样就更好理解 超文本 了,其实就是数据嘛,普通文本大家是知道的就是文字啊什么之类的, 超文本 的话其实就是多了图片,视频等等而已。

总结一下

HTTP是一个在网络中专门在 [ 两点 ] 之间 [ 传输 ] 文字、图片、视频 [ 超文本 ] 数据的 [ 约定和规范 ]。


HTTP中常见字段

其实就是说的是一个标准的HTTP请求里面应该会包含什么玩意儿。(其实浏览器按f12对应的network也可以看到的(不过有点改造过的感觉,跟文本差点意思(不过也差不多啦)))

现在大概写一下HTTP的请求报文段:

GET index.html /http/1.1
Host: www.baidu.com
Accept: /
Connection: keep-alive
Content-Type: text/html; charset=utf-8

大概就长这样吧,这里的话最好记一下怎么手撸这个报文段,我之前面试就栽在这里过一次,忘记怎么写了。。完了具体每个是什么意思可以自己百度看看(太懒了(估计直接看也看得懂吧))。


请求中的各种状态码

状态码 由服务器发出,以响应客户端对服务器的请求(简单来说就是告诉你这次请求到底调用ok了还是挂了)。
这里简单说一下4xx5xx相关的状态码(我只遇到过这两个,别的也说不大清楚)。

4xx 客户端错误

主要记录一下我自己遇到的比较常见的4xx类型的状态码

400 Bad Request

这个是比较通用的客户端错误状态,当其它4xx不适用的时候,就用这个。
例如,格式错误的请求语法,大小太大,无效的请求消息或欺骗性路由请求,服务器不能或不会处理该请求。

403 Forbidden

403错误是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。

简单来说就是服务端觉得客户端的权限不对,所以不给你调用

404 Not Found

客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应,且不知道原因所返回的页面。

简单来说就是访问了一个根本不存在的页面

405 Method Not Allowd

请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。

简单来说就是我服务器对于这个地址只提供了GET,完了你用POST来访问,那我肯定只能给你405

415 Unsupported Media Type

对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。

简单来说就是请求的body对应的格式在服务端不支持,所以给你415

5xx 服务端错误

这里5xx的错,都是服务端出的问题,所以报500甩锅后端就完事了,大后端会勉为骑男地处理你的问题的。

ps: 这里要说一下,如果还有在服务端自己手动处理客户端响应的状态码的,会有一些问题,经常有一些工程师没有正确的响应对应的状态码是不对的(简单来说就是遇到啥都是500给你),希望看到这里的大佬们可以有自己的一套规范的做法,这样也有助于自己对http的理解嗯!

500 Internal Server Error

这是一个通用的服务器错误响应。对于大多数web框架,如果在执行请求处理代码时遇到了异常,它们就发送此响应代码。

简单来说服务端报异常了(各种Exception)。

502 Bad Gateway

只有HTTP代理会发送这个响应代码。它表明代理方面出现问题,或者代理与上行服务器之间出现问题,而不是上行服务器本身有问题。若代理根本无法访问上行服务器,响应代码将是504。

简单来说客户端调用了某方法,代理访问对应服务器找不到该方法,代理就会给客户端返回一个502

503 Service Unavailable

(服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

我这里遇到的这种情况,一般都是在服务重启的时候访问了相应的方法,才会遇到这个503的报错。

504 Gateway Timeout

(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

接口超时,代理没有办法收到服务器的响应了。


HTTP中的GET和POST

这也是面试经常问的基础到不能再基础的题了(不过没整理知识点之前的我好像也说不出个啥来(小声bb))

这里的话针对几个面试常问的问题作为解答

GET和POST的区别

  • GET的参数是拼接在url上的, 而POST的参数是写在body里面的。
  • GET的参数只支持ASCII字符, 而POST的参数是可以支持各种类型的(请求的时候的Content-Type)。
  • GET的效率比POST高。
    1. GET有缓存,而POST调一次就是一次请求。
    2. GET调用的过程:
      1. 客户端请求tcp连接。一次握手
      2. 服务端同意tcp连接。两次握手
      3. 客户端确认,并发送GET请求头和数据。三次握手的同时发送数据
      4. 服务端处理并响应200状态码还有数据。
    3. POST调用的过程
      1. 客户端请求tcp连接。一次握手
      2. 服务端同意tcp连接。两次握手
      3. 客户端确认,并发送POST请求头。三次握手的同时发送请求头(注意一下这里只发送了请求头)
      4. 服务端确认了客户端请求头后返回100的状态码作为响应。
      5. 客户端收到状态码后继续发送数据。
      6. 服务端处理并响应200状态码还有数据。

这里参考网上的做了下总结,简单来说就是GET请求只有一次TCP调用,POST请求需要两次TCP调用,还有部分POST是有用1次调用的,比如火狐浏览器,不过说到这里我觉得面试官应该不会为难你的(比如说我),最主要的是能理解嘛。

  • GET请求的数据是有大小限制的(取决于你的浏览器,一般2-4k以下),而POST理论上没有限制。
  • 显而易见的就是POST比GET安全多了呀,GET请求参数都明摆着丢在url里面了,想不看都不行QvQ。

所以一般显示网页,或者一些商品搜索等等,获取数据展示给用户看的啊什么就用纯GAY的请求,哦哦哦是纯GET请求,而那些需要操作到数据的啊,例如保存,修改,删除之类的都是用POST请求(起码参数没明摆着给你看)。

总结

这里只是大概的介绍了一下GET和POST,关于HTTP还有很多继续往下讲解的地方,不过感觉说多了也不好吸收,先大概有个框架,后面会继续细讲通过HTTP往后延申的相关知识点。

猜你喜欢

转载自juejin.im/post/5e664ce5e51d4526e8080116