HTTP请求和响应(补充HTTP协议)

时间:2022-12-07 19:04:51

1.HTTP请求

1.1.HTTP请求中 header 的常见的键值对说明

  • HOST: 域名(IP+端口)
  • Content-Length: body中的数据长度
  • Content-Type: body中的数据格式
  • User-Agent: 用户使用什么东西来上网.(操作系统信息+浏览器信息)
    • 通过这些信息,服务端就可以"区别对待"了.
    • 服务端可以针对信息返回相应的数据
  • Referer: 表示当前页面是从哪个页面跳转过来的.
  • Cookie: 浏览器给页面提供的一种能够持久化存储数据的机制.
    • 持久化指,不会因为程序重启而丢失,写到磁盘里.

1.1.1.Content-Length 的使用

  • 如果当前有若干个GET 请求,到了 TCP 接收缓冲区中了
    • 应用程序读取请求的时候,就以空行为分隔符.
  • 如果当前是有若干个POST 请求,到了TCP 缓冲区了
    • 这个时候.空行后面还有body, 这个时候 Content-Length 就起到作用了.
    • 当应用程序读到空行之后,就需要按照 Content-Length 表明的长度,继续读若干长度的数据.

1.2.请求正文

正文中的内容格式和 header 中的 Content-Type 密切相关.

常见的请求正文格式.

  • application/x-www-form-urlencoded
    • 格式就和 query string 是一样的.
    • 键值对的结构
    • 键值对之间使用 & 来分割
    • 键和值之间使用 = 分割
    • 并且需要进行 url encode
  • multipart/form-data
    • 用于上传文件
  • application/json
    • {}构成的若干键值对
    • 键值对之间使用逗号(,)分割
    • 键和值之间使用冒号和空格(: )来分割

2.HTTP响应

HTTP响应中很多地方都是和HTTP请求类似的.

2.1.HTTP响应中的状态码

响应状态码 状态码描述 状态码解释
200 OK 表示浏览器很顺利的就获取到了想要的内容,没有什么差错.
404 Not Found 表示浏览器要访问的资源不存在.
403 Forbidden 表示要访问的资源是存在的,但是用户没有权限访问.
405 Method Not Allowed 浏览器访问使用的方法,在对方服务器中不支持.
500 Internal Server Error 服务器出问题了,意味着处bug了.
504 Gateway Timeout 服务器繁忙
302 Move temporarily 重定向(服务器返回一个新的地址,浏览器重新访问新的网址)

302 (重定向) 数据报的 header 中就会有一个 Location: 新地址 ,表示要跳转到的地址.因为是重定向数据报,所以这个键值对(Location: 新地址)一般只出现在响应报文中.

2.1.1.状态码分类

  • 2开头,都属于成功
  • 3开头,都属于重定向
  • 4开头,都属于客户端出现错误
  • 5开头,都属于服务器出现错误
  • 特别的状态码:418->是一个彩蛋状态码.

2.2.响应报头(header) 和 响应正文(body)

响应报头(header) 和 响应正文(body) 和请求报头和请求正文是类似的.

3.关于登录

  • 为啥登录,建议使用POST 实现? 使用GET 能不能实现登录呢??
  • 使用GET是完全可以实现登录功能的.为啥还主要使用POST?
    • 因为登录肯定是要给服务器传递用户名和密码
    • 如果使用 GET. 用户名密码习惯上就会放到URL的query string中来传递
      • 此时浏览器的地址栏里的路径,就可能变的很长一串.用户体验就不是很好.
      • 并且如果密码是明文传输.就会直接在地址栏显示密码.同样,用户体验也不是很好.
    • 而POST是放在body中的,相对来说用户使用就比较舒服.
      • 不会在地址栏中展示过多内容.

4.关于 Cookie

浏览器为了安全,默认情况下是不能让页面的js随意访问到用户电脑上的文件系统的.

  • 因为如果某个网页上包含恶意代码.用户不小心点了一下, 就可能触发这个恶意代码, 把用户电脑上的“学习资料"全给删了!

但是这样的安全限制,也给浏览器交互带来了一些麻烦.

  • 有时候,确实又需要让页面这里持久化存储一些数据, 方便后续访问网站.
  • 其中最典型的,就是需要存储用户当前的身份信息.

4.1.由于上述原因,于是就产生了 Cookie 的机制

当用户在登录页面完成身份认证之后, 此时服务器就会给浏览器返回一个用户的身份信息, 浏览器把这个信息就保存到了一个特定的位置上, 后续再访问同一个网站的其他页面的时候, 浏览器会自动的带上这个身份信息. 服务器就能识别了.

  • 当前的浏览器就是采取这样的策略.
  • 虽然不能让页面的js访问用户的整个磁盘数据. 但是可以单独给浏览器分配一个小黑屋.
  • js 代码就可以在这个小黑屋里随便折腾.这里的折腾, 代码不能出小黑屋, 就不会影响到用户磁盘上的其他的学习资料.
  • 这里的小黑屋, 有多种不同的形式.
    • 其中Cookie是一个比较古老,也比较经典的形式.

4.2.Cookie 具体的组织形式

  1. 先按照域名来组织, 针对每个域名, 分别分配一个小房间(小黑屋).
    • 比如浏览器访问搜狗,就会进入搜狗这个域名记录的cookie.
    • 浏览器访问其他网页,又会进入到对应的cookie.
  2. 一个小房间里,又会按照键值对的方式来组织数据.
    • Cookie数据的来源:服务端返回给客户端的.