台灣最大程式設計社群網站
線上人數
1680
 
會員總數:245248
討論主題:189106
歡迎您免費加入會員
討論區列表 >> AJAX / JSON / jQuery >> 請問ajax的post有比get多什麼功能?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問ajax的post有比get多什麼功能?
價值 : 10 QP  點閱數:10078 回應數:7

樓主

一個頭兩個大
初級專家
1530 29
1014 297
發送站內信

原本傳統表單的post有比get多了以下好處:
1,能上傳檔案
2,傳給SERVER的資料沒長度/大小限制

但看了以下這篇文章,才知道原來ajax的post沒上傳檔案的功能:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD2006070517184312A&fumcde=FUM20041006152641OLG&rplcnt=1

既然ajax post沒了上傳檔案功能,而且又要把資料轉成跟get完全一樣的query string,故在下推測ajax post也沒有了"傳給SERVER的資料沒長度/大小限制"的好處(純推測,沒實驗過,若有前輩實驗過,希望您能分享您的實驗結果)

在實際應用上,請問ajax的post有比get多什麼功能?

搜尋相關Tags的文章: [ ajax ] , [ post ] ,
本篇文章發表於2006-08-06 13:34
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

好手
捐贈 VP 給 好手 檢舉此回應
AJAX使用XHR(XmlHttpRequest)物件進行與伺服器的聯繫,事實上XHR物件是可以使用POST方法的,這點您別誤會喔~~

該篇文章中說的是不能用「POST搭配enctype="multipart/form-data"」的方式上傳檔案(是因為XHR不能設定encrype),所以XHR還是可以用POST送出資料的∼~
本篇文章回覆於2006-08-06 14:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

一個頭兩個大
檢舉此回應
謝謝,那請問用xmlhttp的post送出資料時,
post有比get多什麼功能?

在實際ajax應用上,什麼樣的情況下,您非用post來實現不可而不能用get?
(因為在下看到的網路文章,都說表單上傳檔案一定要用enctype="multipart/form-data",故還是以為xmlhttp不能上傳檔案.在xmlhttp裡,用post的目的何在?純綷為了好看,完全沒比用get多出任何功能?)
本篇文章回覆於2006-08-06 18:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

一個頭兩個大
檢舉此回應
在下想到xmphttp的post不太可能可上傳檔案的原因:
怕被惡意利用,使得visitor一訪問網站,電腦裡的個人檔案就被偷偷用query string指定後,被xmlhttp偷偷上傳.

至於傳給server的字串長度...
由於這時的post也要轉成query string,故在下懷疑會跟本來就是使用query string的get一樣,有字串長度限制.
但畢竟它是post,而且好像也沒什麼安全性問題...故還是會懷疑它可能沒字串長度限制.

希望哪位有測試了的前輩,能分享一下:
xmlhttp的post,是否跟get一樣,有query string字串長度的限制?
本篇文章回覆於2006-08-06 18:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

好手
捐贈 VP 給 好手 檢舉此回應
是的,與一般的情況一樣:GET有長度限制,POST則沒有。
本篇文章回覆於2006-08-06 21:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

一個頭兩個大
檢舉此回應
在下巳自己試出xmlhttp的post跟get的差異.

傳統表單的post,比get致少多了以下三項好處:
1,沒query string長度限制
2,可上傳檔案
3,由post產生的網頁,不會在IE暫存資料夾中出現(這是個非常重要的功能,有些須要保密的資料,您絕對不希望它被存在暫存資料夾中)

在xmlhttp中,post的以上三項好處:
1,不存在了。個人測試的結果,跟傳統表單的get一樣,query string的長度介於2000~3000時,就巳會傳輸失敗。而且在server side也只能用Request.QueryString來取值,而不能用Request.Form <-- 這大概就是post的字串長度限制,會變成跟get的一樣短的原因吧
2,不存在了。因為安全性問題,不提供
3,還保留著,故回傳的資料不會出現在暫存資料夾中 <-- 就是這個!!! 讓post在ajax中,有著死都不能被get所取代的重要地位!!!

以下是在下寫的測試網頁:

<script>
str='';
for(i=0;i<2000;i++) str+='1'; //set i<3000 will fail, due to query string too long
url="post.asp?aa="+str;
var obj=new ActiveXObject("Microsoft.XMLHTTP");
obj.open("POST",url,false);
obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
obj.send();
alert(obj.responseText+'');
</script>

<--------------post.asp------------------->
<% = Len(Request.QueryString("aa")) %>
本篇文章回覆於2006-08-07 17:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

一個頭兩個大
檢舉此回應
剛發現只要在php中用header,就能使網頁內容不會存在暫存資料夾:

<?
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
echo "abcdef";
?>

在這種情況下,ajax get和ajax without xmlhttp都能取代掉ajax post唯一的優勢
故以後可大量使用ajax without xmlhttp,效能上比正港ajax快許多.
(例如,與其用ajax回傳string後再由client javascript把它eval成javascript程式碼,還不如直接用append script而可省下eval的時間)
本篇文章回覆於2006-09-18 01:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

cool~
檢舉此回應
在下愚昧請教
您使用obj.open("POST",url,false);
但實際上在url帶參數
url="post.asp?aa="+str
與使用GET是一樣的

在下嘗試使用obj.send("aa="+"args")中帶入參數
於post.asp中可以使用request.form
得到參數request.form("aa")="args"
並嘗試在參數中帶入長度4000的字串
str='';
for(i=0;i<=4000;i++) str+='a'
後端完整接收也沒有問題

因此個人以為您指出的好處1應該還是存在的
以上愚見
請指教
謝謝

本篇文章回覆於2009-04-22 16:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.