HTTP
1. HTTP 简述(出自 MDN)
超文本传输协议(HTTP)是用于传输诸如 HTML 的超媒体文档的应用层协议。它被设计用于 Web 浏览器和 Web 服务器之间的通信,但它也可以用于其他目的。 HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。 HTTP 是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于 TCP / IP 层,但可以在任何可靠的传输层上使用.
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
2. HTTP 的主要特点
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
支持客户/服务器模式。
3. HTTP 消息结构
(1). 什么是 URL?
URI 相比于 URL 概念更加的宽泛,比如它可以定位到 FTP 上的资源、邮件资源、电话,已经超出了网页的范畴。 URL 则是专门用于定位网页资源。
Uniform Resource Locator(统一资源定位符),属于两种 URI(统一资源标志符)的一种,也就是我们平常输入的网络地址,它的格式是:
http://host[":"port][abs_path]
http 表示要通过 HTTP 协议来定位网络资源; host 表示合法的 Internet 主机域名或者 IP 地址; port 指定一个端口号,为空则使用缺省端口 80; abs_path 指定请求资源的 URI;如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。 例如: www.jszero.cn
浏览器自动转换成:http://www.jszero.cn/
(2). 客户端请求消息(请求报文)
- 请求行(request line):动词 路径 协议/版本
- 请求头部(header):说明服务器要使用的附加信息
- 空行:即使第四部分的请求数据为空,也必须有空行
- 请求数据:就是请求数据咯
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
(3). 服务器响应消息(响应报文)
- 状态行:协议/版本 状态码 状态消息
- 消息头部:说明客户端要使用的一些附加信息
- 空行:空行,消息报头后面的空行是必须的
- 响应正文:服务器返回给客户端的文本信息
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
4. 请求响应实例
我们使用 curl 语句来创造一个请求:
(1)
curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"
请求的内容为:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx
响应的内容为:
curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:14:05 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<!DOCTYPE html>
......
(2)
添加 -X POST 参数:
curl -X POST -s -v -H "Frank: xxx" -- "https://www.baidu.com"
请求的内容为:
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: _/_
Frank: xxx
响应的内容为:
curl -X POST -s -v -H "Frank: xxx" -- "https://www.baidu.com"
HTTP/1.1 302 Found
Connection: Keep-Alive
Content-Length: 17931
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:19:47 GMT
Etag: "54d9749e-460b"
Server: bfe/1.0.8.18
<html>
......
(3)
添加 -d “1234567890” 参数:
curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com"
请求的内容为:
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: _/_
Frank: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
1234567890
响应的内容为:
curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com"
HTTP/1.1 302 Found
Connection: Keep-Alive
Content-Length: 17931
Content-Type: text/html
Date: Thu, 21 Feb 2019 07:11:28 GMT
Etag: "54d9749e-460b"
Server: bfe/1.0.8.18
<html>
......
4. HTTP 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
5. HTTP 头信息
(1). 通用头信息
头信息 | 说明 |
---|---|
Cache-Control | 控制缓存 |
Connection | 连接管理 |
Transfor-Encoding | 报文主体的传输编码格式 |
Date | 创建报文的时间 |
Upgrade | 升级为其他协议 |
(2). 通用头信息
头信息 | 说明 |
---|---|
Host | 请求资源所在的服务器 (唯一一个 HTTP/1.1 规范里要求必须出现的字段) |
Accept | 客户端或者代理能够处理的媒体类型 |
If-Match | 比较实体标记 (ETag) |
If-None-Match | 比较实体标记 (ETag),与 If-Match 相反 |
If-Modified-Since | 比较资源更新时间 (Last-Modified) |
If-Unmodified-Since | 比较资源更新时间 (Last-Modified), 与 If-Modified-Since 相反 |
Range | 实体的字节范围请求 |
User-Agent | 客户端信息 |
(3). 响应头信息
头信息 | 说明 |
---|---|
Accept-Ranges | 能接受的字节范围 |
Location | 命令客户端重定向的 URI |
ETag | 能够表示资源唯一资源的字符串 |
Server | 服务器的信息 |
(4). 实体头信息
头信息 | 说明 |
---|---|
Allow | 资源可支持 HTTP 请求方法 |
Last-Modified | 资源最后修改时间 |
Expires | 实体主体过期时间 |
Content-Language | 实体资源语言 |
Content-Encoding | 实体编码格式 |
Content-Length | 实体大小 |
Content-Type | 实体媒体类型 |
6. HTTP 状态码
状态码 | 含义 |
---|---|
1** | 服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重新定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
(1). 1XX
状态码 | 描述 |
---|---|
1xx | 请求已经接收到,需要进一步处理才能完成,HTTP/1.0 不支持 |
100 | Continue:上传大文件前使用 |
101 | Switch Protocols:协议升级使用 |
102 | Processing:服务器已经收到并正在处理请求,但无响应可用 |
(2). 2XX
状态码 | 描述 |
---|---|
2xx | 成功处理请求 |
200 | OK:成功返回响应 |
201 | Created:有新资源在服务器端被成功创建 |
202 | Accepted:服务器接受并开始处理请求,但请求未处理完成 |
206 | Partial Content:使用 range 协议时返回部分响应内容时的响应码 |
(3). 3XX
状态码 | 描述 |
---|---|
300 | 是一个特殊的重定向状态码,会返回一个有多个链接选项的页面,由用户自行选择 |
301 | Moved Permanently 是常用的重定向状态码。代表永久性重定向 |
302 | Found 是常用的重定向状态码。代表永临时性重定向 |
303 | See Other 类似于 302,重定向后的请求方法改为 GET 方法 |
304 | Not Modified 是一个特殊的重定向状态码,服务端验证过期缓存有效后,要求客户端使用该缓存 |
305 | Use Proxy 使用代理。所请求的资源必须通过代理访问 |
306 | Unused 已经被废弃的 HTTP 状态码 |
307 | Temporary Redirect 类似于 302,含义比 302 更明确,重定向后请求的方法和实体不允许变动 |
308 | 类似于 301,代表永久重定向,重定向后请求的方法和实体不允许变动 |
(4). 4XX
状态码 | 描述 |
---|---|
4xx | 客户端出现错误 |
400 | Bad Request:服务器认为客户端出现了错误,但不明确,一般是 HTTP 请求格式错误 |
401 | Unauthorized:用户认证信息确实或者不正确 |
403 | Forbidden:服务器理解请求的含义,但没有权限执行 |
404 | Not Found:服务器没有找到对应的资源 |
407 | Proxy Authentication Required:对需要经由代理的请求,认证信息未通过代理服务器的验证 |
408 | Request Timeout:服务器接收请求超时 |
(5). 5XX
状态码 | 描述 |
---|---|
5xx | 服务器端出现错误 |
500 | Internal Server Error:服务器内部错误,且不属于以下错误类型 |
502 | Bad Gateway:代理服务器无法获取到合法响应 |
503 | Service Unavailable:服务器资源尚未准备好处理当前请求 |
505 | HTTP Version Not Supported:请求使用的 HTTP 协议版本不支持 |
7. HTTP content-type
Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
Content-Type 标头告诉客户端实际返回的内容的内容类型。
语法格式:
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
常见的媒体格式类型如下:
- text/html : HTML 格式
- text/plain :纯文本格式
- text/xml : XML 格式
- image/gif :gif 图片格式
- image/jpeg :jpg 图片格式
- image/png:png 图片格式
以 application 开头的媒体格式类型:
- application/xhtml+xml :XHTML 格式
- application/xml: XML 数据格式
- application/atom+xml :Atom XML 聚合格式
- application/json: JSON 数据格式
- application/pdf:pdf 格式
- application/msword : Word 文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :
<form encType=””>
中默认的 encType,form 表单数据被编码为 key/value 格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式