请求_请求转发 - CSDN
精华内容
参与话题
  • HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是...

    HTTP请求方式中8种请求方法(简单介绍)

    简单介绍

    HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的。当我们没有指定端口访问时,浏览器会默认帮我们添加80端口。我们也可以自己指定访问端口如:http://www.ip138.com:80。 需要注意的是,现在大多数访问都使用了HTTPS协议,而HTTPS的默认端口为443,如果使用80端口访问HTTPS协议的服务器可能会被拒绝。

     

    HTTP请求的方法:

    HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式

    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

     

    1、OPTIONS
    返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
    2、HEAD
    向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
    3、GET
    向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
    4、POST
    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
    5、PUT
    向指定资源位置上传其最新内容
    6、DELETE
    请求服务器删除Request-URL所标识的资源
    7、TRACE
    回显服务器收到的请求,主要用于测试或诊断
    8、CONNECT
    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    注意:
    1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
    2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。

    HTTP工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

     HTTP 请求/响应的步骤:

    客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容

    1、客户端连接到Web服务器

    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com

    2、发送HTTP请求

    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

    3、服务器接受请求并返回HTTP响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4、释放连接TCP连接

    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5、客户端浏览器解析HTML内容

    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

    HTTP请求消息Request

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式

    请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

    请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本
    Get请求例子,使用Charles抓取的request:
    GET /562f25980001b1b106000338.jpg HTTP/1.1
    Host    img.mukewang.com
    User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
    Accept    image/webp,image/*,*/*;q=0.8
    Referer    http://www.imooc.com/
    Accept-Encoding    gzip, deflate, sdch
    Accept-Language    zh-CN,zh;q=0.8
    第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

    GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

    第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

    从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

    第三部分:空行,请求头部后面的空行是必须的

    即使第四部分的请求数据为空,也必须有空行。

    第四部分:请求数据也叫主体,可以添加任意的其他数据。

    这个例子的请求数据为空。

    POST请求例子,使用Charles抓取的request:
    POST / HTTP1.1
    Host:www.wrox.com
    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)
    Content-Type:application/x-www-form-urlencoded
    Content-Length:40
    Connection: Keep-Alive
    
    name=Professional%20Ajax&publisher=Wiley

    第一部分:请求行,第一行明了是post请求,以及http1.1版本。
    第二部分:请求头部,第二行至第六行。
    第三部分:空行,第七行的空行。
    第四部分:请求数据,第八行。

    HTTP请求消息Response

    一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

    HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文

     

    例子

    HTTP/1.1 200 OK
    Date: Fri, 22 May 2009 06:07:21 GMT
    Content-Type: text/html; charset=UTF-8
    
    <html>
          <head></head>
          <body>
                <!--body goes here-->
          </body>
    </html>
    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

    第二部分:消息报头,用来说明客户端要使用的一些附加信息

    第二行和第三行为消息报头,
    Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

    第三部分:空行,消息报头后面的空行是必须的
    第四部分:响应正文,服务器返回给客户端的文本信息。

    空行后面的html部分为响应正文。

    请求返回状态码:

    200 OK  当您的操作将在响应正文中返回数据时,出现此结果。

    204 No Content 当您的操作成功,但不在响应正文中返回数据时,出现此结果。

    304 Not Modified(重定向)  当测试实体自上次检索以来是否被修改时,出现此结果。

    403 Forbidden   客户端错误

    401 Unauthorized 客户端错误

    413 Payload Too Large(客户端错误) 当请求长度过长时,出现此结果。

    400 BadRequest(客户端错误) 当参数无效时,出现此结果。

    404 Not Found(客户端错误) 当资源不存在时,出现此结果。

    405 Method Not Allowed(客户端错误)由于方法和资源组合不正确而出现此错误。 例如,您不能对一个实体集合使用 DELETE 或 PATCH。

    412 Precondition Failed  客户端错误

    501 Not Implemented(服务器错误) 当未实施某个请求的操作时,出现此结果。

    503 Service Unavailable(服务器错误) 当 Web API 服务不可用时,出现此结果。

    GET与POST:

     “get”方法提交的数据会直接填充在请求报文的URL上,如“ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1 ”   “?”问号划分域名和get提交的参数,A=B中的A是参数名,B是参数值,多个参数之间用&进行分割,如果参数值是中文,则会转换成诸如%ab%12加密16进制码。一般来说,浏览器处理的URL最大限度长度为1024B(不同浏览器不一样),所以GET方法提交参数长度有限制。

            “post”方法提交的数据会附在正文上,一般请求正文的长度是没有限制的,但表单中所能处理的长度一般为100k(不同协议不同浏览器不一样),而且需要考虑下层报文的传输效率,不推荐过长。

            所以GET方法可以用来传输一些可以公开的参数信息,解析也比较方便,如百度的搜索的关键词,而POST方法可以用来提交一个用户的敏感信息(如果不使用HTTPS加密,报文正文仍旧是明文,容易被人截获读取)

    主要特点

    1、无连接

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

    2、无状态

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

     3、简单快速

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

    4、灵活

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

    5、支持B/S及C/S模式

     

     

    作业:

    了解 HTTP 协议的基本知识,包括请求流程、请求方法等

      http是超文本传输协议,默认端口号为80,客户端是动态的,浏览器会自动默认为80

      https默认端口号为443

      请求方法8种

      get、post、put、delete、options、trace、connect、head

      请求流程2种分为request和response,但是他们的流程都是相同的,一个请求一个接收

      流程为:状态行、消息报头、空行和响应正文

      请求响应步骤:

      客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容

       

     

    posted @ 2018-08-10 13:51 韦邦杠 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 什么是http请求和http响应?

    千次阅读 2018-06-20 16:41:05
    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages什么是HTTP?超文本传输​​协议... HTTP遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。 HTTP是无状态...


    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages

    什么是HTTP?

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

    1. HTTP概述

    HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。

    客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。

    由像浏览器这样的客户端发出的消息叫做 requests

    被服务端回应的消息叫做 responses

    什么是客户端?

    user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及Web开发人员调试应用程序。

    什么是web服务?

    在上述通信过程的另一端,是由Web Server来服务并提供客户端所请求的文档。Server只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 ...)发起请求来获取部分或全部资源。

    什么是代理?

    在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息。由于Web栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于HTTP应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理(Proxies)既可以表现得透明,又可以不透明(“改变请求”不会通过它们)。代理主要有如下几种作用:

    • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
    • 过滤(像反病毒扫描,家长控制...)
    • 负载均衡(让多个服务器服务不同的请求)
    • 认证(对不同资源进行权限管理)
    • 日志记录(允许存储历史信息)

    HTTP 报文

    HTTP/1.1以及更早的HTTP协议报文都是语义可读的。在HTTP/2中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文头部的压缩和复用。即使只有原始HTTP报文的一部分以HTTP/2发送出来,每条报文的语义依旧不变,客户端会重组原始HTTP/1.1请求。因此用HTTP/1.1格式来理解HTTP/2报文仍旧有效。

    有两种HTTP报文的类型,请求与回应,每种都有其特定的格式。

    请求

    HTTP请求的一个例子:

    A basic HTTP request

    请求由以下元素组成:

    • 一个HTTP的method,经常是由一个动词像GETPOST 或者一个名词像OPTIONSHEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。
    • 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocolhttp://),domaindeveloper.mozilla.org),或是TCP的port(HTTP一般在80端口)。
    • HTTP协议版本号。
    • 为服务端表达其他信息的可选头部headers
    • 对于一些像POST这样的方法,报文的body就包含了发送的资源,这与回应报文的body类似。

    回应

    HTTP回应的一个例子:

    回应报文包含了下面的元素:

    • HTTP协议版本号。
    • 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
    • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
    • HTTP headers,与请求头部类似。
    • 可选项,比起请求报文,响应报文中更常见地包含获取的资源body。
    • 常用的状态码




    总结

    HTTP是一种简单可扩展的协议,其Client-Server的结构以及轻松扩展头部信息的能力使得HTTP可以和Web共同发展。

    即使HTTP/2为了提高性能将HTTP报文嵌入到帧中这一举措增加了复杂度,但是从Web应用的角度看,报文的基本结构没有变化,从HTTP/1.0发布起就是这样的结构。会话流依旧简单,通过一个简单的 HTTP message monitor就可以查看和纠错。



    展开全文
  • HTTP请求的完全过程

    万次阅读 多人点赞 2019-05-27 11:22:45
    HTTP请求的完全过程 1.1 浏览器根据域名解析IP地址 浏览器根据访问的域名找到其IP地址。DNS查找过程如下: 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)...

     HTTP请求的完全过程

    1.1 浏览器根据域名解析IP地址

           浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

    1. 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
    2. 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
    3. 路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
    4. ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。

    1.2 浏览器与WEB服务器建立一个TCP连接

           TCP的3次握手。

    1.3 浏览器给WEB服务器发送一个HTTP请求

           一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。

    1.3.1 请求行

           请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

    1.请求方法

           HTTP/1.1 定义的请求方法有8种:GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

    (1)GET

           当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一半最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    (2)POST

           允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

    2.URL

           URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。

           组成:<协议>://<主机>:<端口>/<路径>

           端口和路径有事可以省略(HTTP默认端口号是80)

    3.协议版本

           协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

    1.3.2 请求头部

           请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

           请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

    1.3.3 请求数据

           请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最长使用的请求头部是Cntent-Type和Content-Length。下面是一个POST方法的请求报文:

    POST  /index.php HTTP/1.1    请求行

    Host: localhost

    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头

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

    Accept-Language: zh-cn,zh;q=0.5

    Accept-Encoding: gzip, deflate

    Connection: keep-alive

    Referer: http://localhost/

    Content-Length:25

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

      空行

    username=aa&password=1234  请求数据

    1.4 服务器端响应HTTP请求,浏览器得到HTML代码

           HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。

    1.4.1 状态行

           状态行由3部分组成,分别为:协议版本、状态码、状态码扫描。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。

    1.4.2 响应头部

    1.4.3 响应数据

           用于存放需要返回给客户端的数据信息。

    HTTP/1.1 200 OK  状态行

    Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部

    Server: Apache/2.2.8 (Win32) PHP/5.2.5

    X-Powered-By: PHP/5.2.5

    Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

    Expires: Thu, 19 Nov 1981 08:52:00 GMT

    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

    Pragma: no-cache

    Content-Length: 4393

    Keep-Alive: timeout=5, max=100

    Connection: Keep-Alive

    Content-Type: text/html; charset=utf-8

      空行

     

    <html>  响应数据

    <head>

    <title>HTTP响应示例<title>

    </head>

    <body>

    Hello HTTP!

    </body>

    </html>

    1.5 浏览器解析HTML代码,并请求HTML代码中的资源

           浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。

    1.6 关闭TCP连接,浏览器对页面进行渲染呈现给用户

           浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。

    展开全文
  • HTTP请求行、请求头、请求体详解

    万次阅读 多人点赞 2017-03-30 19:09:22
    HTTP请求
    引用
    学习Web开发不好好学习HTTP报文,将会“打拳不练功,到老一场空”,你花在犯迷糊上的时间比你沉下心来学习HTTP的时间肯定会多很多。

    HTTP请求报文解剖 

    HTTP请求报文由3部分组成(请求行+请求头+请求体): 

     

    下面是一个实际的请求报文: 

     

    ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。 

    ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL,③是协议名称及版本号。 

    ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。 

    ⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

    对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图: 

     


    引用
    HttpWatch是强大的网页数据分析工具,安装后将集成到Internet Explorer工具栏中。它不用代理服务器或一些复杂的网络监控工具,就能抓取请求及响应的完整信息,包括Cookies、消息头、查询参数、响应报文等,是Web应用开发人员的必备工具。


    HTTP请求报文头属性 

    报文头属性是什么东西呢?我们不妨以一个小故事来说明吧。 

    引用
    快到中午了,张三丰不想去食堂吃饭,于是打电话叫外卖:老板,我要一份[鱼香肉丝],要12:30之前给我送过来哦,我在江湖湖公司研发部,叫张三丰。


    这里,你要[鱼香肉丝]相当于HTTP报文体,而“12:30之前送过来”,你叫“张三丰”等信息就相当于HTTP的报文头。它们是一些附属信息,帮忙你和饭店老板顺利完成这次交易。 

    请求HTTP报文和响应HTTP报文都拥有若干个报文关属性,它们是为协助客户端及服务端交易的一些附属信息。 


    常见的HTTP请求报文头属性 

    Accept 

    请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。 

    如下报文头相当于告诉服务端,俺客户端能够接受的响应类型仅为纯文本数据啊,你丫别发其它什么图片啊,视频啊过来,那样我会歇菜的~~~: 

    Java代码  收藏代码
    1. Accept:text/plain  


    Accept属性的值可以为一个或多个MIME类型的值,关于MIME类型,大家请参考:http://en.wikipedia.org/wiki/MIME_type 

    Cookie 

    客户端的Cookie就是通过这个报文头属性传给服务端的哦!如下所示: 
    Java代码  收藏代码
    1. Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C  

    服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。 


    Referer 

    表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。 
    引用

    唐僧到了西天. 
    如来问:侬是不是从东土大唐来啊? 
    唐僧:厉害!你咋知道的! 
    如来:呵呵,我偷看了你的Referer... 


    很多貌似神奇的网页监控软件(如著名的 我要啦),只要在你的网页上放上一段JavaScript,就可以帮你监控流量,全国访问客户的分布情况等报表和图表,其原理就是通过这个Referer及其它一些HTTP报文头工作的。 

    Cache-Control 

    对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。 

    如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存: 
    Java代码  收藏代码
    1. Cache-Control: no-cache  


    其它请求报文头属性 

    参见:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields 

    如何访问请求报文头 

    由于请求报文头是客户端发过来的,服务端当然只能读取了,以下是HttpServletRequest一些用于读取请求报文头的API: 

    Java代码  收藏代码
    1. //获取请求报文中的属性名称  
    2. java.util.Enumeration<java.lang.String>   getHeaderNames();  
    3.   
    4. //获取指定名称的报文头属性的值  
    5. java.lang.String getHeader(java.lang.String name)   


    由于一些请求报文头属性“太著名”了,因此HttpServletRequest为它们提供了VIP的API: 

    Java代码  收藏代码
    1. //获取报文头中的Cookie(读取Cookie的报文头属性)  
    2.  Cookie[]   getCookies() ;  
    3.   
    4. //获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
    5. java.util.Locale    getLocale()   
    6.   
    7. //获取请求报文体的长度(读取Content-Length的报文头属性)  
    8. int getContentLength();  


    HttpServletRequest可以通过 
    Java代码  收藏代码
    1. HttpSession getSession()   

    获取请求所关联的HttpSession,其内部的机理是通过读取请求报文头中Cookie属性的JSESSIONID的值,在服务端的一个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。(这样,你就不会觉得HttpSession很神秘了吧,你自己也可以做一个类似的会话管理  ) 

    HTTP响应报文解剖 

    响应报文结构 

    HTTP的响应报文也由三部分组成(响应行+响应头+响应体): 

     

    以下是一个实际的HTTP响应报文: 

     

    ①报文协议及版本; 
    ②状态码及状态描述; 
    ③响应报文头,也是由多个属性组成; 
    ④响应报文体,即我们真正要的“干货”。 

    响应状态码 

    和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。 

    HTTP的响应状态码由5段组成: 

    • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
    • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
    • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
    • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
    • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。


    以下是几个常见的状态码: 

    200 OK 

    你最希望看到的,即处理成功! 

    303 See Other 

    我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。 
    引用
    悟空:师傅给个桃吧,走了一天了 
    唐僧:我哪有桃啊!去王母娘娘那找吧


    304 Not Modified 

    告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧,我很忙哦,你能不能少来烦我啊! 

    404 Not Found 

    你最不希望看到的,即找不到页面。如你在google上找到一个页面,点击这个链接返回404,表示这个页面已经被网站删除了,google那边的记录只是美好的回忆。 

    500 Internal Server Error 

    看到这个错误,你就应该查查服务端的日志了,肯定抛出了一堆异常,别睡了,起来改BUG去吧! 


    其它的状态码参见:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 


    有些响应码,Web应用服务器会自动给生成。你可以通过HttpServletResponse的API设置状态码: 

    Java代码  收藏代码
    1. //设置状态码,状态码在HttpServletResponse中通过一系列的常量预定义了,如SC_ACCEPTED,SC_OK  
    2. void    setStatus(int sc)   


    常见的HTTP响应报文头属性 

    Cache-Control 

    响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。 

    下面,的设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取(当然,这个功能是靠客户端实现的,服务端只是通过这个属性提示客户端“应该这么做”,做不做,还是决定于客户端,如果是自己宣称支持HTTP的客户端,则就应该这样实现)。 

    Java代码  收藏代码
    1. Cache-Control: max-age=3600  


    ETag 

    一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。 

    关于ETag的说明,你可以参见:http://en.wikipedia.org/wiki/HTTP_ETag。 
    Spring 3.0还专门为此提供了一个org.springframework.web.filter.ShallowEtagHeaderFilter(实现原理很简单,对JSP输出的内容MD5,这样内容有变化ETag就相应变化了),用于生成响应的ETag,因为这东东确实可以帮助减少请求和响应的交互。 

    下面是一个ETag: 
    Java代码  收藏代码
    1. ETag: "737060cd8c284d8af7ad3082f209582d"  


    Location 

    我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的,如下的报文头属性,将使客户端redirect到iteye的首页中: 

    Java代码  收藏代码
    1. Location: http://www.iteye.com  


    Set-Cookie 

    服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的: 

    Java代码  收藏代码
    1. Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1  



    其它HTTP响应报文头属性 

    更多其它的HTTP响应头报文,参见:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields 


    如何写HTTP请求报文头 

    在服务端可以通过HttpServletResponse的API写响应报文头的属性: 

    Java代码  收藏代码
    1. //添加一个响应报文头属性  
    2. void    setHeader(String name, String value)   


    象Cookie,Location这些响应都是有福之人,HttpServletResponse为它们都提供了VIP版的API: 
    Java代码  收藏代码
    1. //添加Cookie报文头属性  
    2. void addCookie(Cookie cookie)   
    3.   
    4. //不但会设置Location的响应报文头,还会生成303的状态码呢,两者天仙配呢  
    5. void    sendRedirect(String location)   

    展开全文
  • 完整的HTTP请求会经历以下过程

    万次阅读 多人点赞 2019-12-08 17:41:18
    一次完整的Http请求,虽然说的是浏览器,但是换成ios,android也是完全没毛病的。原文http://blog.51cto.com/linux5588/1351007 当我们在浏览器的地址栏输入www.linux178.com,然后回车,回车这一瞬间到看到页面...
  • 一个完整的HTTP请求过程详细

    万次阅读 多人点赞 2018-05-29 14:41:54
    一个完整的HTTP请求过程 整个流程 域名解析 —&gt; 与服务器建立连接 —&gt; 发起HTTP请求 —&gt; 服务器响应HTTP请求,浏览器得到html代码 —&gt; 浏览器解析html代码,并请求html代码中的资源...
  • HTTP请求详解含POST,GET实例

    万次阅读 多人点赞 2018-05-05 21:45:55
    HTTP的组成http消息由客户端到服务端的请求以及服务端到客户端的响应组成HTTP请求报文的格式请求头与请求正文中间有一行空行,是告诉服务器请求头到此结束了接下来是请求正文请求方法:get,post,head,delete等等,...
  • HTTPS请求的整个过程的详细分析

    千次阅读 2019-05-09 11:28:02
    目录 一、基础知识 二、HTTPS进行的流程 三、HTTPS和HTTP的区别 一、基础知识 (1)HTTPS的介绍 HTTPS是一种应用层协议,本质上来说它是HTTP协议的一种变种。HTTPS比HTTP协议安全,因为HTTP是明文传输,而......
  • HTTP请求头详解

    万次阅读 多人点赞 2010-12-08 08:35:00
    当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定...
  • HTTP请求中常见的请求方式

    千次阅读 2019-06-22 10:13:34
    向指定路径资源提交数据进行处理请求(一般用于上传表单或者文件),数据包含在请求体中 OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,允许客户端查看、测试服务器性能 ...
  • Request Payload 请求头部的Content-Type: application/json,请求正文是一个 json 格式的字符串 Form Data 请求头部的Content-Type: application/x-www-form-urlencoded,请求正文是类似 get 请求 url 的请求参数 ...
  • chrome 查看HTTP请求详情

    万次阅读 2015-12-31 21:52:33
    第一步:选择XHR(JS的一套HTTP调用接口) 第二步:滚动时间轴,相应的会在Name处显示请求的名称 第三步:选中请求的名称 第四步:查看请求详情(包括请求头,请求体)
  • 在项目中发现ajax中出现两次请求,OPTIONS请求和GET请求,得到的数据出错,所以想要去掉OPTIONS请求
  • 常见HTTP错误代码大全

    万次阅读 多人点赞 2011-06-24 15:10:00
    一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求...
  • http预请求options

    万次阅读 多人点赞 2018-08-10 14:49:44
    在有很多情况下,当我们在js里面调用一次ajax请求时,在浏览器那边却会查询到两次请求,第一次的Request Method参数是OPTIONS,还有一次就是我们真正的请求,比如get或是post请求方式 查阅相关的资料之后发现,这是浏览器...
  • HTTP常见状态码(404、400、500)等错误

    万次阅读 多人点赞 2018-01-22 11:53:10
    一些常见的状态码为: 200 - 服务器成功返回网页  ...100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。  101 (切换协议) 请求者已要求服务器切换协议,服
  • Postman使用笔记——Postman发送get请求

    万次阅读 2019-09-02 23:54:57
    在实际的开发当中,我们经常用到get或者post请求。在这篇博客里面分享一下,如何在Postman中发送get请求。 发送get请求 1.在Postman工作空间选定get请求 图中我们可以看到很多请求方式,我们需要选中图中的get...
  • Vue axios请求PUT/DELETE请求变OPTIONS

    万次阅读 2017-12-19 16:34:46
    问题:vue项目中使用axios请求,在使用get请求时没问题,在测试PUT/DELETE时出现请求类型变成OPTIONS的情况。
  • 同步请求和异步请求的区别

    万次阅读 多人点赞 2019-01-10 09:03:57
    举个例子:普通B/S模式(同步)AJAX技术(异步)同步:提交请求-&gt;等待服务器处理-&gt;处理完毕返回 这个期间客户端浏览器不能干任何事异步: 请求通过事件触发-&gt;服务器处理(这是浏览器仍然可以作...
  • 最近看Elasticsearch: The Definitive Guide这本书的时候,有些时候发现使用curl的时候,在GET请求中加了-d参数,因为很少见到GET请求请求体中带参数,一般情况下都是在URL里面的,所以好奇特地用wireshark抓了...
1 2 3 4 5 ... 20
收藏数 3,441,691
精华内容 1,376,676
关键字:

请求