Http | 工作机制

HTTP 是什么

​ 用于传输超文本的协议,以前是 HTML ,现在也包括 Web API 的数据。

HTTP 的工作方式

​ 最直观的方式:地址栏输入地址,然后页面就会显示结果

​ 实际上是:在地址栏输入地址,回车后就会向服务器发送请求,然后服务器会进行响应,接着浏览器就会将响应的数据进行渲染出来

在这里插入图片描述

URL -> HTTP 报文

  • 示例:http://www.baidu.com/s?cl=3
    • 其中 http 为协议类型,协议类型都有 http,ftp 等等,这些叫做应用层协议
    • //www.baidu.com 为服务器地址
    • /s 及其后面的为 路径 path

上面这个地址看起来是一个地址,但是浏览器拿到后会分为三块进行处理,处理完成后如下所示

  • GET /s?cl=3 HTTP/1.1

    Host :www.baidu.com

HTTP 的工作方式

报文格式:Request

在这里插入图片描述

其中第一行为:请求行 ,分别对应三个部分,

  • 第一部分 method ,他可以为 GET ,POST ,PUT 等,代表你的行为
  • 第二部分:path ,路径,给服务器看到,定位
  • 第三部分:版本

第二行往下为 headers

​ 其中左边是键,右边是值

最后一行为 body

​ 在 get 中是不需要 body 的。而在 post 中则需要使用 body了,body 中是你需要向服务器提交的一些数据

报文格式:Response

在这里插入图片描述

其中第一行为状态行

  • 最开始为 http 的版本
  • 中间是 status code,状态码
  • 最后是状态信息 status message

中间的是 headers

​ 左边是键,右边是值

最后一行为 body

​ 服务器返回的数据

