HTTP

1. HTTP 简述(出自 MDN)

超文本传输协议(HTTP)是用于传输诸如 HTML 的超媒体文档的应用层协议。它被设计用于 Web 浏览器和 Web 服务器之间的通信,但它也可以用于其他目的。 HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。 HTTP 是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于 TCP / IP 层,但可以在任何可靠的传输层上使用.

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。

2. HTTP 的主要特点

  1. 支持客户/服务器模式。

  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。

  3. 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。

  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  5. 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  6. 支持客户/服务器模式。

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 方法。

序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。
9PATCH是对 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 不支持
100Continue:上传大文件前使用
101Switch Protocols:协议升级使用
102Processing:服务器已经收到并正在处理请求,但无响应可用

(2). 2XX

状态码描述
2xx成功处理请求
200OK:成功返回响应
201Created:有新资源在服务器端被成功创建
202Accepted:服务器接受并开始处理请求,但请求未处理完成
206Partial Content:使用 range 协议时返回部分响应内容时的响应码

(3). 3XX

状态码描述
300是一个特殊的重定向状态码,会返回一个有多个链接选项的页面,由用户自行选择
301Moved Permanently 是常用的重定向状态码。代表永久性重定向
302Found 是常用的重定向状态码。代表永临时性重定向
303See Other 类似于 302,重定向后的请求方法改为 GET 方法
304Not Modified 是一个特殊的重定向状态码,服务端验证过期缓存有效后,要求客户端使用该缓存
305Use Proxy 使用代理。所请求的资源必须通过代理访问
306Unused 已经被废弃的 HTTP 状态码
307Temporary Redirect 类似于 302,含义比 302 更明确,重定向后请求的方法和实体不允许变动
308类似于 301,代表永久重定向,重定向后请求的方法和实体不允许变动

(4). 4XX

状态码描述
4xx客户端出现错误
400Bad Request:服务器认为客户端出现了错误,但不明确,一般是 HTTP 请求格式错误
401Unauthorized:用户认证信息确实或者不正确
403Forbidden:服务器理解请求的含义,但没有权限执行
404Not Found:服务器没有找到对应的资源
407Proxy Authentication Required:对需要经由代理的请求,认证信息未通过代理服务器的验证
408Request Timeout:服务器接收请求超时

(5). 5XX

状态码描述
5xx服务器端出现错误
500Internal Server Error:服务器内部错误,且不属于以下错误类型
502Bad Gateway:代理服务器无法获取到合法响应
503Service Unavailable:服务器资源尚未准备好处理当前请求
505HTTP 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 : 需要在表单中进行文件上传时,就需要使用该格式
Last Updated:
Contributors: zerojs