get和post方式總結
get方式:以URL字串本身傳遞數據參數,在服務器端可以從'QUERY_STRING'這個變量中直接讀取,效率較高,但缺乏安全性,也無法來處理復雜的數據(只能是字符串,比如在servlet/jsp中就無法處理發揮java的比如vector之類的功能)。
post方式:就傳輸方式講參數會被打包在數據報中傳輸,從CONTENT_LENGTH這個環境變量中讀取,便於傳送較大一些的數據,同時因為不暴露數據在瀏覽器的地址欄中,安全性相對較高,但這樣的處理效率會受到影響。
get 請求表示客戶端請求一個uri,服務器返回客戶端請求的uri,post請求表示客戶端請求的時候還要提交數據,比喻提交form表單,要提交的數據會放到請求報文的body部分。服務器收到后這樣的請求后通常需要來處理這些數據。
在Form里面,可以使用post也可以使用get。它們都是method的合法取值。但是,post和get方法在使用上至少有兩點不同:
1、Get方法通過URL請求來傳遞用戶的輸入。Post方法通過另外的形式。
2、Get方式的提交你需要用Request.QueryString來取得變量的值,而Post方式提交時,你必須通過Request.Form來訪問提交的內容。
仔細研究下面的代碼。你可以運行來感受一下:
<!--兩個Form只有Method屬性不同--> <FORM ACTION="getpost.asp" METHOD="get"> <INPUT TYPE="text" NAME="Text" VALUE="Hello World"></INPUT> <INPUT TYPE="submit" VALUE="" Method="Get"></INPUT> </FORM> <BR> <FORM ACTION="getpost.asp" METHOD="post"> <INPUT TYPE="text" NAME="Text" VALUE="Hello World"></INPUT> <INPUT TYPE="submit" VALUE="" Method="Post"></INPUT> </FORM> <BR> <BR> <% If Request.QueryString("Text") <> "" Then %> 通過get方法傳遞來的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR> <% End If %> <% If Request.Form("Text") <> "" Then %> 通過Post方法傳遞來的字符串是: "<B><%= Request.Form("Text") %></B>"<BR> <% End If %>
把上面的代碼保存為getpost.asp,然后運行,首先測試post方法,這時候,瀏覽器的url並沒有什么變化,返回的結果是:
通過Post方法傳遞來的字符串是: "Hello World"
然后測試用get方法提交,請注意,瀏覽器的url變成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果是:
通過get方法傳遞來的字符串是: "Hello World"
最后再通過post方法提交,瀏覽器的url還是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果變成:
通過get方法傳遞來的字符串是: "Hello World"
通過Post方法傳遞來的字符串是: "Hello World"
提示:通過get方法提交數據,可能會帶來安全性的問題。比如一個登陸頁面。當通過get方法提交數據時,用戶名和密碼將出現在URL上。如果:
1、登陸頁面可以被瀏覽器緩存;2、其他人可以訪問客戶的這台機器。
那么,別人即可以從瀏覽器的歷史記錄中,讀取到此客戶的賬號和密碼。所以,在某些情況下,get方法會帶來嚴重的安全性問題。建議在Form中,建議使用post方法。
Python下載網頁的幾種方法
通過get的方法:
fd = urllib2.urlopen(url_link)
data = fd.read()
使用get方式時,url類似如下格式:
index.jsp?id=100&op=bind
GET報問頭如下:
GET /sn/index.php?sn=123&n=asa HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:close
get方法還可以通過如下方式實現:
def GetHtmlSource_Get(htmurl): htmSource = "" try: urlx = httplib.urlsplit(htmurl) conn = httplib.HTTPConnection(urlx.netloc) conn.connect() #建立連接 conn.putrequest("GET", htmurl, None) #請求類型 conn.putheader("Content-Length", 0) conn.putheader("Connection", "close") conn.endheaders() res = conn.getresponse() htmSource = res.read() except Exception(), err: trackback.print_exec() conn.close() return htmSource
使用post方式時,POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,可用來傳送文件。POST報文頭如下:
POST /sn/index.php HTTP/1.1 Accept: */* Accept-Language: zh-cn host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 12 Connection:closes n=123&n=asa
無論是post還是get方式,他們所傳遞的數據都要進行url編碼。每對name/value由&符分開;每對來自表單的name/value由=符分開;如果用戶沒有輸入值給這個name,那么這個name還是出現,只是無值。;任何特殊的字符(就是那些不是簡單的七位ASCII,如漢字)將以百分符%用十六進制編碼。urllib庫提供了一個函數來實現url的編碼:
search=urllib.urlencode({'q':'python'}) #'q=python'
通過post發送請求:
import httplib,urllib; #定義需要進行發送的數據 params = urllib.urlencode({'cat_id':'6', 'news_title':'標題-Test39875', 'news_author':'Mobedu', 'news_ahome':'來源', 'tjuser':'carchanging', 'news_keyword':'|', 'news_content':'測試-Content', 'action':'newnew', 'MM_insert':'true'}); #定義一些文件頭 headers = {"Content-Type":"application/x-www-form-urlencoded", "Connection":"Keep-Alive",
"Referer":"http://192.168.1.212/newsadd.asp?action=newnew"}; #與網站構建一個連接 conn = httplib.HTTPConnection("192.168.1.212"); #開始進行數據提交 同時也可以使用get進行 conn.request(method="POST",url="/newsadd.asp?action=newnew",body=params,headers=headers); #返回處理后的數據 response = conn.getresponse(); #判斷是否提交成功 if response.status == 302: print "發布成功!"; else: print "發布失敗"; #關閉連接 conn.close();
也可以類似於get方法來實現:
def GetHtmlSource_Post(getString): htmSource = "" try: url = httplib.urlsplit("http://app.sipo.gov.cn:8080") conn = httplib.HTTPConnection(url.netloc) conn.connect() conn.putrequest("POST", "/sipo/zljs/hyjs-jieguo.jsp") #post方法 conn.putheader("Content-Length", len(getString)) conn.putheader("Content-Type", "application/x-www-form-urlencoded") conn.putheader("Connection", " Keep-Alive") conn.endheaders() conn.send(getString) #Http包的body f = conn.getresponse() if not f: raise socket.error, "timed out" htmSource = f.read() f.close() conn.close() except Exception(), err: trackback.print_exec() conn.close() return htmSource