1.简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是基于TCP协议的应用层传输协议,工作于客户端-服务端架构上,HTTP客户端通过URL向HTTP服务端即发送请求,服务端根据接收到的请求向客户端发送响应信息。
HTTP请求-响应模型-20220308143240-3nlpckj.png
HTTP协议主要有以下特点:

  • 无连接协议:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态协议:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则信息必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  • 媒体独立:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP协议发送,而数据类型由Content-Type标记。

    2.URI、URL和URN

    2.1 URI

    URL(Uniform Resource Locator,即统一资源定位符)和URN(Uniform Resource Name,即统一资源名称)是URI(Uniform Resource Identifier,即通用资源标识符)的子集。URI是以一种抽象的、高层次的概念,定义统一资源标识,而URL和URN则是具体的资源标识的方式,URL和URN都是一种URI。

    2.2 URL

    URL是Uniform Resource Locator(统一资源定位符)的缩写,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。例如:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
    从上面的URL可以看出,一个完整的URL包括以下几部分:
  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等。本例中使用的是HTTP协议,在”http:”后面的“//”为分隔符。
  2. 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用。
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。
  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”。
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分;如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分;如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
  6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分。
  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URL最大的缺点是当信息资源的存放地点发生变化时,必须对URL作相应的改变。

2.3 URN

URL是Uniform Resource Name(统一资源名称)的缩写,它命名资源但不指定如何定位资源。如果说URL代表一个人的住址,那么URN就代表一个人的身份。
用于标识唯一书目的ISBN系统就是一个典型的URN使用范例。例如,ISBN 0486275574(urn:isbn:0-486-27557-4)无二义性地标识出莎士比亚的戏剧《罗密欧与朱丽叶》的某一特定版本。为获得该资源并阅读该书,人们需要它的位置,也就是一个URL地址。
因此,URL和URN有着互补的作用。

3.HTTP请求

3.1 请求结构

下图给出了HTTP协议请求报文的一般格式:
HTTP请求结构-20220311100121-ihxw7hf.svg
下面是一个HTTP请求实例:

  1. POST / HTTP/1.1
  2. Host:www.wrox.com
  3. User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
  4. Content-Type:application/x-www-form-urlencoded
  5. Content-Length:40
  6. Connection: Keep-Alive
  7. name=Professional%20Ajax&publisher=Wiley
  1. 请求行:第1行,请求方法是“POST”,URL是“/”,HTTP协议版本是“HTTP/1.1”
  2. 请求头部:第2行至第6行。
  3. 空行:第7行。
  4. 请求数据:从第8行开始。

    3.2 请求方法

    | 方法 | 描述 | | —- | —- | | GET | 请求指定的页面信息,并返回实体主体。 | | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 | | POST | 将指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。

    | | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 | | DELETE | 请求服务器删除指定的页面。 | | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 | | OPTIONS | 允许客户端查看服务器的性能。 | | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 | | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |

3.3 GET和POST请求

GET和POST是最请用两种请求方法,下面是两个分别是GET和POST请求实例:

  1. GET /books/?sex=man&name=Professional HTTP/1.1
  2. Host: www.wrox.com
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
  4. Gecko/20050225 Firefox/1.0.1
  5. Connection: Keep-Alive
  1. POST / HTTP/1.1
  2. Host: www.wrox.com
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
  4. Gecko/20050225 Firefox/1.0.1
  5. Content-Type: application/x-www-form-urlencoded
  6. Content-Length: 40
  7. Connection: Keep-Alive
  8. name=Professional%20Ajax&publisher=Wiley

数据传输方式不同
GET请求提交的数据会附在URL之后,即把数据放置在HTTP请求行中,以“?”分割URL和传输数据,多个参数用“&”连接。
POST请求提交的数据放置在HTTP包的包体中。因此,GET提交的数据会在地址栏中显示出来,而POST请求提交的数据不会在地址栏显现。
数据传输限制不同
特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于GET提交时,传输数据就会受到URL长度的限制。POST请求理论上数据不受限,但实际各个WEB服务器会规定对POST提交数据大小进行限制,如Apache、IIS6都有各自的配置。
安全性不一样
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将以明文形式出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

3.4 Content-Type标头

Content-Type标头用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,告诉客户端实际返回的内容的内容类型。
常见的媒体格式类型如下

  • text/html:HTML格式;
  • text/plain:纯文本格式;
  • text/xml:XML格式;
  • image/gif:gif图片格式;
  • image/jpeg:jpg图片格式;
  • image/png:png图片格式。

以application开头的媒体格式类型:

  • application/xml:XML数据格式;
  • application/json:JSON数据格式;
  • application/pdf:pdf格式;
  • application/msword:Word文档格式;
  • application/octet-stream:二进制流数据(如常见的文件下载)。

更多Content-Type标头参考https://www.runoob.com/http/http-content-type.html

4.HTTP响应

4.1 响应结构

下图给出了HTTP协议响应报文的一般格式:
HTTP响应结构-20220311102601-cyhgz9v.svg
下面是一个HTTP响应实例:

  1. HTTP/1.1 200 OK
  2. Date: Fri, 22 May 2009 06:07:21 GMT
  3. Content-Type: text/html; charset=UTF-8
  4. <html>
  5. <head></head>
  6. <body>
  7. <!--body goes here-->
  8. </body>
  9. </html>
  1. 状态行:第1行,协议版本是“HTTP/1.1”,状态码是“200”,状态描述是“OK”。
  2. 消息报头:第2行到第3行。
  3. 空行:第4行。
  4. 响应正文:从第5行起。

    4.2 状态码分类

    HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:
分类 分类描述
信息响应(100–199) 服务器收到请求,需要请求者继续执行操作。
成功响应(200–299) 操作被成功接收并处理。
重定向(300–399) 需要进一步的操作以完成请求。
客户端错误(400–499) 请求包含语法错误或无法完成请求。
服务器错误 (500–599) 服务器在处理请求的过程中发生了错误。

常见的HTTP状态码:

  • 200 - 请求成功;
  • 301 - 资源(网页等)被永久转移到其它URL;
  • 404 - 请求的资源(网页等)不存在;
  • 500 - 内部服务器错误。

更多状态码参看https://www.runoob.com/http/http-status-codes.html

参考文章