HTTP 入门
2020-10-02
0. 前言
之前提到我最近完成了一个 API Integration 相关的模块,功能正式上线了,也到了总结知识的时候啦~
因为涉及到的知识点比较多,我会分几篇文章先讲理论部分,然后再总结一下我需要完成的需求,以及实现过程中踩过的一些坑。
今天我们先来聊聊 HTTP。
1. HTTP
HTTP 是什么
HTTP 是 HyperText Transfer Protocol 的简称,中文名是「超文本传输协议」。
顾名思义,它就是一个协议。
协议的双方(假设是两台电脑)都需要用 HTTP 规定的方式来说话,这样两边就能听懂对方在说什么了(就好比你跟别人沟通要讲同一种语言一样)。
HTTP 是专门为互联网系统之间的沟通而设计的一种协议,属于 Application Layer (应用层)协议,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 台电脑内部的多线程处理,分布式计算是多台电脑连在一起完成多线程处理。
晕了?
如果前面的部分没有理解,没关系;只要记住 HTTP 这个协议里面有两个重要的成员:
- Client - 客户端
- 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;
Start Line - HTTP Request
例如: GET /shoppingcart/items HTTP/1.1
包含三部分:
- HTTP method - GET
- 资源地址(Request URL)- /adds/search-result
- HTTP 版本 - HTTP/1.1
HTTP Request Method 下面会单独讲。
Start Line - HTTP Response
例如: HTTP/1.1 200 OK
包含三个部分:
- HTTP 版本信息 - HTTP/1.1
- 三位数字,用来表明请求状态 - 200
- 关于请求状态码的进一步解释 - OK
一般来说,response 都是有 message body 的(代表着你请求的资源)。
3. HTTP Request Methods - HTTP 请求方法
HTTP 请求方法 总共有 9 种,常用的有以下 4 个,对应我们之前在数据里面讲过的【增改查删】需求。
- POST - 增,可用来添加资源
- GET - 查,不改变资源状态
- PUT - 改,修改已有资源
- 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 部分,结构如下:
First Line
header1: value1;
header2: value2;
Header 的四种类型
- 普通 Header (General header
)- 可以用于 Request 和 Response 两种 message 类型的 Header,与交换的数据完全无关;
- 例如:Date, Cache-Control, Connection
- 请求 Header(Request header
)- 顾名思义,在 Client 发送请求的时候可以用,跟发送的请求有关;
- 例如:Accept, If-*, Cookie, User-Agent, Referer…
- 响应 Header(Response header
)- 既然有请求 Header,那么回复也有专门的 Header,只能由服务器来使用;
- 例如:Age, Location, Server…
- 实体 Header(Entity header
)- 描述跟 message body 相关的内容
- 例如:Content-Length, Content-Language, Content-Encoding…
5. HTTP Message Body
Body - Request
并不是所有的请求都有 body 的,比如 GET,就是为了获取资源,没有必要传输其他信息过去。
而 POST 这样的请求往往是有 body 的,因为你要给 Server 发信息嘛。
Body 分两种:
- Single-resource bodies, consisting of one single file, defined by the two headers:
Content-Type
andContent-Length
. - Multiple-resource bodies , consisting of a multipart body, each containing a different bit of information. This is typically associated with HTML Forms .
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 - 额……你没问题,但是服务器没法处理你这个请求。
常见的状态码
- 200 OK - 请求成功完成
- 301 Moved Permanently - 你找的这个资源永久搬家了,这种情况你会直接被带到另一个地址,旧地址被替换成新地址
- 302 Moved Temporarily - 你找的这个资源暂时搬家了,这种情况你也会自动被带到新的地址,但是旧地址依旧有效
- 400 Bad Request - 服务器无法理解你发送的请求
- 401 Unauthorized - Server 不知道你是谁,先自证身份吧~
- 403 Forbidden - Server 知道你是谁,但你无权获取这个资源
- 404 Not Found - 你找的资源不存在
- 500 Internal Server Error - Server 出问题了(具体啥问题,不知道)
- 503 Service Unavailable - Server 正在维护或者过载了,没法回复你
7. 例子
打开任意一个网站,打开浏览器自带的开发者工具,Chrome 按 F12 即可,打开网络这个 Tab,然后刷新网页,你就可以看到很多的 HTTP request。
比如第一个是 B 站的网站,我们可以直接查看 Request 和 Response 相关的信息。
Request Header - 请求 Header
Response Header - 回复 Header
8. 结语
这篇文章里面我们讲了:
- API 和 RESTful API 是什么,两者一样吗?
- HTTP 采用的 client-server model 是一种重要的分布式计算架构 (Distributed computing architecture)
- 分布式计算系统和并行计算系统的区别
- HTTP 的 Message 分为哪两种,都包含了哪些内容
- HTTP Method 有哪些
- HTTP Header 的四种类型
- HTTP Status Code 的含义
希望对大家有所帮助~