第03课:HTTP

第03课:HTTP 请求详解

什么是 HTTP 协议

只要客户端和 Web 服务器进行交互时,就存在 Web 请求,这种请求就是 HTTP 协议的相互交互数据。

一次完整的 HTTP 请求过程从 TCP 三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送 HTTP 请求,服务端接收请求后,解析 HTTP 请求,处理完业务逻辑,最后返回一个 HTTP 的响应给客户端,HTTP 的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照 HTTP 的协议标准来实现的话,那么它一定是通用的。

HTTP 请求组成

HTTP 请求格式主要有四部分组成,分别是:请求行、请求头、请求正文,每部分内容占一行。

下面是一个 HTTP 请求的一个例子:

enter image description here

    GET / HTTP/1.1    //请求行

    Host: www.baidu.com //请求头

    User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/45.0

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Accept-Language: en-US,en;q=0.5

    Accept-Encoding: gzip, deflate

    Connection: keep-alive // 空白行,代表响应头结束

    Cache-Control: max-age=0 //请求正文

HTTP 的请求行第一行就是请求行,请求行为三部分组成,第一部分说明了这个请求是 GET 请求,第二部分斜杠那里(/HTTP/)用来说明请求的是什么内容,最后一行说明使用的是 HTTP 1.1 版本协议,也有 1.0 的。

第二行和空白行就是 HTTP 中的请求头,其中的 host 请求代表请求的主机地址,User-Agent 代表的是浏览器的标识,比如 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/45.0,就说明我是火狐浏览器,Linux 系统来做的这个请求。

HTTP 的请求的最后一行是请求正文,请求正文的内容并不是固定的,常常出现在 Post 请求中,GET 少见。

HTTP 响应

与 HTTP 请求相对,HTTP 响应就可以当做是浏览器给你的一次回复,HTTP 响应也由三部分组成,分别是响应行、响应内容和响应正文。下面是个 HTTP 响应。

    HTTP/1.1 200 OK  //响应行

    Date: Sat, 02 Dec 2017 13:28:49 GMT //响应头
    Server: Apache

    P3P: CP=" OTI DSP COR IVA OUR IND COM "

    Set-Cookie: BAIDUID=DA1513C25E1ED809E79A467DAB89EA2D:FG=1; expires=Sun, 02-Dec-18 13:28:49 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1

    Last-Modified: Fri, 08 Sep 2017 08:30:40 GMT

    Etag: "3d16-558a9645bac00"

    Accept-Ranges: bytes

    Cache-Control: max-age=86400

    Expires: Sun, 03 Dec 2017 13:28:49 GMT

    Vary: Accept-Encoding,User-Agent

    Content-Encoding: gzip

    Content-Length: 4830

    Connection: Keep-Alive //空白行,代表响应头已经结束

    Content-Type: text/html  //响应正文

响应行:状态行位于相应消息的第一行,有 HTTP 协议版本号,状态码和状态说明三部分构成。如:

HTTP/1.1 200 OK

响应行里包含了 HTTP 版本(HTTP/1.1)状态码(200)以及响应(OK),OK 即代表请求成功,响应给了你回复。

响应头和 HTTP 请求是一样的,这里不解释了。

响应正文便是服务端收到你这个请求之后,朝你的客户端发送的 HTML 数据。

HTTP 请求方法

HTTP 请求方法有很多,共计 15 种,但是这里只解释常用的请求方法。

  • GET 请求指定的页面信息,并返回实体主体。
  • HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
  • POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT 从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE 请求服务器删除指定的页面。
  • CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS 允许客户端查看服务器的性能。
  • TRACE 回显服务器收到的请求,主要用于测试或诊断。
  • PATCH 实体中包含一个表,表中说明与该 URI 所表示的原内容的区别。
  • MOVE 请求服务器将指定的页面移至另一个网络地址。
  • COPY 请求服务器将指定的页面拷贝至另一个网络地址。
  • LINK 请求服务器建立链接关系。
  • UNLINK 断开链接关系。
  • WRAPPED 允许客户端发送经过封装的请求。
  • Extension-mothed 在不改动协议的前。

