您的位置:首页 > 理论基础 > 计算机网络

HTTP请求响应报文&&相关状态码&&GET_POST请求方法

2016-09-07 16:21 666 查看


HTTP请求报文:


一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据


1.请求行  

请求行由请求 方法字段、URL字段和HTTP协议版本字段 3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1 

方法字段就是HTTP使用的请求方法,比如常见的GET/POST


其中HTTP协议版本有两种:HTTP1.0/HTTP1.1 可以这样区别:

HTTP1.0对于每个连接都的建立一次连接一次只能传送一个请求和响应,请求就会关闭,HTTP1.0没有Host字段;而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。 


2.请求头部


请求头部是 字段名:值 的格式展现

用于HTTP请求中的常用请求头字段 

Accept:   用于高速服务器,客户机支持的数据类型

Accept-Charset:  用于告诉服务器,客户机采用的编码格式

Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式

Accept-Language:客户机的语言环境

Host: 客户机通过这个头高速服务器,想访问的主机名

If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间

Referer:   客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)

User-Agent:   客户机通过这个头告诉服务器,客户机的软件环境

Cookie:    客户机通过这个头可以向服务器带数据

Connection:   处理完这次请求后是否断开连接还是继续保持连接

Date:    当前时间值


比如通过百度的GET某张图片--其相应请求头部




3.空行

空行的表现形式很直接,就是一个空行

它的作用是通过一个空行,告诉服务器请求头部到此为止

4. 请求数据

若方法字段是GET,则此项为空,没有数据

若方法字段是POST,则通常来说此处放置的就是要提交的数据

比如要使用POST方法提交一个表单,其中有name字段中数据为“xiaoming",age字段为17

那么这里的请求数据就是  name=xiaoming&age=17    使用&来连接各个字段


总的来说,HTTP请求报文 就如同这张图所示-->




一个稍微完整的HTTP请求报文:




上面是POST方法,它的请求行URL段中一般是没有参数的,参数放在了报文体中


接下来看看GET方法,参数直接置于请求行URL中,报文体则为空

假设通过get方法,产生了这么一个链接:
<span class="tag" style="color:#0080;"><<span class="title">a</span> <span class="attribute" style="color:#08080;">href</span>=<span class="value" style="color:#dd1144;">"http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq="</span>></span>http:<span style="color:#0800;">//</span><span style="color:#0800;">www.google.cn/search?hl=zh-CN&source=hp</span>
&q=domety&aq=f&oq=<span class="tag" style="color:#0080;"></<span class="title">a</span>></span><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>