关键内容

  • Request method

    请求的方法:如 get,post,put 等

    • GET

      获取资源,不会携带 body

    • POST

      增加或者修改资源,有 body

      //请求行
      POST /users  HTTP/1.1
      //headers
      Host:192.168.43.253
      Content-Type:text/html; charset=UTF-8
      Date:Mon, 15 Jun 2020 13:20:08 GMT
      //body
      {
              
              
          "name": "456",
          "password": "12345"
      }
      
    • PUT

      修改资源,只用来修改,有 body

      和 get 的共同点:他们都是幂等的。意思就是他们的结果是相等的。例如获取资源,获取10 次结果都是一样的,执行多次和执行一次是一样的

    • DELETE

      删除资源,没有body,具有幂等性,删除一次和删除多次没区别

    • HEAD

      和 GET 几乎一样,区别就是服务器不会返回 body。

  • Response status code

    对结果做出类型化的描述,如果获取成功,内容未找到等

    • 1xx:临时性消息
    • 2xx:成功
    • 3xx:重定向,会进行二次请求,进行请求后会重新定向,接着就会重新请求请求,这个过程感知不到的,但是可以通过状态码来查看到。301 永久性迁移,302 临时迁移,304 内容没有改变
    • 4xx:客户端错误,如 400参数错误,404 资源未找到等
    • 5xx:服务器错误
  • header

    作用

    • HTTP 消息的元数据(metadata)

    • HTTP 中的元数据:例如同 http 提交一个用户信息,信息中的 name,age 等都是数据本身,他们并不是元数据。元数据是消息的长度,消息的格式,返回的数据集,有没有压缩等。可以看做为数据的属性

    比较常见的

    • Host:服务器地址,但是他不是用来寻址的。在浏览器将报文拼好之后,在发出请求之前就已经去进行服务器的寻址了,他会拿着域名通过 DNS 去寻找对应的 ip 地址。一个域名可能会对应多个 ip 地址。找到对应的目标服务器地址后就会将报文发给目标服务器。既然都找到服务器了,为啥还要发送 host 呢?因为一个 ip 地址下面可能会有多个服务器存在,他们对外的ip 都是一样的,当寻找到 ip 进行访问的时候就没办法转到具体的主机,这个时候就没办法正确的响应。所以需要传入 host,这个 host 一般传入的是服务器地址+TCP 端口。

    • Content-Type/Content-Length:Body 的类型/长度(字节)

      • text/html

        Content-Type:text/html; charset=UTF-8
        
      • application/x-www-form-urlencoded:普通表单,encoded URL 格式

        例如使用 Retrofit 的 post 请求是,需要使用 @FormUrlEncoded ,这种就是表单提交

        而且如果要传文件,还需要使用 @MultPart

      • multpiipart/form-data ; boundary = ********************

        多补发形式,一般用于传输包含二进制内容的多项内容

        使用 Retrofit 就需要使用 @MultPart

        boundary 是一个分界线,用来分界 header 值得各个属性和 body

      • application/json

        json 形式,用于 Web Api 的响应或者 POST/PUT 请求

        body 中是 json 格式

        使用这种方式进行post 请求的时候 body 中的内容可以为 json 格式,好处就是格式比较自由。

      • image/jped

        图片上传

    • Location:重新定向的目标 URL

    • User-Agent:用户代理

    • Range/Accept-Range:指定 Body 的内容范围

      如果你的服务器支持你分段取内容/下载 的时候,指定的范围

      例如:从百度上复制一个图片地址到 postMan 中进行求,就会加载出图片,接着你在查看他的 headers,就会找到 Accept-Ranges 这个值如下

      Accept-Ranges:bytes
      

      这表示他是支持分段加载的

      我们在请求这个图片的时候在header 中加上如下属性:

      Range:bytes=0-15000
      

      你就会发现这个图片只被加载了一半在这里插入图片描述

      那么他又什么作用呢?1,断点续传,如果下载中断,那么下一次下载的时候只需要指定开始的位置和文件的大小即可。2,分段下载,可以用来多线程下载

    • Cookie/Set-Cookie:发送 Cookie /设置 Cookie

    • Authorization:授权信息

    • Accept:客户端能接受的数据类型

      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
      
    • Accept-Charset:客户端能接受的字符集,如 utf-8

    • Accept-Encoding:客户端能接收的压缩编码类型,如 gzip

    • Content-Encoding:压缩类型,如 gzip

    • Cache-Control:no-cache,no-store,max-age,

      • Cache 和 Buffer 的区别:**Cache:**缓存,这个东西创建好我已经用完了,但是等会可能还会使用,所以我把这个东西继续放在这里。**Buffer:**缓冲,从来都是针对工作流的。有生产的上游和消费的下游,上游多生产一些,给下游稍后使用,这个叫做 Buffer,一般是两个原因,1,上游生产太快,下游跟不上,2,下游现在不需要,等会在进行消费。
      • no-cache:你可以缓存,当再次使用的时候需要问一下服务器资源是否失效。对于需要向服务器询问的有两类,1,资源是否改变:Etag,2,指定的日期是否到达:Last-Modified
      • no-store:不可以缓存
      • max-age:失效日期直接就可以直接使用
      • private/public:我们在请求的时候并不是从客户端直接连接到服务端,中间还会有一些节点,例如 网关等很多中间节点。private 和 public 的意思是告诉这些中间的节点是否要缓存这个消息,不只是本地机器可以缓存,中间的节点也可以帮助你进行缓存。public 就可以进行缓存,private 则不能缓存
    • Last-Modified:服务器传过来文件的时候会告诉文件最近修改的日期,当你再次需要这个文件的时候就去请求服务器并且判断一下这个修改日期是否发生了改变,如果没有改变,则表示文件是最新的。

      • if-Modeified-Since:是否在什么之前改动过
    • Etag:对比文件本身,在从服务器获取文件的时候会附加得到一个 tag,下次获取的时候问一下服务器这个 tag 是否为最新的即可

      • if-Noe-Match:最新的资源还是这个 tag 吗
  • body

    要发送给服务器的内容,和服务器返回的数据内容

一下这个修改日期是否发生了改变,如果没有改变,则表示文件是最新的。

  - if-Modeified-Since:是否在什么之前改动过
  • Etag:对比文件本身,在从服务器获取文件的时候会附加得到一个 tag,下次获取的时候问一下服务器这个 tag 是否为最新的即可

    • if-Noe-Match:最新的资源还是这个 tag 吗
  • body

    要发送给服务器的内容,和服务器返回的数据内容

如有问题,还请指出,谢谢

Guess you like

Origin blog.csdn.net/baidu_40389775/article/details/106791029