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 层网络模型

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

晕了?

如果前面的部分没有理解,没关系;只要记住 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

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 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

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

HTTP-General

Request Header - 请求 Header

HTTP-Request Header

Response Header - 回复 Header

HTTP-Response Header


8. 结语

这篇文章里面我们讲了:

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

希望对大家有所帮助~


Talk to Luna


Support Luna