Go ahead every day !

HTTP Post &Get 区别

上一篇 / 下一篇  2011-05-30 16:26:00 / 个人分类:测试周边知识

0\2Y'tx0Y8{'J0一 原理区别51Testing软件测试网/Km:Q:`(MM"J

51Testing软件测试网bQ0@Qz"b0N

    一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交51Testing软件测试网QbLf7JH

51Testing软件测试网)r\EYF B|

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

A_7H_V w0

Ko'f_T:^0    URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。51Testing软件测试网1val1QI+\mW

Fb#Gw1b'pI)yb0  根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的51Testing软件测试网N4y!JMKcI

`0r:AVrZ;GDv0  1.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

!A{E }|A0

*h t@(Gh(n p7l g:f0  * 注意:这里安全的含义仅仅是指是非修改信息。

%?7K qRq9G0

M5K0qGB)W+F,A7`]:n0  2.幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等 这个概念:

@ mRXu051Testing软件测试网:v3B l@%jg

  但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。51Testing软件测试网(jkHl:H1vM

51Testing软件测试网4Z J y}?

  根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。

$gfdJX7lH5l051Testing软件测试网T5mZ%FEZ9A

二 表现形式区别51Testing软件测试网~9~ies

51Testing软件测试网 nO)J @2`8I

    搞清了两者的原理区别,我们再来看一下他们实际应用中的区别:

'L2x"M,m(jx051Testing软件测试网Va7~Z8Uz!Vh

    为了理解两者在传输过程中的不同,我们先看一下HTTP协议的格式:

:p t#l9MN*HtFl051Testing软件测试网FH6x7RV$e/U;O;m'@

HTTP请求:

t+A x\'k8R*D8qG0
51Testing软件测试网m tD'\ zV`

<request line>

2R4pr@\9G&M051Testing软件测试网4[ ]Tt%H s$q O@#f

<headers>51Testing软件测试网$`ye%Z!Y%z U R4n

51Testing软件测试网)o9e-T(xa

<blank line>51Testing软件测试网9l|Wa TE!fB)c7I

*},_F%^B~r0<request-body>]51Testing软件测试网ei)H V;DSg%Yc

.Es6[*Fnwn"l0BYk0    在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。51Testing软件测试网#Y4zH iGo/J

Z}#zEU:T0GET与POST方法实例:51Testing软件测试网%_&Pl| v;F$h
GET /books/?sex=man&name=ProfessionalHTTP/1.151Testing软件测试网~2y&M](a.X-n
Host:www.wrox.com
L,H s D]I0User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
`rV~ t.d&PJ(Y0Gecko/20050225 Firefox/1.0.151Testing软件测试网Z%mWj-r8[*o
Connection: Keep-Alive
51Testing软件测试网@'wL"\WG

*Hp&T7r!Nn$[0POST / HTTP/1.1
J]5Tz-?W0|!I:NW0Host:
www.wrox.com
hE}$P4Q)M*cY0User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Cu+f'CYc0Gecko/20050225 Firefox/1.0.1
"K&X'K{C | k0Content-Type: application/x-www-form-urlencoded
&?(H0Lg~"F0Content-Length: 40
w f7lOLz+m1f0Connection: Keep-Alive51Testing软件测试网3yc;kt:^-u}%\
     (----此处空一行----)
%|3QU;n%t(wed0name=Professional%20Ajax&publisher=Wiley51Testing软件测试网7w2b8yJ&m2A3mR

51Testing软件测试网 U+`R k&p)g

   有了以上对HTTP请求的了解和示例,我们再来看两种提交方式的区别:51Testing软件测试网&U^dUs

S.a2sv B y0   (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。

0rx@ C0x5N0

G ~j3pK0  POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据51Testing软件测试网9fA wk WE%F

d C1dvT0     因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变51Testing软件测试网&Y d;x8F*{{B

%l9i#anK7r0    (2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:51Testing软件测试网0h:UR\T/C;H/V X-GS

i.H.u;wsog0    GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。 因此对于GET提交时,传输数据就会受到URL长度的限制。51Testing软件测试网 zSeb!kG

51Testing软件测试网3d uy;tL#Q"i*{'z

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

zK5]oD#@051Testing软件测试网$H``3A2Vxk!bXw

 (3)安全性:51Testing软件测试网2k2Xmdv5WW

51Testing软件测试网} ?`oG p G

    POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击51Testing软件测试网+u%Qr3GP(d@C

p,JUe/wzgRbU0(4)Http get,post,soap协议都是在http上运行的
ceY0]Z&TWJ+e!@(j01)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的查询字符串的长度受到web浏览器和web服务器的限制(如IE最多支持2048个字符),不适合传输大型数据集同时,它很不安全51Testing软件测试网5~0t7u%}.ZNU
2)post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form-urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。 但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。51Testing软件测试网{0H Fv3E l
3)soap:是http post的一个专用版本,遵循一种特殊的xml消息格式51Testing软件测试网y7}Q*zq?O;K
       Content-type设置为: text/xml   任何数据都可以xml化