则相应的请求报文为:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1<span style="color:#000000;">
Accept: image</span>/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-<span style="color:#000000;">powerpoint,
application</span>/msword, application/x-silverlight, application/x-shockwave-flash, */*<span style="color:#000000;">
Referer: </span><span class="tag" style="color:#0080;"><<span class="title">a</span> <span class="attribute" style="color:#08080;">href</span>=<span class="value" style="color:#dd1144;">"http://www.google.cn/"</span>></span>http:<span style="color:#0800;">//</span><span style="color:#0800;">www.google.cn/<span class="tag" style="color:#0080;"></<span class="title">a</span>></span>  </span>
Accept-Language: zh-<span style="color:#000000;">cn
Accept</span>-<span style="color:#000000;">Encoding: gzip, deflate
User</span>-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <span class="tag" style="color:#0080;"><<span class="title">a</span> <span class="attribute" style="color:#08080;">href</span>=<span class="value" style="color:#dd1144;">"http://www.google.cn"</span>></span>www.google.cn<span class="tag" style="color:#0080;"></<span class="title">a</span>></span>
Connection: Keep-<span style="color:#000000;">Alive
Cookie: PREF</span>=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=<span style="color:#000000;">ybYcq2wpfefs4V9g;
NID</span>=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-<span style="color:#000000;">
FxlRugatx63JLv7CWMD6UB_O_r</span><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>


HTTP响应报文:


同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体


1.响应行

响应行一般由 协议版本、状态码及其描述 组成   比如 HTTP/1.1 200 OK 

其中协议版本HTTP/1.1 或者HTTP/1.0

200就是它的状态码,OK则为它的描述

---------------------- 常见状态码 --------------- 
<span style="color:#80080;"> 100</span>~<span style="color:#80080;">199</span><span style="color:#000000;">:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
</span><span style="color:#80080;">200</span>~<span style="color:#80080;">299</span><span style="color:#000000;">:表示成功接收请求并已完成整个处理过程。常用200
</span><span style="color:#80080;">300</span>~<span style="color:#80080;">399</span><span style="color:#000000;">:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
</span><span style="color:#80080;">400</span>~<span style="color:#80080;">499</span>:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)<span style="color:#80080;">403</span><span style="color:#000000;">(服务器拒绝访问,权限不够)
</span><span style="color:#80080;">500</span>~<span style="color:#80080;">599</span>:服务器端出现错误,常用500<div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>


还有引自w3school的说明


<span style="color:#000000;">【1xx: 信息】

100 Continue    服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols    服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。

【2xx: 成功】

200 OK    请求成功(其后是对GET和POST请求的应答文档。)
201 Created    请求被创建完成,同时新的资源被创建。
202 Accepted    供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information    文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content    没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Re<span class="operator"><span class="keyword" style="color:#333333;font-weight: bold;">set</span> Content    没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
<span class="number" style="color:#09999;">206</span> <span class="keyword" style="color:#333333;font-weight: bold;">Partial</span> Content    客户发送了一个带有Range头的<span class="keyword" style="color:#333333;font-weight: bold;">GET</span>请求,服务器完成了它。

【<span class="number" style="color:#09999;">3</span>xx: 重定向】

<span class="number" style="color:#09999;">300</span> Multiple Choices    多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。
<span class="number" style="color:#09999;">301</span> Moved Permanently    所请求的页面已经转移至新的url。
<span class="number" style="color:#09999;">302</span> <span class="keyword" style="color:#333333;font-weight: bold;">Found</span>    所请求的页面已经临时转移至新的url。
<span class="number" style="color:#09999;">303</span> See Other    所请求的页面可在别的url下被找到。
<span class="number" style="color:#09999;">304</span> <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> Modified    未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
<span class="number" style="color:#09999;">305</span> Use Proxy    客户请求的文档应该通过Location头所指明的代理服务器提取。
<span class="number" style="color:#09999;">306</span> Unused    此代码被用于前一版本。目前已不再使用,但是代码依然被保留。
<span class="number" style="color:#09999;">307</span> <span class="keyword" style="color:#333333;font-weight: bold;">Temporary</span> Redirect    被请求的页面已经临时移至新的url。

【<span class="number" style="color:#09999;">4</span>xx: 客户端错误】

<span class="number" style="color:#09999;">400</span> Bad Request    服务器未能理解请求。
<span class="number" style="color:#09999;">401</span> Unauthorized    被请求的页面需要用户名和密码。
<span class="number" style="color:#09999;">402</span> Payment Required    此代码尚无法使用。
<span class="number" style="color:#09999;">403</span> Forbidden    对被请求页面的访问被禁止。
<span class="number" style="color:#09999;">404</span> <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> <span class="keyword" style="color:#333333;font-weight: bold;">Found</span>    服务器无法找到被请求的页面。
<span class="number" style="color:#09999;">405</span> Method <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> Allowed    请求中指定的方法不被允许。
<span class="number" style="color:#09999;">406</span> <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> Acceptable    服务器生成的响应无法被客户端所接受。
<span class="number" style="color:#09999;">407</span> Proxy Authentication Required    用户必须首先使用代理服务器进行验证,这样请求才会被处理。
<span class="number" style="color:#09999;">408</span> Request Timeout    请求超出了服务器的等待时间。
<span class="number" style="color:#09999;">409</span> Conflict    由于冲突,请求无法被完成。
<span class="number" style="color:#09999;">410</span> Gone    被请求的页面不可用。
<span class="number" style="color:#09999;">411</span> Length Required    <span class="string" style="color:#dd1144;">"Content-Length"</span> 未被定义。如果无此内容,服务器不会接受请求。
<span class="number" style="color:#09999;">412</span> Precondition Failed    请求中的前提条件被服务器评估为失败。
<span class="number" style="color:#09999;">413</span> Request Entity Too Large    由于所请求的实体的太大,服务器不会接受请求。
<span class="number" style="color:#09999;">414</span> Request-url Too Long    由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的<span class="keyword" style="color:#333333;font-weight: bold;">get</span>请求时,就会发生这种情况。
<span class="number" style="color:#09999;">415</span> Unsupported Media Type    由于媒介类型不被支持,服务器不会接受请求。
<span class="number" style="color:#09999;">416</span>     服务器不能满足客户在请求中指定的Range头。
<span class="number" style="color:#09999;">417</span> Expectation Failed

【<span class="number" style="color:#09999;">5</span>xx: 服务器错误】

<span class="number" style="color:#09999;">500</span> Internal Server Error    请求未完成。服务器遇到不可预知的情况。
<span class="number" style="color:#09999;">501</span> <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> Implemented    请求未完成。服务器不支持所请求的功能。
<span class="number" style="color:#09999;">502</span> Bad Gateway    请求未完成。服务器从上游服务器收到一个无效的响应。
<span class="number" style="color:#09999;">503</span> Service Unavailable    请求未完成。服务器临时过载或当机。
<span class="number" style="color:#09999;">504</span> Gateway Timeout    网关超时。
<span class="number" style="color:#09999;">505</span> HTTP Version <span class="keyword" style="color:#333333;font-weight: bold;">Not</span> Supported    服务器不支持请求中指明的HTTP协议版本。</span></span><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>



更详细全面的状态码:

参见:http://tool.oschina.net/commons?type=5


2.响应头

响应头通常也是由 字段名:值 组成 

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。


常见的响应头字段:

Location:     这个头配合302状态码使用,用于告诉客户找谁。

Server:      服务器通过这个头告诉浏览器服务器的类型。

Content-Encoding: 服务器通过这个头告诉浏览器数据的压缩格式。

Content-Length: 服务器通过这个头告诉浏览器回送数据的长度

Content-Type:   服务器通过这个头告诉浏览器回送数据的类型

Last-Modified:   告诉浏览器当前资源的最后缓存时间

Refresh:      告诉浏览器隔多久刷新一次

Content-Disposition:告诉浏览器以下载方式打开数据

Transfer-Encoding:  告诉浏览器数据的传送格式

ETag:         缓存相关的头

其中三种禁止浏览器缓存的头字段: 

Expires:告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存

Cache-Control:no-cache

Pragma:no-cache

服务器通过以上两个头,也就是控制浏览器不要缓存数据


比如通过百度的GET某张图片--其相应响应头




<span style="color:#08080;">1</span> Cache-Control    max-age=<span style="color:#80080;">315360000</span>
<span style="color:#08080;">2</span> Connection    keep-<span style="color:#000000;">alive
</span><span style="color:#08080;">3</span> Date    Fri, <span style="color:#80080;">20</span> Mar <span style="color:#80080;">2015</span> <span style="color:#80080;">06</span>:<span style="color:#80080;">05</span>:<span style="color:#80080;">22</span><span style="color:#000000;"> GMT
</span><span style="color:#08080;">4</span> Etag    <span style="color:#8000;">"</span><span style="color:#8000;">2c1-4a6473f6030c0</span><span style="color:#8000;">"</span>
<span style="color:#08080;">5</span> Expires    Mon, <span style="color:#80080;">17</span> Mar <span style="color:#80080;">2025</span> <span style="color:#80080;">06</span>:<span style="color:#80080;">05</span>:<span style="color:#80080;">23</span><span style="color:#000000;"> GMT
</span><span style="color:#08080;">6</span> Server    bfe/<span style="color:#80080;">1.0</span>.<span style="color:#80080;">5.38</span>
<span style="color:#08080;">7</span> <span class="operator"><span class="keyword" style="font-weight: bold;">Set</span>-Cookie    __bsi=<span class="number" style="color:#09999;">16929409652610129136</span>_00_122_R_N_1_0303_C02F_N_I_I;</span> expires=Fri, <span style="color:#80080;">20</span>-Mar-<span style="color:#80080;">15</span> <span style="color:#80080;">06</span>:<span style="color:#80080;">05</span>:<span style="color:#80080;">27</span> GMT; domain=www.baidu.com; path=/<div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>



3.响应体

响应体就是响应的消息体

如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。


一个稍微完整的HTTP响应报文:



Http定义了与服务器交互的不同方法,最基本的方法有4种:GET、POST、PUT、DELETE

而HTTP中的 GET,POST,PUT,DELETE 就对应着对URL资源的 查,改,增,删 4个操作。 

所以说:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 


主要区分一下get和post


1.提交数据的形式:

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连

如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,

得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数


2.提交数据的大小

get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,


限制URL长度的是客户端或服务器的支持的不同所影响:

比如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。

所以大小的限制还是得受各个web服务器配置的不同而影响着。


3.提交数据的安全

POST比GET方式的安全性要高

通过GET提交数据,用户名和密码将明文出现在URL上,因为一下几个原因get方式安全性会比post弱:

(1)登录页面有可能被浏览器缓存

(2)其他人查看浏览器的历史纪录,那么别人就可 以拿到你的账号和密码了

(3)当遇上跨站的攻击时,安全性的表现更差了


4.提交数据的安全

tip:这里的安全,不是上诉所述的安全。而是只数据是否会被修改,完整性是否会被破坏的意思。

"  在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。

在JSP中,用 request.getParameter(\"XXXX\")来获取,虽然jsp中也有request.getQueryString()方法,但使用 起来比较麻烦

比如:传一个test.jsp?name=hyddd&password=hyddd,

用 request.getQueryString()得到的是:name=hyddd&password=hyddd。

在PHP中,可以 用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获取GET和POST两种请求中的数据。

值得注意的是,JSP 中使用request和PHP中使用$_REQUEST都会有隐患  "
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: