Luna Tech | HTTP 入门

October 2, 2020 字数 2882 6 min


0. 前言

之前提到我最近完成了一个 API Integration 相关的模块,功能正式上线了,也到了总结知识的时候啦~

因为涉及到的知识点比较多,我会分几篇文章先讲理论部分,然后再总结一下我需要完成的需求,以及实现过程中踩过的一些坑。

今天我们先来聊聊 HTTP。


1. HTTP

HTTP 是什么

HTTP 是 HyperText Transfer Protocol 的简称,中文名是「超文本传输协议」。

顾名思义,它就是一个协议。

协议的双方(假设是两台电脑)都需要用 HTTP 规定的方式来说话,这样两边就能听懂对方在说什么了(就好比你跟别人沟通要讲同一种语言一样)。

HTTP 是专门为互联网系统之间的沟通而设计的一种协议,属于 Application Layer (应用层)协议,5 层网络模型中的最上层。

5 层网络模型本文不展开讲解。

5 层网络模型
5 层网络模型

HTTP 核心概念

HTTP 是一种 client-server protocol,采用的是 client-server model(客户端/服务器架构,又名 C/S 架构、主从式架构)。

PS: Email 和互联网(World Wide Web)采用的也是 client-server model。

Client-server model 是一种 distributed application structure(分布式应用架构),属于 Distributed Computing 分布式计算这个领域。

Parallel Computing vs Distributed Computing

Parallel Computing System(并行计算系统)- 多个处理器,共享内存;

Distributed Computing System(分布式计算系统)- 多个处理器,通过通信网络连接。

可以简单的理解为,并行计算是 1 台电脑内部的多线程处理,分布式计算是多台电脑连在一起完成多线程处理。

Parallel Computing vs Distributed Computing
Parallel Computing vs Distributed Computing

晕了?

如果前面的部分没有理解,没关系;只要记住 HTTP 这个协议里面有两个重要的成员:

  1. Client - 客户端
  2. Server - 服务器

Client 和 Server 通常来说是通过网络进行信息交换的,Client 和 Server 都是应用程序,它们可以位于不同的电脑里,也可以住在同一台电脑里面。

Client 的作用是主动找 Server 聊天,获取资源。

Server 的作用是向 Client 提供它所想要的信息/资源,但从来不会主动找 Client 说话。


2. HTTP Message

作用

那么问题来了,Client 和 Server 之间是怎么沟通的呢?

答:它们要通过 HTTP Message 来交流。

Message 分两种:request message(请求)和 response message(响应)。

区别在于:Client 发出去的 Message 是 request message;而 Server 回复的信息是 response message。

好,现在把基本的概念搞清楚了,我们来深入聊聊这些 Message 到底长啥样。

构成部分

每条 message 都包括以下 4 个部分:

  • Start Line (概述)
  • (optional) Headers;
  • 空白行(用来分割 header 和 body)
  • (optional) Message Body - 也被称为 payload;
Requests and responses share a common structure in HTTP
Requests and responses share a common structure in HTTP

Start Line - HTTP Request

例如: GET /shoppingcart/items HTTP/1.1

包含三部分:

  1. HTTP method - GET
  2. 资源地址(Request URL)- /adds/search-result
  3. HTTP 版本 - HTTP/1.1

HTTP Request Method 下面会单独讲。

Start Line - HTTP Response

例如: HTTP/1.1 200 OK

包含三个部分:

  1. HTTP 版本信息 - HTTP/1.1
  2. 三位数字,用来表明请求状态 - 200
  3. 关于请求状态码的进一步解释 - OK

一般来说,response 都是有 message body 的(代表着你请求的资源)。


3. HTTP Request Methods - HTTP 请求方法

HTTP 请求方法总共有 9 种,常用的有以下 4 个,对应我们之前在数据里面讲过的【增改查删】需求。

  1. POST - 增,可用来添加资源
  2. GET - 查,不改变资源状态
  3. PUT - 改,修改已有资源
  4. DELETE - 删,删除已有资源

HTTP methods 就是 Client 与服务器之间交换信息的方式。

每个 HTTP 请求都必须有一个 URL 地址(URL 等下会详细说)。

其他的 HTTP Method

除了增查改删这四种常见的 HTTP method 之外,还有这些 Method 大家也可以了解一下:

  • HEAD - 类似 GET,但是服务器返回的 response 是没有 message body 的,只有 header
  • TRACE - 主要用来诊断 HTTP 请求,response 应该包含完全一致的 request message;
  • OPTIONS - 用来了解服务器支持的 HTTP method 类型
    • 跟 CORS 有关,需要重点看(这里先略过)
  • PATCH - 类似 PUT,也是用来修改资源的,与 PUT 的区别在于,PATCH 只是告诉服务器,我想要怎么修改资源(提供说明),而 PUT 则是把一个完整的资源发送给服务器(直接换上去就行);
    • 这里有个 idempotent(幂等性)的概念(这里先略过)
  • CONNECT - 用来和提供资源的服务器建立双向连接
    • HTTPS 跟这个有关,可以深入研究一下(这里先略过)

4. HTTP Headers - HTTP 首部

每个 Message 的 First Line 后面,就是以 name:value 为形式的 Header 部分,结构如下:

1
2
3
First Line
header1: value1;
header2: value2;

Header 的四种类型

Example of headers in an HTTP request
Example of headers in an HTTP request
Example of headers in an HTTP response
Example of headers in an HTTP response
  1. 普通 Header (General header)- 可以用于 Request 和 Response 两种 message 类型的 Header,与交换的数据完全无关;
    • 例如:Date, Cache-Control, Connection
  2. 请求 Header(Request header)- 顾名思义,在 Client 发送请求的时候可以用,跟发送的请求有关;
    • 例如:Accept, If-*, Cookie, User-Agent, Referer…
  3. 响应 Header(Response header)- 既然有请求 Header,那么回复也有专门的 Header,只能由服务器来使用;
    • 例如:Age, Location, Server…
  4. 实体 Header(Entity header)- 描述跟 message body 相关的内容
    • 例如:Content-Length, Content-Language, Content-Encoding…

5. HTTP Message Body

Body - Request

并不是所有的请求都有 body 的,比如 GET,就是为了获取资源,没有必要传输其他信息过去。

而 POST 这样的请求往往是有 body 的,因为你要给 Server 发信息嘛。

Body 分两种:

Body - Response

Response 也有可能没 body,比如 Client 想在 Server 上加一个资源(POST),那么 Server 收到这个请求之后就吭哧吭哧地加上去了,然后通过状态码回复一句:加好了(204)。

像 GET 这样的请求,Server 收到之后就会根据 URL 来找资源,找到了,ok,通过 Body 发回给 Client 。


6. HTTP Status Code

在 Server 的 Response Start Line 里面,我们讲过,其中一部分就是 3 位数字的状态码(Status Code)。接下来的这一部分,我们具体来聊聊状态码。

状态码是用来干嘛的?

状态码的作用是告诉 Client,你这个 http request 到底完成了没,你的请求结果是什么。

计算机领域一个非常重要的思维方式就是:输入(input)和输出(output)。

请求,就是我们输入的信息;而状态码,就是请求的输出结果。

我们如何根据状态码来了解请求的完成情况?

状态码有 5 种,数值区间是 [100 - 599]

1 开头的:Informational responses - 这种状态码是一个中间状态,就是告知你一下,现在还没有最终完成请求,需要等一会儿。

2 开头的:Successful responses - 成功啦!Server 接收到了你的请求,也成功处理了你的请求,一切顺利。

3 开头的:Redirects - 你这个请求的资源地址好像不对啊。。没事,我帮你带个路,你去找另外一个资源就行了。

4 开头的:Client errors - 你这个请求有问题啊,自己反省一下。

5 开头的:Server errors - 额……你没问题,但是服务器没法处理你这个请求。

常见的状态码

  1. 200 OK - 请求成功完成
  2. 301 Moved Permanently - 你找的这个资源永久搬家了,这种情况你会直接被带到另一个地址,旧地址被替换成新地址
  3. 302 Moved Temporarily - 你找的这个资源暂时搬家了,这种情况你也会自动被带到新的地址,但是旧地址依旧有效
  4. 400 Bad Request - 服务器无法理解你发送的请求
  5. 401 Unauthorized - Server 不知道你是谁,先自证身份吧~
  6. 403 Forbidden - Server 知道你是谁,但你无权获取这个资源
  7. 404 Not Found - 你找的资源不存在
  8. 500 Internal Server Error - Server 出问题了(具体啥问题,不知道)
  9. 503 Service Unavailable - Server 正在维护或者过载了,没法回复你

7. 例子

打开任意一个网站,打开浏览器自带的开发者工具,Chrome 按 F12 即可,打开网络这个 Tab,然后刷新网页,你就可以看到很多的 HTTP request。

打开网络 Tab
打开网络 Tab

比如第一个是 B 站的网站,我们可以直接查看 Request 和 Response 相关的信息。

HTTP-General
HTTP-General

Request Header - 请求 Header

HTTP-Request Header
HTTP-Request Header

Response Header - 回复 Header

HTTP-Response Header
HTTP-Response Header

8. 结语

这篇文章里面我们讲了:

  • API 和 RESTful API 是什么,两者一样吗?
  • HTTP 采用的 client-server model 是一种重要的分布式计算架构 (Distributed computing architecture)
    • 分布式计算系统和并行计算系统的区别
  • HTTP 的 Message 分为哪两种,都包含了哪些内容
  • HTTP Method 有哪些
  • HTTP Header 的四种类型
  • HTTP Status Code 的含义

希望对大家有所帮助~


Support Luna