http 协议
# http 协议
主要包含以下知识点:
- HTTP 简介
- URL 的详解
- HTTP 请求
- HTTP 响应
# HTTP 简介
HTTP 协议英文全称 Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网服务器传输超文本到本地浏览器的协议。
HTTP 是基于 TCP/IP的通信协议族里面的一员。
主要特点:
- 简单快速
- 灵活
- 无连接无状态
# URL 的详解
介绍几个关键名词:URI、URN、URL
URI:Uniform Resource Identifier,翻译成中文就是“统一资源标志符”,对互联网上面的一个资源进行标记。
URI 是比较抽象的一层,往下分,可以分为URN和URL
URN:Uniform Resource Name,翻译成中文就是“统一资源名字”。
URL:Uniform Resource locator,翻译成中文就是“统一资源定位符”
明白了 URI、URN 和 URL 之间的关系后,接下来我们重点来看URL,主要学习 URL 的各个部分,示例:
http://www.taobao.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
接下来,我们来看每一个部分:
- 协议部分:表示这个URL使用的是什么协议,常见的协议有 HTTP、FTP、SMTP 等。
- 域名部分:www.taobao.com,当我们要访问互联网上面的一台计算机的时候,通过 IP 来访问(127.0.0.1),但是通过IP来访问计算机的话,不方便记忆,所以,出现了域名,域名背后映射 IP。大家需要记住两个特殊的,localhost,127.0.0.1 都是代表本机。
- 端口:8080,默认浏览器的端口就是80端口或者8080端口。端口号存在的意义在于拿到一段信息后,可以准确的传递给应用程序。
- 虚拟目录:从域名后的第一个/到最后一个/的部分,/news/
- 文件名:具体要请求的文件名,上例中index.asp就是要请求的文件名
- 参数部分:从?开始到#之前,都是参数,例如上例中 boardID=5&ID=24618&page=1,注意参数是键值对的形式,以&符号隔开。
- 锚点:对应#后面的部分,锚点后面的东西不会提交到服务器,所以可以用来开发单页应用。
# HTTP 请求
当我们的客户端发送一个 HTTP 请求到服务器的时候,一个HTTP请求分为4个部分:
- 请求行
- 请求头
- 空行
- 请求体
下面是一个 GET 请求的请求报文:
GET /index.html?a=1&b=2 HTTP/1.1
Host: localhost.charlesproxy.com:3000
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/74.0.3729.131 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,
application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.448607888.1557887884; _gid=GA1.2.2022442462.1557887884
Connection: keep-alive
2
3
4
5
6
7
8
9
10
11
12
在上面的HTTP请求中,第一行是请求行,从第二行到最后都是请求头。
- HOST :服务器的域名。
- User-Agent :浏览器的浏览器身份标识字符串。
- Accept:能够接受的回应内容类型( Content-Types )。
- Accept-Encoding:能够接受的编码方式列表。
- Accept-Language:能够接受的回应内容的自然语言列表。
- Cookie:之前由服务器通过 Set- Cookie 发送的一个超文本传输协议 Cookie。
- Connection:该浏览器想要优先使用的连接类型。
接下来我们来看一个 POST 请求:
POST /users/login HTTP/1.1
Host: localhost.charlesproxy.com:3000
Content-Length: 43
Accept: application/json, text/plain, */*
Origin: http://localhost.charlesproxy.com:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost.charlesproxy.com:3000/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.448607888.1557887884; _gid=GA1.2.2022442462.1557887884
Connection: keep-alive
{"username":"zhangsan","password":"111111"}
2
3
4
5
6
7
8
9
10
11
12
13
14
这是一个POST 请求,和上面GET请求唯一的区别在于,数据封装在请求体里面。
下面演示如何在 google 中查看 http 请求:
打开google浏览,鼠标右键单击一次,选择【检查】选项,然后会打开google浏览器控制面板,选择【network】选项。
# GET 和 POST 请求的区别
- 传输数据存放位置的区别:get 请求是放在 URL 后面,post 请求放在请求体里面。
- 传输数据大小的区别:get 对url后面的数据的长度有一定的限制,不同的浏览器限制的长度有所不同。但是post理论上是不受限制的,但是一般服务器那边会有一定的限制。post能够携带的数据比get更多。
- 安全性:post 的安全性要更好一些。
# HTTP 请求的方法
大家现在最熟悉的,就是get和post。但是其实还有很多其他的请求:
HTTP1.0定义了3种方法:GET、POST和HEAD方法
HTTP1.1新增:OPTIONS,PUT,DELETE,TRACE和CONNECT方法
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
2
3
4
5
6
7
8
# HTTP 响应
当服务器处理完客户端发送过来的请求后,会返回一个 HTTP 响应。
HTTP响应也分为4个部分:
- 响应行
- 响应头
- 空行
- 响应体
下面是一个HTTP响应的例子:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
Server:Apache Tomcat/4.0-b1(HTTP/1.1Connector)
Conection:close
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
在上面的例子中,第一行是响应行,由http协议版本,状态码,状态描述组成。
第二行是响应头,也是一对一对的键值对。
接下来是空行,之后响应体,响应体里面装的就是具体浏览器要渲染的内容。
# 状态码
状态码由3位数组成,第一个数字定义了响应的类型,如下:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
2
3
4
5
几个常见的状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
2
3
4
5
6
7
关于更多的状态码,可以参见菜鸟教程:http://www.runoob.com/http/http-status-codes.html
# HTTP 事务
① 到用户发起请求时,首先进行域名解析
② 拿到域名所对应的 IP 地址之后,通过 TCP 协议建立与服务端的通信连接。(三次握手,建立连接)
③ 服务接收到用户请求之后,进行业务处理,随后将请求之后的结果返回给浏览器
④ 浏览器接收到后台的数据