文章目录
前言
当前大部分的应用都是基于B/S架构的,而这其中主流的是基于http通信协议的。所以对于一个web开发者来说,http协议的重要性不言而喻。
1. 概述
HTTP协议是一种被大多数web应用程序所使用的的协议
- HTTP 数据的收发是基于TCP/IP协议的
- HTTP 数据主要是文本,虽然请求体中的中的数据可以是二进制的
两个步骤
- 请求: 客户机向服务器请求文档。“文档”可以是任何类型的文件。
- 响应: 服务器用请求的文档(或备用响应)响应客户机请求。
其整个知识点如下:
HTTP协议是web应用开发的基石
2. http请求与http响应
2.1 http请求
一个HTTP请求是纯文本内容的。它包含三个部分请求行、请求头、请求体
请求行:这个是http请求的第一行,整个请求行又分为三部分:URL,方法,版本
- URL:代表请求的文档
- 方法:有put, get, delete, head, options, post, tract, connect
- 版本:该http请求使用http协议版本,一般有HTTP/1.0 或者 HTTP/1.1
请求头:允许额外信息的可选行。每一行都是名称-值对
空行:用于将正文与标题分开
请求体:可选字节(一般用来承担业务数据).
2.2 http响应
一个HTTP响应也是由文本行组成
状态行: 第一行,由三个空格分隔的元素组成。.
- 版本: 响应的HTTP版本
- 状态码: 一个三位数代码
- 描述: 状态码的文本描述
响应头:允许在客户机和服务器之间交换数据的可选行。
响应体: 必须用空行与标题分隔的可选行
3. URL(scheme:[//[user:password@]host[:port]][/]path[?query][#fragment])
我们可以把因特网当做一个巨大的,正在扩张的城市。这个城市中所有的东西都应该有一个标准化的名字,以帮助人们能够很块的找到这个城市中的各种资源。当城市中的所有东西都认同并服从这个标准后,大家才能很方便的共享这座城市的资源了。
比如你需要你的朋友A帮你获取到位于xxx大道xxx街的xxx图书馆中二楼计算机室的xxx书架上的xxx书
(标准化的名字)的时候。你的朋友A立即就知道你是什么意思了。
而URL就是因特网上的资源的标准化名称。
URL是统一资源定位符的缩写。它是一个具有特殊含义的字符串,其格式如下
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
可以看到整个URL分为以下七个部分
- scheme 指定该请求使用协议
- user:password 验证用户名和密码,由于安全原因,现在大多数系统已经不再支持这个了。
- host:需要请求的目标主机
- port:目标主机的端口
- path:目标资源在目标主机上的位置
- ?query:查询信息
- #fragment:锚点定位
3.1 协议(scheme)
- 定义了URL余下部分的名称空间、用途和语法
- 不区分大小写
比如你在浏览器地址栏中键入http://example.org:80
,浏览器就会通过80端口向主机example.org
发送HTTP请求。
如果你在浏览器地址栏中键入mailto:bob@example.com
,那么浏览器就会向bob@example.com
发送邮件来执行你的指令
再比如你在浏览器中键入ftp://IP/Download/
,那么你的浏览器就可以通过ftp协议获取到这个ip指向服务器的资源。
3.2 主机(host)与端口(port)
URL的目标位置,相当于前面的拿书的那个例子中图书馆的位置信息(位于xxx大道xxx街的xxx图书馆)。
这一段字符串的作用是通过它能准确定位到因特网中某台主机。
host字段有两种:ip和域名
域名是ip地址的替代,浏览器会通过使用DNS来获取域名对应的IP地址。
IPV4: 32比特(4组,每组8比特)
IPV6: 128 比特
表示如果省略将接收请求的服务器应用程序,则使用特定于方案的默认值.
3000: HTTP Nodejs server
8080: HTTP Tomcat server
22: Secure Shell (SSH)
80: HTTP default
443: HTTP Secure (HTTPS)
3.3 路径(path)、查询字符串(?query)、锚点(#fragment)
路径:
资源的位置。相当于前面拿书的例子中图书在图书馆中的位置信息(二楼计算机室的xxx书架上的xxx书)
该字段区分大小写(有些服务器不区分大小写).
查询字符串:
还是用拿书的例子来说,比如需要的书有很多种版本(第一版、第二版之类的)。所以在后面加上一些信息(版本为第五版,封面为白色的)。
以?起头,后面跟上键值对,多个键值对之间以&符号区别。
举个例子
https://www.baidu.com/s?wd=htttp协议片段&rsv_spt=1&rsv_iqid=0xf5310479000d154e&issp=1&f=8&rsv_bp=1&rsv_idx=2
后边wd=htttp协议片段&rsv_spt=1&rsv_iqid=0xf5310479000d154e&issp=1&f=8&rsv_bp=1&rsv_idx=2
就是查询字段。
锚点
拿前面的拿书的例子来说,如果我需要的东西只是书中的某一段怎么办,按道理是可以放在查询字段中的,但是它与普通查询字段有不一样,因为这时候书(资源)已经找到了。所以可以在后面在加上一个字段,专门用来定位的。
例子:
一个比较常见的例子就是百度百科最右边的目录
4. Http请求头
由于不能将所有的信息放在请求行中,那样会让请求行显得十分冗长。所以开辟一个空间用来携带额外的信息,那么这个空间就是http请求头。就我目前对http协议的理解,http请求头中的信息是用来描述本次请求以及期待响应的信息,并不涉及业务功能。比如Accept
就是向服务器表明浏览器可以接受的文本类型。
由于是用来描述请求与期待响应的,所以请求头中信息的组织形式为键-值。
请求头中常用的键以及其意义
键 | 含义 |
---|---|
Accept | 浏览器可以接受的文本类型 |
Accept-Charset | 浏览器需要的字符集(接触比较少) |
Accept-Encoding | 浏览器接受的字符编码 |
Accept-Language | 浏览器接受的语言 |
Content-Length | 请求正文的长度 |
Content-Type | 请求正文的类型,文本、html等等 |