首页 > 代码库 > HTTP请求与响应

HTTP请求与响应

本文主要转自:http://www.cnblogs.com/lyl6796910/p/3722280.html

HTTP定义

         超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据

传送协议。 这里对http的具体内容就不再介绍了,主要分析http报文信息。

         http报文分为:请求报文和响应报文。

 

HTTP请求报文

         一个Http请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,请求报文个格式如下:

        技术分享

 

Post请求

        弄一个简单的登录页面,使用ajax发送post请求,在IE下浏览,F12分析一下它的请求报文:

       技术分享

        Accept:浏览器可接受的MIME类型。

        Accept-Charset:浏览器可接受的字符集。

        Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。

                                           许多情形下这可以减少5到10倍的下载时间。

        Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

        Authorization:授权信息,通常出现在对服务器发送的WWW - Authenticate头的应答中。

        Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep - Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),

                                 它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一 点,Servlet需要

                                 在应答中发送一个  Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

        Content-Length:表示请求消息正文的长度。

        Cookie:这是最重要的请求头信息之一。

        From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

        Host:初始URL中的主机和端口。

        If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。

        Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

        Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

        User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

        UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

 

请求正文

        技术分享

        从这里可以发现,请求正文就是我们要向服务器post提交的数据。

 

Get请求

        将ajax的请求方式换成"GET",那么get方式请求报文是怎样的呢?

        技术分享

        技术分享

        技术分享

        从上图可以看出post和get请求报文的区别,post提交的数据是在请求正文中,而get提交的数据是在url中。

 

Http响应报文

         技术分享

        从上图可以看出,响应报文和请求报文非常相似,包括:状态行、消息报文、响应正文。

        在响应报文中第一行中用状态信息代替了请求信息,状态行(status)通过提供一个状态吗来说明所请求的资源情况。

        状态行的格式为:

        HTTP-Version Status-Code Reason-Phrase CRLF

         其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态码;Reason-Phrase表示状态码的文本描述。状态码由三位数字组成,

         第一个数字定义了响应的类别,且有5种可能取值:

    • 1xx:指示信息——表示请求已接收,继续处理。
    • 2xx:成功——表示请求已被成功接收、理解、接受。比如200
    • 3xx:重定向——要完成请求必须进行更进一步的操作。
    • 4xx:客户端错误——请求有语法错误或请求无法实现。
    • 5xx:服务端错误——服务器未能实现合法的请求。

常见的状态码:

    • 200 OK:客户端请求成功。
    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
    • 404 Not Found:请求资源不存在。
    • 500 Internal Server Error:服务器发生不可预期的错误。
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能回复正常。

 

 GET和Post的区别

       GET方式,请求的数据会在URL之后(就是将数据放置在http请求<request-line>中),以问号分割URL和传输数 据,多个参数使用&连接,如果数据

       是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文或其他字符,则直接将字符串用Base64加 密,在url中最常见的:%E4%BD%A0%E5%A5%BD,

       这种东东%XX中的XX为该符号以16进制表示的ASCII。

       Post方式,把提交的数据防止在http的包体<request-body>中。上文请求正文中的数据就是实际传输的数据。因此,get提交的数据会在地址栏中显示出来,

       而post不会。

       GET:不同浏览器和服务器对URL长度有限制。例如IE对url的限制是2083字节。其他浏览器如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统

       的支持。 因此对于get提交时,传输数据就会收到url长度限制。

       POST:由于不是通过url传值,理论上是不受限的。但实际各个web服务器会规定对post提交数据大小进行限制。Apache、iis6都有各自的配置。

       get方式和post方式比在安全性上较低,所以比较隐私性的东东一般采用post方式提交。谁也不愿意将自己用户名和密码在url中显示出来吧?

HTTP请求与响应