首页 > 技术文章 > HTTP请求响应报文 - 相关状态码 - GET_POST请求方法

AryaZ 2017-10-15 13:27 原文

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方法,产生了这么一个链接:

<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp
&q=domety&aq=f&oq=</a> 

则相应的请求报文为:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r

 

            HTTP响应报文:

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

1.响应行

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

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

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

----------------------常见状态码---------------

 100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
 200~299:表示成功接收请求并已完成整个处理过程。常用200
 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
 400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
 500~599:服务器端出现错误,常用500

还有引自w3school的说明

    1xx: 信息】

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

【2xx: 成功】

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

【3xx: 重定向】

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

【4xx: 客户端错误】

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

【5xx: 服务器错误】

500 Internal Server Error    请求未完成。服务器遇到不可预知的情况。
501 Not Implemented    请求未完成。服务器不支持所请求的功能。
502 Bad Gateway    请求未完成。服务器从上游服务器收到一个无效的响应。
503 Service Unavailable    请求未完成。服务器临时过载或当机。
504 Gateway Timeout    网关超时。
505 HTTP Version Not Supported    服务器不支持请求中指明的HTTP协议版本。

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某张图片--其相应响应头

 


1 Cache-Control    max-age=315360000
2 Connection    keep-alive
3 Date    Fri, 20 Mar 2015 06:05:22 GMT
4 Etag    "2c1-4a6473f6030c0"
5 Expires    Mon, 17 Mar 2025 06:05:23 GMT
6 Server    bfe/1.0.5.38
7 Set-Cookie    __bsi=16929409652610129136_00_122_R_N_1_0303_C02F_N_I_I; expires=Fri, 20-Mar-15 06:05:27 GMT; domain=www.baidu.com; path=/

 

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.提交数据的安全(1)

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都会有隐患  "

推荐阅读