目录
1. 何为HTTP?
2. 理解“应用层协议”
3. HTTP协议格式
3.1 HTTP请求协议格式
3.2 HTTP响应协议格式
4.HTTP请求方法
4.1 GET请求
4.2 POST请求
4.3 GET请求和POST请求的区别
5.关于请求报头“Header”
6.关于响应报头“Header”
HTTP协议全称为“超文本传输协议”,是一种应用非常广泛的应用层协议,它的基层是基于TCP协议实现的,比如我们平常打开一个网站,就是通过HTTP来传输和服务器之间进行交互的数据的。
通过TCP/IP协议我们了解到数据能够从客户端进行经过路径选择跨网络传输到服务器端进程。但是,数据也仅仅是传送了过去,我们需要在服务器端获得相应的数据并且希望对相应的数据进行解析加工或者处理,并且在客户端接收返回结果后能够进行同样的操作。HTTP就是这样一种站在应用层面的通信协议,用户在使用时不必关心其内部的通信细节,而且能够在客户端或者服务端拿到传输的数据并且进行处理。因此我们称它为“应用层协议”。
例如,我们在网上购买了一台扫地机器人,TCP/IP协议就相当于顺丰的功能,负责将机器人通过快递的方式发送给我,而我不必关心快递具体是怎么运输的。在我拿到机器人后,我要进行使用,这其中会有机器人的说明书,我需要打开说明书进行阅读了解怎么去使用,而说明书的功能就相当于HTTP在应用层方面的功能。
请求格式和相应协议的总体格式:
HTTP请求格式包含:
- 请求头
包含三个信息:请求方式,URL,HTTP版本号。请求方式大多数情况下为GET或者POST;URL又称统一资源定位符(下边画图说明),HTTP版本号目前使用最多的通常是1.1版本。- 请求行
包含了一些键值对信息。这些键值对之间以键+:+空格+值的方式组织起来的,具体的键值对个数不能确定- 空白行
可以理解为是请求头结束的标志,用来分隔请求行和请求体- 请求体
包含客户端发送请求中的一些数据信息,这个是可选的,一个HTTP请求协议中可能不包含请求体下面我们通过抓包工具对百度页面进行抓包,分析HTTP请求信息,抓包的结果如下:
我们试着对其请求协议进行分析:
下面我们来看一下什么是URL?
URL又称统一资源定位符,我们通过浏览器打开一个网页的时候,地址栏里填写的网址,其本质上就是一个URL。浏览器通过URL找到网络中的某台主机并且通过端口以及路径信息具体找到主机上的某个应用,这个应用来处理用户发送过来的请求。
关于URL的使用?
- 端口号在大部分情况下都是省略的,当省略端口号信息时,浏览器会默认给端口信息赋予一个默认值,对于http开头的URL,浏览器会使用80端口作为默认值;对于https开头的URL,浏览器会使用443端口作为默认值。
- 协议名也可以省略,省略之后会默认当做http://
- 带层次的文件路径也可以省略,相当于/,服务器接收到这种请求时会自动访问配置好的网站首页
- 查询字符串、片段标识都可以省略
关于URL的encode和decode?
当quert string中包含了特殊的字符,像"/ : ? & = "等在url中都是有特定的含义的,如果直接放在yrl中,可能会导致url解析失败。这个时候就需要对这些具有特殊含义的字符进行转义,这个过程就叫做url的encode。相反,对这些字符进行解析的过程就成为url的decode。
对这些特殊字符的转义规则其实就是将这些字符的ASCII码转换为16进制并且在数字的前面加上%。例如,在百度输入搜索内容:
HTTP响应协议格式包含:
- 状态行
包含了三个信息:HTTP协议的版本号,用来描述响应结果的状态码(200,404,500...),用来描述状态码的描述信息(比如:ok -- 响应成功)- 响应头
与请求头类似,其中的数据以键值对的格式组织,具体的键值对数目不能确定- 空白行
可以当作响应头的结束标志,看作是分割响应头和响应体的标志。- 响应体
包含了服务器返回给客户端的一些具体的数据,这些数据可能有不同的格式,像JSON,HTML...同样,下面我们使用抓包工具抓取百度页面的相应信息,抓取的结果如下:
我们尝试对这个响应结果进行分析:
HTTP的请求方法非常多,常用的GET请求和POST请求居多。常用的HTTP请求方法如下:
请求方法 | 方法说明 |
---|---|
GET | 多用于从服务器获取资源 |
POST | 多用于向服务器发送资源 |
PUT | 常用于传输文件 |
HEAD | 获取报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINE | 断开连接关系 |
对于GET请求的格式,我们对百度的搜索请求抓包分析一下:
会发现百度向服务器发送的GET请求中的请求数据信息包含在url的query string部分,而请求体部分则是空白。总结一下GET请求的使用规则就是,通常情况下,GET请求通常用于从服务器获取数据,并且通过在URL后边追加query string元的方式向浏览器传送数据。
但是,这种规则并不是一成不变的,只是习惯上被大多数人遵守,GET请求也可以有请求体,可以将数据放在请求体当中传送,只是这种使用方法比较小众。
对于POST请求的格式,我们对的csdn文章保存请求进行抓包分析:
会发送csdn文章保存时向服务器发送的是POST请求。这个POST请求具有方法体并且将数据以JSON的格式放在请求体中发送给浏览器。总结POST请求就是:通常情况下,POST请求常用于向浏览器发送数据,并且将数据以某种形式组织在POST请求的请求体中发送给服务器。
同样,这个规则也不是一成不变的,POST请求也可以将数据放在URL的query string部分,也可以没有请求体,只是习惯上的使用更偏向于上面的使用方法。
GET请求和POST请求本质上没有区别。在使用细节上,通常情况下,GET请求常用于从服务器获取数据,POST请求常用于向服务器提交数据。并且按照使用习惯来讲,GET请求的请求体通常为空,请求数据拼接在URL的query string部分;POST请求则不同,通常将请求数据放在请求体中传递给服务器。同时,GET请求能够被浏览器缓存,POSt请求则不能
Header的格式即我们在上面介绍的键值对格式,键和值之间以:空格的形式分隔。每个键值对独占一行。报头中的种类非常多,下面列举几种常见的:
Host
表示服务器主机的地址和端口Content-Length
请求的body中数据的长度Content-Type
请求的body中数据的格式。常用的Content-Type有:
- form表单提交的数据格式,此时的数据格式形如:pid=7&content=cheeron&...
application/x-www-form-urlencoded
- form表单提交的数据格式(在form标签上加上enctype="multipart/form-data")。通常用于提交图片/文件。body中的格式形如:
Content-Type:multipart/form-data; boundary=---- WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="text" title ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
- json格式,body中的数据格式形如:{"username"="小白的白白",password="xxxxx","fsafd"="fajkshfkja",.....}
application/json
与请求报头类似,其中的Content-Length、Content-Type等属性具有相同的含义。下面我们为您主要来看下响应报头的Content-Type,它有一下这几种取值:
- text/html
响应体中的数据格式是HTML- text/css
响应体中的数据格式是CSS- application/javascript
响应体中的数据格式是JavaScript- application/json
响应体中的数据格式是JSON