简介

在1990年,HTTP就成为WWW的支撑协议。当时由其创始人WWW之父蒂姆·贝纳斯·李(TimBemers—Lee)提出,随后WWW联盟(WWW Consortium)成立,组织了IETE(Internet Engineering Task Force)小组进一步完善和发布HTTP协议。

HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP协议进行通信的HTTP的实现程序。

协议

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。

那大概我们看到网页的过程是怎样的呢: 实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request,
Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器,
浏览器解析Response中的HTML,这样我们就看到了网页

典型的HTTP事务处理过程

  1. 客户与服务器建立连接;
  2. 客户向服务器提出请求;
  3. 服务器接受请求,并根据请求返回相应的文件作为应答;
  4. 客户与服务器关闭连接。

HTTP请求报文

一个请求报文有以下四个部分组成:请求行(request line)消息头部(header)空行请求正文 
  1. 请求行由请求方法URLHTTP版本协议组成,它们三个之间使用空格分割,请看下面的例子

       POST http://www.example.com HTTP/1.1

    这个例子就包含了我们所说的请求行的组成部分,POST为方法,http://www.example.com为url,HTTP/1.1为版本协议

    请求方法

    方法 描述
    GET 请求指定的页面信息,并返回实体主体。
    HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
    POST 向指定资源提交数据进行处理请求。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
    PUT 从客户端向服务器传送的数据取代指定的文档的内容。
    DELETE 请求服务器删除指定的页面。
    CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
    OPTIONS 允许客户端查看服务器的性能。
    TRACE 回显服务器收到的请求,主要用于测试或诊断。
    PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

    以上就是我们可以用到的请求方法,常见的只有那么几个,也许可能自己没有达到那个层面,我们可以仔细看上面的这些方法,每个方法都有自己独立要干的事情,所以在我们要和后端开发定制接口或是规范的时候我们要准确的定制,虽然你是前端(在前后端分离的时代你是主动你离用户更近)。

  2. URL

    URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 请看下面格式

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment
    格式 说明
    hostname 主机名或 IP 地址。
    port HTTP服务器的默认端口是8080,http://192.168.10.93:8080/
    path 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
    parameters 这是用于指定特殊参数的可选项。
    query 可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
    fragment 字符串,用于指定网络资源中的片断。

    上面就是我们所说的url它拥有以上甚至更多的格式字段提供我们在url传输获取等资源。

  3. 消息头部

    HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。
       User-Agent:产生请求的浏览器类型。
       Accept:客户端可识别的内容类型列表。
       Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

    上面的三个是我们在开发中常用经典的头部信息,更多的头部信息

    clipboard.png
    我们可以仔细看上面的请求响应图一共分为以下几个

    • 通用首部(General Header)
    • 请求首部(Request Header)
    • 响应首部(Response Header)
    • 实体首部(Entity Header Fields)

当然我们这个图片内实体是没有的因为我这个图是get方式,大家可以看POST等方法看一下返回的数据就是这个了。
剩下的空行我就在这不多说了。

HTTP响应报文

响应报文有以下四个部分组成:(状态行)响应行响应头空行响应体 
HTTP/1.1 200 OK
Date: July, 22 May 20019 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

clipboard.png
通过上面的代码示例以及上面的图我们对响应报文应该有了一个初步的了解,它的组合也是分为四部分组成。

  1. 响应行

    http协议状态码状态码的文本描述组成,他们之间使用空格隔开。

    状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:

    状态码 说明
    1xx 表示服务器已接收了客户端请求,客户端可继续发送请求。
    2xx 表示服务器已成功接收到请求并进行处理。
    3xx 表示服务器要求客户端重定向。
    4xx 表示客户端的请求有非法内容。
    5xx 表示服务器未能正常处理客户端的请求而出现意外错误。

    状态码的文本描述:

    状态码描述 说明
    200 OK 表示客户端请求成功。
    400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解。
    401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用。
    403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因。
    404 Not Found 请求的资源不存在。
    500 Internal Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求。
    503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

    以上仅为一些示例和比较常见的状态码,请大家参考,更多可以去google一下。

  2. 响应头部

    响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和 Request-URI进一步的信息。
    响应头 说明
    Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求。
    Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负)。
    Allow 对某网络资源的有效的请求行为,不允许则返回405。
    Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型。
    Content-Encoding web服务器支持的返回内容压缩编码类型。
    Content-Language 响应体的语言。
    Content-Length 响应体的长度。
    Content-Location 请求资源可替代的备用的另一地址。
    Content-MD5 返回资源的MD5校验值。
    Content-Range 在整个返回体中本部分的字节位置。
    Date 原始服务器消息发出的时间。
    ETag 请求变量的实体标签的当前值。
    Expires 响应过期的日期和时间。
    Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方。
    Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数。

    响应头的信息有很多,更多的需要的大家可以去搜一搜看一下,但是一般都是我们不常见的,建议知道是干什么的就行,根据自己的能力干多大的事。

  3. 响应体

    响应的资源(HTML、图片、声音等)会被放入这个响应实体中。

参考学习

理解RESTful架构
HTTP协议-HTTP响应报文
HTTP 响应
HTTP响应头信息和请求头信息详解

me_zhazha
292 声望6 粉丝