HTTP基础

Posted by Vane's Blog on December 26, 2020

1. HTTP到底是什么

两种最直观的印象

  • 浏览器地址栏输入地址,打开网页
  • Android中发送网络请求,返回对于内容

HTTP定义:Hypertext Transfer Protocol,超文本传输协议,和 HTML (Hypertext Markup Language 超文本标记语言) 一起诞生,用于在网络上请求和传输 HTML 内容。

超文本,即「扩展型文本」,指的是 HTML 中可以有链向别的文本的链接 (hyperlink)。

2. HTTP 的工作方式

  • 浏览器:

用户输入地址后回⻋或点击链接 -> 浏览器拼装 HTTP 报文并发送请求给服务器 -> 服 务器处理请求后发送响应报文给浏览器 -> 浏览器解析响应报文并使用渲染引擎显示 到界面

  • 手机 App:

用户点击或界面自动触发联网需求 -> Android 代码调用拼装 HTTP 报文并发送请求 到服务器 -> 服务器处理请求后发送响应报文给手机 -> Android 代码处理响应报文并 作出相应处理(如储存数据、加工数据、显示数据到界面)

URL-HTTP

3. URL HTTP 报文

3.1 URL 格式

三部分:协议类型、服务器地址(和端口号)、路径(Path) 协议类型://服务器地址[:端口号]路径

3.2 HTTP报文

报文格式

  • 请求报文

    image-20201226214602528

    image-20201226215419305

  • 响应报文

    image-20201226215918923

3.3 URL转HTTP报文

image-20201226210447093

4. HTTP的请求方法

4.1 GET

  • 用于获取资源
  • 对服务器数据不进行修改
  • 不发送 Body

GET方法不需要提供数据给服务器处理,只是获取服务器的资源,因此不需要发送body。有些公司的GET方法是包含body的,这样做不规范。

规范的写法:

image-20201227100420369

携带body的大致写法:

image-20201227100950056

4.2 POEST

  • 用于增加或修改资源
  • 发送给服务器的内容写在 Body 里面

image-20201227101644353

对应 Retrofit 的代码:

image-20201227101823572

4.3 PUT

  • 用于修改资源
  • 发送给服务器的内容写在 Body 里面

image-20201227102007850

对应 Retrofit 的代码:

image-20201227102258904

修改资源的话,可以用POST,也可以用POST。但有一个区别:

  • POST 不具有幂等性(所谓的幂等性,就是操作一次和操作多次结果是一样的)。举个例子,比如添加用户,多次重复添加相同的用户,在后端是会生成多个重复的用户的。
  • PUT 具有幂等性。

4.4 DELETE

  • 用于删除资源
  • 不发送 Body

image-20201227102356630

image-20201227102426313

4.5 HEAD

  • 和 GET 使用方法完全相同
  • 和 GET 唯一区别在于,返回的响应中没有 Body

HEAD 的响应报文里面没有Body,可以用来获取信息,如在刚开始下载的时候,可以用HEAD 请求,响应的报文的HEADER部分可以看到该下载文件有多大,是否支持断点续传等信息。

5. HTTP响应状态码

三位数字,用于对响应结果做出类型化描述(如「获取成功」「内容未找到」)。

  • 1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)

    100是告诉服务器客户端发送非服务器的文件很大,需要分段发送,告诉服务器需要等客户端完全发送完文件才开始处理。

    101是HTTP1.1和HTTP2.0 协议切换,如客户端的请求报文是HTTP2.0协议,如果服务器支持HTTP2.0,那么会返回101,如果不支持,返回200。

  • 2xx:成功。最典型的是 200(OK)、201(创建成功)。

  • 3xx:重定向。如 301(永久移动,如网站将http改为https后,客户端采用http访问)、302(暂时移动)、304(内容未改变)。

  • 4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁 止)、404(找不到内容)。

  • 5xx:服务器错误。如 500(服务器内部错误)。

6. HTTP的Header

作用:HTTP 消息的 metadata。可以粗略理解为HTTP发送的数据的属性。

6.1 Host

目标主机。注意:不是在网络上用于寻址的(使用DNS寻址的),而是在目标服务器上用于定位子服务器的。