51Testing软件测试网+s;S3S9m)[[8? U2d

51Testing软件测试网*EK3N-x1a

三 HTTP响应51Testing软件测试网9yG*@Y.d,C&P ~ ~
1.HTTP响应格式:

1q-t?8U6W'kN'T051Testing软件测试网 U'j%f'c+F*M dy

51Testing软件测试网,zDU `zl^
<status line>51Testing软件测试网 fQ[G{x%H8]3zq
<headers>51Testing软件测试网@_g,E.J-Z2A
<blank line>51Testing软件测试网xW f2s1{o/h9Ja
[<response-body>]

qBe ya9\'| R3w)C0

9_ JGc)C;r3R0在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。51Testing软件测试网QiX ~9jrn2OW!b
     51Testing软件测试网E9Kv T g ?I|A
 HTTP响应实例:51Testing软件测试网n$g$^i D

X6qu7Yz\C&OaV!D1F0HTTP/1.1 200 OK51Testing软件测试网R!Z2vPrkzr
Date: Sat, 31 Dec 2005 23:59:59 GMT
S/vL\;JI,G8w0Content-Type: text/html;charset=ISO-8859-1
-y!vPM.{sl0Content-Length: 12251Testing软件测试网aTb'z+G:M8zF [
<html>
E'^ uRwO0<head>51Testing软件测试网w+^+d PIjU e
<title>Wrox Homepage</title>
\Ar{.|Z0</head>51Testing软件测试网"u5e!O-e(k/wK
<body>
k o_4Uy_9d[0<!-- body goes here -->
A)bU%] k&kv0</body>
}9yt/AAlfM4{0</html>51Testing软件测试网3X0`0w9a'j#Y
2.最常用的状态码有:51Testing软件测试网$}Y,S]y gp

51Testing软件测试网"`L4^8qI.}#q F

◆200 (OK): 找到了该资源,并且一切正常。51Testing软件测试网%^c h.T?
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
nAKZ o0T0◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。51Testing软件测试网yOtKU_%N?0K
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。51Testing软件测试网&\ Wky's$Ks A
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

*A)Y3S4|:v&sK S3O051Testing软件测试网s1{t0d3Tj0Y4p

四 完整示例:51Testing软件测试网F#@sKg/O

51Testing软件测试网P E fS o3P(}l-H

例子:

9I-e~ h;~Pf8FBG*L051Testing软件测试网 D;qy [ Q?

51Testing软件测试网-K8oS ? R)tR8U{!jf
HTTP GET51Testing软件测试网&N"y*wo%m:V:M IU

)Z@'HC2r%X0发送51Testing软件测试网T xF"dM6ufIzex-X5r

RO5a?0qf `1CU$C!d0GET /DEMOWebServices2.8/Service.asmx/CancelOrder?UserID=string&PWD=string&OrderConfirmation=string HTTP/1.1
{;W2@5BZ"Sx0Host: api.efxnow.com51Testing软件测试网)XD1~jM9f Pg%e

S(CyaZ lE \0回复

|,vSp_j"i'?051Testing软件测试网:L~1d~fU V1W

HTTP/1.1 200 OK51Testing软件测试网ut+_l"k n5K
Content-Type: text/xml; charset=utf-8
]d-vxt [%y&\k];[0Content-Length: length51Testing软件测试网:q-b \.eq4@3a%o

?R)nU+c}x8tB0<?xml version="1.0" encoding="utf-8"?>51Testing软件测试网&qs$TTGmW J TY s9{-K
<objPlaceOrderResponse xmlns="https://api.efxnow.com/webservices2.3">51Testing软件测试网7`H]$Xo\q:C9w
<Success>boolean</Success>51Testing软件测试网Z/In!?+P6D)e
<ErrorDescription>string</ErrorDescription>
d/T\Tq&l(H$F0<ErrorNumber>int</ErrorNumber>
3SX9KS5v5W"L/v?^W0<CustomerOrderReference>long</CustomerOrderReference>
{dxpO Y`0<OrderConfirmation>string</OrderConfirmation>
9C+xK0n4F2Vf"}Q3}0<CustomerDealRef>string</CustomerDealRef>
:CD^ GO/t-ww0</objPlaceOrderResponse>

`6`u @ d8L051Testing软件测试网m pYDD&?$V

 

7|:p-z~ye051Testing软件测试网@"Ox4`*s S

HTTP POST

t+h)_O5N x051Testing软件测试网tf.P'A r8V

发送51Testing软件测试网9C9xOSSse

51Testing软件测试网n"_tt ZfW

POST /DEMOWebServices2.8/Service.asmx/CancelOrder HTTP/1.151Testing软件测试网 n6?da k
Host: api.efxnow.com51Testing软件测试网y?zq;BPc
Content-Type: application/x-www-form-urlencoded51Testing软件测试网 {+@ yuri/~b;X~j!f.W*O
Content-Length: length

6B3Xi8D&NHM.cQA6}051Testing软件测试网:Qt[riNW1Gz

UserID=string&PWD=string&OrderConfirmation=string51Testing软件测试网z_c:j r4O5~0K

k ^8w)zz3?0回复

y mNy-['@051Testing软件测试网0v&^,GCG!b;G

HTTP/1.1 200 OK51Testing软件测试网N wS-klG
Content-Type: text/xml; charset=utf-8
EA5wNo}X(G4Cw"E0Content-Length: length51Testing软件测试网:Ri{w9o,v{ i

.a+fJ#R3le3T v0<?xml version="1.0" encoding="utf-8"?>
8Bt6HlEF0<objPlaceOrderResponse xmlns="https://api.efxnow.com/webservices2.3">
aQaIUyO2le#jF0<Success>boolean</Success>
1R0W}4Tf;r S0<ErrorDescription>string</ErrorDescription>51Testing软件测试网CO]4f0@tW&C
<ErrorNumber>int</ErrorNumber>51Testing软件测试网1iKT%Va0M3@S
<CustomerOrderReference>long</CustomerOrderReference>
W0s)Y)rAt8S0<OrderConfirmation>string</OrderConfirmation>
+OgmB7QZ0<CustomerDealRef>string</CustomerDealRef>51Testing软件测试网dR X'j Hz8TG
</objPlaceOrderResponse>51Testing软件测试网%wFxZ%w8{-r%O$E"g

~]m;q&Q3C0 

dv's4r:e*?%^_8\0

(aq2p:[ W1[5T#\0SOAP 1.251Testing软件测试网!?*H5whA9r

[e"? Fx?0发送51Testing软件测试网 w)Fj5t ge1}o

mp-t#A0j*N0POST /DEMOWebServices2.8/Service.asmx HTTP/1.1
S uA;|Sv0Host: api.efxnow.com
p5{E/yK$O0Content-Type: application/soap+xml; charset=utf-851Testing软件测试网1w,VM0A%Sc ^7d,weZy
Content-Length: length51Testing软件测试网!a Y8V*wP8f

51Testing软件测试网/F-o h7f'Od!l5]$M

<?xml version="1.0" encoding="utf-8"?>
+e]oc(ZA0<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">51Testing软件测试网j!{ v{5b"[(y5dS8_
<soap12:Body>51Testing软件测试网M!d1\$Y.jo'p
    <CancelOrder xmlns="https://api.efxnow.com/webservices2.3">51Testing软件测试网~`rNj#z[7r)gw$d
      <UserID>string</UserID>51Testing软件测试网$M @``,U-A,M
      <PWD>string</PWD>51Testing软件测试网 c[~|A9YCtUv
      <OrderConfirmation>string</OrderConfirmation>51Testing软件测试网 E h@R@t
    </CancelOrder>51Testing软件测试网ZV;p6xc)}Tw
</soap12:Body>
2n]0V4Jn'q3Z*B~0</soap12:Envelope>51Testing软件测试网$w@,z4oH"iw

51Testing软件测试网6E4V,bP#n!P|(J

回复51Testing软件测试网R/YDqv8n

51Testing软件测试网z oB:^Kb6a

HTTP/1.1 200 OK
[8~#[{.M&Z!?0Content-Type: application/soap+xml; charset=utf-8
aV |jl.U0Content-Length: length51Testing软件测试网7d3kqK-H~

51Testing软件测试网4`};zi _/vwE

<?xml version="1.0" encoding="utf-8"?>51Testing软件测试网K&R%O_`S
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">51Testing软件测试网 Qd K;Sk}8g s!q
<soap12:Body>
G0v?be9N;G!TT ?0    <CancelOrderResponse xmlns="https://api.efxnow.com/webservices2.3">51Testing软件测试网b9oKj:}@s,o
      <CancelOrderResult>
$_-Rs!V bf1I6Al0        <Success>boolean</Success>
Bi|4[1A:d0        <ErrorDescription>string</ErrorDescription>
&W9`(v#G&}e {-NIGCtM0        <ErrorNumber>int</ErrorNumber>
5]6gn:LV-dl0        <CustomerOrderReference>long</CustomerOrderReference>
a6eCX-?v~k-b0        <OrderConfirmation>string</OrderConfirmation>51Testing软件测试网!p}y,m SC,n
        <CustomerDealRef>string</CustomerDealRef>51Testing软件测试网8s(M(aTy!\xu)F
      </CancelOrderResult>
"BN]3zqM,`!Lc0    </CancelOrderResponse>
cD%TZ)G7|t6C0</soap12:Body>
s6G V`!Hv0</soap12:Envelope>

$H@+K8{!B2A051Testing软件测试网u5v[.KB Y\s [

 51Testing软件测试网c^/~~x~

A']zk^A,a'f:I^,o0本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gideal_wang/archive/2009/07/02/4316691.aspx

$Pu/@r#L#C%@t#lI$j0

TAG:

 

评分:0

我来说两句

Open Toolbar