• Http请求和响应


    Http请求和响应

    Http协议对浏览器发出的Request格式以及对Web服务器发出的Response格式有具体的规定。

    请求部分由三部分组成:

    •  Requset line:请求行,位于第一行
    •  Request headers:请求消息头,从第二行开始第一个空行结束
    •  Request body:请求正文,从第一个空行之后的都是正文

    响应部分也由三部分组成:

    •  Response line:响应行,位于第一行
    •  Response headers:响应消息头,从第二行开始第一个空行结束
    •  Response body:响应正文,从第一个空行之后的都是正文

    请求行和响应行更像是一篇文章的一个摘要

    请求头和响应头就像是一篇文章核心内容的一个说明

    请求体和响应体就像是一篇文章的核心内容

    一、Http请求

    Http请求具体格式如下:

    Method Path-to-resource Http/Version-number

    User-agent 浏览器的类型

    Accept 浏览器接受的MIME类型

    Accept language 用户选择的接受语言

    Accept-charset 用户首选的编码字符集

    ……

               空行

                        Option Request Body

    ①请求行:

    1.Method为请求方式,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE,常用的是GET和POST

    GET的特点:默认的请求方式。
    当请求的资源路径为/SdustExam/Login.jsp?username=admin&password=123456时,GET方式会把表单的请求的数据放在请求的URI的后面,?username=admin&password=123456,这样会暴露数据,而且请求行长度有限。

    POST的特点(经常使用的):借助HTML中的form表单。<form action="Login.jsp" method="post">请求参数出现在正文部分,长度木有限制,相对安全。

    2.Path-to-resource :请求的资源的URI。例如/SdustExam/Login.jsp

    3.Http/Version-number:客户端使用的协议的版本,有HTTP/1.0和HTTP/1.1。

    HTTP/1.0:特点:每次请求服务器上的资源都要建立新的连接,响应完毕后都会关闭连接。是无状态的协议。
    HTTP/1.1:特点:在一次TCP/IP连接的基础上可以发出多次请求和得到多次的响应。比1.0多了一些请求和响应头。

    ②请求消息头

    向服务器传递附加信息

    Accept:通知服务器,浏览器可以接受的MIME类型。(文件系统中用文件扩展名区分数据的类型。网络上用MIME类型来区分数据类型。Tomcatconfweb.xml)
    MIME类型名称:大类型/小类型 如text/html、text/css等等
    Accept-Charset:通知服务器,浏览器支持的字符集,如gbk,utf-8
    Accept-Encoding:通知服务器,浏览器能够解码的数据压缩方式。比如:gzip
    Accept-language:通知服务器,所希望的语言
    Host:请求的主机和端口
    Referer:是一个URL地址。取值是当前页面之前的那个页面地址的。防盗链用
    Content-Type:通知服务器,请求正文的MIME类型。取值:application/x-www-form-urlencoded默认值,对应的是form表单的enctype属性
    If-Modified-Since:通知服务器,缓存的文件的最后修改时间。
    User-Agent:通知服务器,浏览器类型.
    Content-Length:表示请求消息正文的长度 
    Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 )
    Cookie:这是最重要的请求头信息之一(会话有关)

    请求实例:

    HTTP请求

    HTTP请求的格式如下所示:

    <request-line>

    <headers>

    <blank line>

    [<request-body>]

    在HTTP 请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

    在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST 请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。

    对于 www.wrox.com的GET请求如下所示:

    GET / HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Connection: Keep-Alive

    请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。

    第2 行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是 www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。

    如果要获取一个诸如http://www.wrox.com/books的www.wrox.com域内的页面,那么该请求可能类似于:

    GET /books/ HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Connection: Keep-Alive

    注意只有第一行的内容发生了变化,它只包含URL中www.wrox.com后面的部分。

    要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:

    URL ? name1=value1&name2=value2&..&nameN=valueN

    该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:

    GET /books/?name=Professional%20Ajax HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Connection: Keep-Alive

    注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)。“名称—值”(name—value)对用 & 隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。



    浏览器发送的首部,通常比本文中所讨论的要多得多。为了简单起见,这里的例子尽可能简短。



    另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。

    以下就是一个典型的POST请求:

    POST / HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Content-Type: application/x-www-form-urlencoded

    Content-Length: 40

    Connection: Keep-Alive

    name=Professional%20Ajax&publisher=Wiley

    从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User- Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部 Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是 Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。

    正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。

    二、http响应

    http响应具体格式如下:

      Http/Version-number  Statuscode  message

    Server 服务器的类型信息

    Content-type 响应的MIME类型信息

    Content-length 被包含在相应类型中的字符数量

    ……

               空行

    Option Response Body

    ①响应行:

    Http/Version-number:服务器用的协议版本
    Statuscode:响应码。代表服务器处理的结果的一种表示,常用的响应码有:
          200:正常
          302/307:重定向
          304:服务器的资源没有被修改
          404:请求的资源不存在
          500:服务器报错了
    message:响应码描述。例如200的描述为OK

    ②响应消息头:

    Location:通知客户端,指示新的资源的位置(结合302/307来用。请求重定向)
    Server:通知客户端,服务器的类型
    Content-Encoding:通知客户端,响应正文的压缩编码方式。常用的是gzip。
    Content-Length:通知客户端响应正文的数据大小
    Content-Type:通知客户端响应正文的MIME类型
    Refresh:让浏览器自动刷新。取值为整数(刷新的时间间隔,单位是秒)
         Refresh:3
         Refresh:3;URL=其他资源的URI
    Content-Disposition:通知客户端,以下载的方式打开资源。
    Content-Disposition:attachment;filename=1.jpg
    Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie(会话有关)
    Expires: -1 网页的有效时间。单位是毫秒,-1为通知客户端不要缓存
    Cache-Control: no-cache (1.1)  通知客户端不要缓存
    Pragma: no-cache (1.0) 通知客户端不要缓存

    响应实例:

    HTTP响应

    如下所示,HTTP响应的格式与请求的格式十分类似:

    <status-line>

    <headers>

    <blank line>

    [<response-body>]

    正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

    HTTP/1.1 200 OK

    Date: Sat, 31 Dec 2005 23:59:59 GMT

    Content-Type: text/html;charset=ISO-8859-1

    Content-Length: 122

    <html>

    <head>

    <title>Wrox Homepage</title>

    </head>

    <body>

    <!-- body goes here -->

    </body>

    </html>

    在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:

    ◆200 (OK): 找到了该资源,并且一切正常。

    ◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

    ◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。

    ◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。

    ◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

    在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部 Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

    注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。

  • 相关阅读:
    P4559 [JSOI2018]列队
    2019.2.14 考试T3 交互题
    2019.2.14 考试T1 FFT
    P3240 [HNOI2015]实验比较 树形DP
    bzoj 3514: Codechef MARCH14 GERALD07加强版 LCT+主席树
    P4172 [WC2006]水管局长 LCT维护最小生成树
    P4177 [CEOI2008]order 最小割
    CF1073G Yet Another LCP Problem SA+权值线段树
    CF1110D Jongmah
    2019.2.10考试T2, 多项式求exp+生成函数
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7863071.html
Copyright © 2020-2023  润新知