其中 GET、Post 请求方法最为常见。

GET

GET 是获取页面的指定信息,比如获取百度的一个页面(www.baidu.com/index.php?id=1):

Get / index.php?id=1 HTTP/1.1
Host:www.baidu.com

这是一个 GET 请求,请求的是 index.php,内容参数是1。

GET 请求也比较懒,它只接受开发者已经设置好的参数,比如开发者只设置了只接受 ID 参数内容,其他数据都是不会去收的,比如 Get / index.php?id=1&user=admin, 这末尾这串 user=admin 就不会去接收,鸟都不想鸟你这种。

GET 请求他只是获取、查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的(仅对意义来讲是安全的)而稍后会提到的 Post 它是可以修改数据的,所以这也是两者差别之一了。

Post

Post 请求方法和 GET 有点相似,但是区别又在于,GET 请求会将发送的数据显示在浏览器端,Post 请求则不会,这样来说 Post 请求的安全性相对又高一些。

Post,它是可以向服务器发送修改请求,从而修改服务器的,比方说,我们要在论坛上回贴、在博客上评论,这就要用到 Post 了。

    POST /admin/index.asp HTTP/1.1
    Accept: text/html, application/xhtml+xml, image/jxr, */*
    Referer: http://www.baidu.com/admin/index.asp
    Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    Content-Length: 80
    Host: www.baidu.com
    Pragma: no-cache
    Cookie: ASPSESSIONIDSQTRDBQT=EHNFDLFBJENFBNHCNHFCHCMD
    Connection: close

    admin_name=admin&admin_password=123456&admin_verifycode=3291&submit=%B5%C7%C2%BC

上面这个例子就是使用了 POST 方法向服务器请求/admin/index.asp,并且在请求正文里递了参数admin_name=admin&admin_password=123456&aadmin_verifycode=3291&submi

PUT

PUT 请求方法用于请求服务器里面的内容储存在请求的资源下,如果这个资源在服务器里以及存在,那么将会用新的请求替换掉旧的内容,作为修改版保存在服务器里,如果这个资源不存在,那么将会创建资源,并且保存下来。

说简单点,GitChat 的文章保存功能就是一个 PUT 请求方法,我已经抓了下来。

    PUT /writing/editor/59f027344d4d5e0d65e9074c HTTP/1.1
    Origin: http://gitbook.cn
    Referer: http://gitbook.cn/writing/editor/59f027344d4d5e0d65e9074c
    Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
    Content-Type: application/json; charset=utf-8
    Accept: application/json, text/javascript, */*; q=0.01
    X-Requested-With: XMLHttpRequest
    Accept-Encoding: gzip, deflate
    Host: gitbook.cn
    Content-Length: 12594
    Pragma: no-cache
    Cookie: 已删除
    Connection: close
    //以下则为请求内容,已删。

这是我从文章的更新和保存页面抓下来的请求。

这段 HTTP PUT 请求将会在 writing 目录下生成 editor/59f027344d4d5e0d65e9074c。不管以前的内容存不存在、有没有,都将会被这一次 PUT 请求给“刷新”掉,创建新的内容,服务器开了 PUT 请求方法挺不安全的,考虑到服务器创建文件问题。

HTTP 状态码

状态码就是前文所讲的 HTTP/1.1 200 OK。它出现在 HTTP 响应头的第一行,例子状态码是 200,代表了请求成功。HTTP 协议中的状态码都是由三位数字组成,常见的还有 404.500 等状态码,每个状态码代表了不同的响应内容。

1XX:这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。

2XX:这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。

3XX:重定向状态码,这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。

4XX:4XX 状态码也意味着客户端错误码,这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法,浏览器应当向用户显示任何包含在此类错误响应中的实体内容。

5XX:类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个 HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。

常见的状态码如:200、404、500 等。

上一篇
下一篇
内容互动
写评论
加载更多
评论文章