HTTP 的概念、原理、工作机制、数据格式

1,390 阅读4分钟

发起一个http/https请求是一个前端开发经常在做的事情,但是大多数时候我们只是用别人二次封装过的框架,我们知道请求地址,请求参数,处理返回结果,比如android用的Retrofit就直接返回我们定义好的一个数据结构bean。这就好像一个黑盒,我们知道输入输出,但是不知道过程中发生了什么事情,那么,你想知道吗?

我们先来看看当我们发起一个网络请求的时候,我们发送了什么东西:

请求报文

  • GET /users HTTP/1.1
  • Host: api.github.com
  • Content-Type: text/plain
  • Content-Length: 243
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody

可以看到一个请求报文大致分三部分:请求行HeadersBody

请求行

请求行包含三部分信息,method(get/post等)、path(除了域名之外的路径)、HTPP version(HTTP协议的版本)。

Headers

Headers是一个metadata,元数据,类似于java中的元注解,元注解用于描述注解,元数据用于描述数据,Headers事实上是对body的描述,比如上面的三个head分别描述了,此次请求的域名,数据类型,数据长度等等。

Body

主体数据可以由很多种,配合Content-Type,可以发送json( application/json ),或者html(text/html ),或者表单( x-www-form-urlencoded ),二进制文件( multipart/form-data )等等,body也可以为空,比如get请求后者delete请求的body就是空的。

服务器响应我们的请求又给我们返回了什么东西:

响应报文

  • HTTP/1.1 200 OK
  • Content-Type: text/plain
  • Content-Length: 243
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody
  • bodybodybodybodybodybodybody

可以看到一个响应报文大致分三部分:状态行HeadersBody 其他两部分跟请求报文类似,我们看一下状态行

状态行

状态行也包含三部分信息,HTPP version(HTTP协议的版本)、status(一般成功为200)、message(自定的描述信息)。

Method

常用的请求方法有GET/POST/PUT/DELETE/HEAD等等,当然还有其他的,但是我们就只介绍这些:

其中HEAD跟GET看上去没有什么区别,实际上除了没有返回Body之外,HEAD和GET完全一样,比如有些场景你想先测试这个接口,或者想先拿到Headres进行判断之后再确定要不要发起GET请求拿数据,就可以用HEAD。

Headers

Content-Type/Content-Leanght

数据类型和数据长度。

Transfer-Encoding

Content-Leanght并不总是有效的,当存在Transfer-Encoding:chunked时,Content-Leanght就是无效的,Transfer-Encoding标识告诉服务器,数据是分块传输,服务器可以在拿到前面的数据时,先进行耗时性操作,等到请求数据传输完成之后,可以更快得对客户端进行响应,这是一种提高接口效率的方法。

Location

重定向的地址,当响应报文中状态行的status为301(不一定只是这个),表示需要重定向,客户端则重定向到Location这个新的地址。

User-Agent

用户代理,这个head告诉服务器是什么设备在进行请求,比如一个网页,就可以根据手机浏览器或者电脑浏览器去返回不同的html,达到适配的效果。

Range/Accept-Range

通过这个head我们可以取指定某部分的数据,当响应报⽂文中出现 Accept-Range: bytes ,表示服务器支持按字节来取范围数据; 请求报⽂中给出 Range: bytes=start-end ,表示要取哪段数据;响应报文中出现 Content-Range:start-end/total ,表示发送的是哪段数据。 我们可以用它来做断电续传,多线程下载等

Cookie/Set-Cookie

Cookie是一个逐步被弃用的东西,它本质是一个本地存储机制,服务器返回Set-Cookie给客户端,客户端保存下来,然后每次请求都在Cookie中携带发过去,早期用来做登录、做购物车,也用于做用户偏好。

Authorization

用来取代Cookie做登录的东西的,我们现在常用的第三方登录用的就是它。

Accept

告诉服务器,客户端能接受的Body类型,跟Content-Type类似。

Accept-Charset

告诉服务器,客户端能接受的字符集。

Accept-Encoding

告诉服务器,客户端能接受的压缩编码,比如gzip。

Content-Encoding

压缩方式。如gzip。

状态码status

  • 1xx:临时消息(100 可能数据太大,客户端发送【Expet:100-continue】,请求服务器返回100,让我分多次发送数据的机会,返回100说明请你继续发)
  • 2xx:成功(200:请求成功)
  • 3xx:重定向(301:永久迁移,原来网站的访问都会被转移过来)
  • 4xx:客户端错误(404)
  • 5xx:服务器错误

了解状态码的意思,起码以后知道什么情况下要找后台处理,什么情况要自己先排查。