HTTP Request In Browser

日常开发中和服务器进行数据交换我们会发起 HTTP 请求,比较传统的做法是使用 XMLHttpRequest,也出现了很多基于 XMLHttpRequest 封装的比较不错的库如axios,或者使用较为新的 Fetch。本篇文章从 HTTP Messages 出发(关于 HTTP Messages 详见之前的文章),讲述 XMLHttpRequest 和 Fetch 两种方式下 Request 和 Response 组成内容对应的属性或方法,以及两种方式比较重要的配置项,最后探讨一下两种方式的优缺点。

Read more

HTTP Headers

上一篇我们对 HTTP 做了整体的介绍,主要介绍了 HTTP 不同版本的区别以及 HTTP Messages 相关的 Method,Status 和 Reason Phrase。这篇文章我们将重点放在 Headers 上,谈一谈 Headers 相关的 API 以及日常开发中涉及到的内容。

The Headers Interface

Headers 在浏览器环境下是有相关的 Interface 的,常和 Fetch API 结合使用。Headers 实例内部部署了 Iterator,所以可以使用for...of来遍历,相关的方法从字面意义上都很好分辨用途,如下所示:

  • append(name,value): 添加一个 name 对应的新值,如果 name 存在则在原来的 value 上追加新值,用逗号隔开
  • set(name, value): 添加一个 name 对应的新值,如果 name 存在则覆盖原来 name 对应的 value,所以更推荐使用set来添加新值
  • get(name): 返回 name 对应的 value
  • delete(name): 删除 name 及其对应的 value
  • has(name): 判断 name 是否存在
  • keys(),values(),entires(): 返回对应的迭代器用于遍历

Headers Interface 为我们提供了一整套维护 Headers 的机制,并且可以很方便的遍历其中的内容,所以推荐使用HeadersInterface 来维护需要的 Headers。

在使用Headers Interface 时需要注意,大写的 name 会自动转为小写,因为 HTTP 规范中明确 Headers 是大小写不敏感的,并且 HTTP/2 只支持小写的 Header name。

Read more

HTTP Overview

作为 HTTP 系列文章的开篇,我们先快速回顾一下 HTTP 的发展史:

  • HTTP/0.9: 只支持 GET 请求,并且没有 Headers 的概念,并且只能返回 HTML
  • HTTP/1.0: 增添了 POST 以及 HEAD 请求,增添了状态码以及 Headers 的概念,依托于 Headers,可以返回除 HTML 文件之外的内容。HTTP 相关的基础内容在这个版本基本添加完毕,但是还存在无法连接复用以及请求只能排队发送的问题。
  • HTTP/1.1: 增添了 PUT,DELETE,TRACE,OPTIONS,PATCH,CONNECT 请求,增加了缓存的相关的 headers,增加了 headerConnection:keep-alive解决了连接复用问题,同时请求可以同时发送,并且增加了断点续传功能。这个版本增加了缓存以及连接复用等优化点,是目前很多网站最常使用的版本。但是还是不能解决队头堵塞的问题(虽然请求可以同时发送了,但是响应还是按照请求发送的顺序依次返回)
  • HTTP/2: 将原先的文本传输改为二进制格式传输(二进制分帧),同时共用一个 TCP 连接,并且请求和响应没有顺序的概念(多路复用)。并且将请求头部压缩,同时服务端可以主动推动消息给客户端。总的来说HTTP/2做了很多传输方面的优化。
  • HTTP/3: 弃用 TCP 协议,改为基于 UDP 协议的 QUIC 协议,主要解决队头堵塞的问题,目前还处于草案阶段。
Read more