Host理解为虚拟主机,比如阿里云主机上运行多个虚拟主机,需要知道Host才能访问。

当客户端想服务器发起请求时,首先通过 DNS 寻址为真正的 IP的地址,找到目标服务器后,如果目标服务器有多个子主机,目标服务器需要根据请求报文的 Host 来确认客户端想要访问的是哪个子主机。

6.2 Content-Type

指定 Body 的类型。主要有四类:

  • text/html

    请求 Web ⻚面是返回响应的类型,Body 中返回 html 文本。格式如下:

    image-20201227111302793

  • x-www-form-urlencoded

    普通表单。

    Web ⻚面纯文本表单的提交方式。

    image-20201227111346633

    格式如下:

    image-20201227111421250

    对应 Retrofit 的代码:

    image-20201227111442961

  • multipart/form-data

    Web ⻚面含有二进制文件时的提交方式。

    image-20201227111516078

    格式如下:

    image-20201227111545975

    使用WebKitFromBoundary作为分界线,如上图,由两部分组成,一部分是文字类型,一部分是文件类型。

    对应 Retrofit 的代码:

    image-20201227111614110

  • application/json , image/jpeg , application/zip …

    单项内容(文本或非文本都可以),用于 Web Api 的响应或者 POST / PUT 的请求

    请求中提交 JSON

    image-20201227111659752

    对应 Retrofit 的代码:

    image-20201227111722582

    响应中返回 JSON

    image-20201227111739472

    请求中提交二进制内容

    image-20201227111800447

    对应 Retrofit 的代码:

    image-20201227111818976

    相应中返回二进制内容

    image-20201227111839578

6.3 Content-Length

指定 Body 的⻓度(字节)。

6.4 Location

指定重定向的目标 URL。如服务端将http接口改为https后,如果浏览器采用http访问,服务端的响应报文返回301状态码,浏览器会解析Location,Location的值此时是http对于的https网址,然后采用Location的地址再次发起https请求。

如果是Android APP发起请求,是OKHTTP做了浏览器的工作,收到301后再次发起https请求。

6.5 User-Agent

用户代理,即是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。

如:

user-agent:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36

6.6 Range/Accept-Range

按范围取数据

Accept-Range: bytes 响应报文中出现,表示服务器支持按字节来取范围数据

Range: bytes=- 请求报文中出现,表示要取哪段数据

Content-Range:-/total 响应报文中出现,表示发送的是哪段 数据

作用:断点续传、多线程下载。

6.7 Cache

作用:在客户端或中间网络节点缓存数据,降低从服务器取数据的频率,以提高网络性能。即

Cache 与 Buffer 的区别

Cache 是缓存的意思,简单来说,就是一个东西,如资源,这次使用了,但是不释放,而是将其缓存起来,等待后面再次使用。如Android常用的LRU (最近最少)cache算法。

Buffer是缓冲的意思。缓冲是针对工作流的,如上游多生产一些,下游可能来不及处理,可以将生产的东西放到缓冲池里,下游慢慢处理。另一种情景是上游生产慢,但是下游可能在某个时间点需要大量上游生产的东西,那么上游可以提前生产东西,将东西放到缓冲池里面,等下游到时候处理。

image-20201227120757001

6.8 REST

REST 的定义众说纷纭,没有统一答案。 REST HTTP 即正确使用 HTTP。包括:

  • 使用资源的格式来定义 URL
  • 规范地使用 method 来定义网络请求操作
  • 规范地使用 status code 来表示响应状态
  • 其他符合 HTTP 规范的设计准则

6.8 其他 Headers

  • Accept: 客户端能接受的数据类型。如 text/html
  • Accept-Charset: 客户端接受的字符集。如 utf-8
  • Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
  • Content-Encoding:压缩类型。如 gzip

7.Transfer: chunked (分块传输编码 ChunkedTransfer Encoding)

用于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使 用。用途是尽早给出响应,减少用户等待。

网页上显示大图片的时候会逐渐显示图片,就是服务端采用了分块传输。

格式:

image-20201227113946140

举例:

image-20201227113703503