分享

掌控POST(2)

 ipilipala 2016-06-14
 本帖最後由 michael3636 於 2015-4-27 19:52 編輯

PART 2



我在PART 1 裡面提到過,無論是客戶端請求還是服務器反饋,內容都分2個部分:

  • 客戶端跟服務器之間的交流內:我們一般把這個稱為 頭部(Header)
  • 我們請求的和返回的實際內容.我們一般把這部分稱為 主體或者內容(Content)

開發工具準備:XHR不是我們想怎麼寫就怎麼寫的,要使用它的所有功能,我們離不開輔助工具

  • 火狐+firebug插件 或者 chrome (個人推薦火狐,因為我習慣火狐..哈哈哈)
  • 返回來的源文件我們可以黏貼到記事本看,,但是記事本看起來很麻煩,建議裝個Notepad++,這個文本處理器可以把html文件顯示得花花綠綠.方便我們查看
  • Fiddler 這個不是必須得,如果你不習慣用瀏覽器查看數據,你可以裝它.超級牛掰的一個http協議抓包工具,它不是必須的

以下為本帖隱藏內容

==============================

好了,鋪墊基本鋪好了..終於可以進入主題了

創建XHR對象

XHR有2種使用方式,對象或者API,API是沒辦法了,畢竟我們玩的是按鍵精靈不是C,所以我們講對象方式使用XHR.在window裡,我們可以創建很多種形式的XHR對象,羅列如下:

//http是變量名,大家隨意
Set http = CreateObject("Microsoft.XMLDOM") //太老了,應該廢棄使用,win95-現在
Set http = CreateObject("Msxml2.XMLHTTP.6.0") //兼容XP-現在
Set http = CreateObject("Msxml2.XMLHTTP") //相當於.3.0版本,如果出現.6.0版本無法創建的情況用這個(出現在沒打升級補丁包的XP)
Set http = CreateObject("msxml2.Serverxmlhttp.6.0") //功能上來說比上上面的強
Set http = CreateObject("msxml2.Serverxmlhttp") //相當於.3.0版本,如果出現.6.0版本無法創建的情況用這個(出現在沒打升級補丁包的XP)
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//最牛組建,強烈推薦,使用上幾乎功能限制(xp-現在)
//補充一點:其實看名字就知道了"WinHttp.WinHttpRequest.5.1"跟上面幾個不是一夥的,事實也是,但是我不打算就此進行展開說明.
//從功能上來說,它們是差不多的,強弱之分而已,所以我主觀的把它們歸為一類,畢竟我的目的是讓大家入個門而已

不用最合適的,只用最牛的,這個估計是大多數人的風格,不幸的是,俺也是,所以,我們著重講"WinHttp.WinHttpRequest.5.1",間或的可能會提到"Msxml2.XMLHTTP.6.0",因為它有前者沒有的一個特點(注意我的用詞:是特點而不是優點)

畫外音

很多人可能對對象這個概念不熟,我稍微補充一下,對象實例的賦值,必須加關鍵字"SET",當我們用完這個對象,想廢棄了.只需要一句代碼

Set 對象變量名=Nothing

==============================
讓我們開始上路吧,用實例說話
  1. URL="http://bbs./forum.php?mod=forumdisplay&fid=17" //按鍵論壇綜合版塊的地址
  2. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//創建XHR對象,這個對象剛誕生,沒有cookie,沒有緩存一乾二淨!!!
  3. http.open "GET", url,false//調用open方法(每次請求必須先open)用"GET"方式提交請求,提交請求的網址,異步工作模式:關
  4. http.send //這行才是發送請求,如果上面第三個參數是false,代碼到這行就暫停了,直到服務器返回網頁代碼或者超時(請求失敗),代碼才會繼續往下執行
  5. If Not isEmpty(http.responsetext) Then //如果返回的文本文本格式內容存在
  6. Plugin.Sys.SetCLB http.responsetext//把請求到的源代碼放到剪貼板,可以讓我們黏貼到文本裡檢查得到點什麼東西,為啥不用messagebox顯示,東西太多顯示不完嘛
  7. Else
  8. MessageBox "失敗"
  9. End If
  10. //此時:對象完成了一次請求,如果成功的話,對象有了按鍵論壇給它的cookie和緩存,全在對象裡,換而言之全在內存裡,它不會像瀏覽器一樣根據服務器指示把cookie或者扔硬盤或者扔內存,多乾淨啊...
複製代碼
以下為本帖隱藏內容

==============================

問題解析:

為啥我的在瀏覽器看到的綜合版塊的網址是:"http://bbs./forum-17-1.html"跟你的不一樣啊

因為你沒登陸賬號,我登陸了,所以看到的不一樣,其實沒啥區別,按鍵論壇服務器啟用了URL rewrite功能而其,本質是把查詢網址的鏈接變成上看去像個靜態的鏈接地址,至於為啥要這樣,原因很簡單,百度谷歌什麼的搜索引擎,它們不喜歡帶著"?"字符的網址,靜態網址可以讓我們在百度搜索的時候搜到安檢論壇,而且排名靠前

為啥open方法第一個參數是"GET",啥意思

這個XHR的請求方式,http協議有很多請求方式,我列出我們最常用的幾種

GET:瀏覽器地址欄你出入網址回車就是"GET"方式提交的,一般用於最常規的應用,get的網址我們可以放到收藏夾.GET是可以帶請求內容的,但是長度是有限制的,網址是不能無現長的
POST這裡才會有post,僅僅是種http的請求方式而已,好好的XHR就被叫成POST了,至於麼?必須正名)一般用於我們向服務器提交數據,優點是遞交的數據我們是看不到的,也就是說,get方式遞交的數據在瀏覽器網址欄裡能看到,post是看不到的,比較安全,最大的好處是,post遞交數據是沒有長度限制的,你可以post 5M的文章,get肯定是不行的,,因為文本太長了,所以賬號密碼登陸此類的操作我們都是用post的.
"HEAD":不常用,但是基本所有服務器都支持,意思是,我只要你返回頭部,不需要返回內容,一般在實際使用用,這種方式用來驗證代理服務器是否可用,我能看到你返回的頭部說明內容我也能看到.說明代理能用,為啥不用GET或者post驗證呢?head返回數據少速度快啊啊,..我只要證明通不通就行了嘛,還有個用處就是我們能得到服務器時間,適合做網絡時間驗證.詳見PART 1

http.responsetext是什麼東東?

這個是XHR對象的一個屬性,當我們請求完成後,服務器返回給我們了數據,需要什麼格式的,例子代碼是我們需要網頁文本所以用XHR對象.responsetext,如果我們請求的是個圖片呢?或則是mp3什麼的,,,非文本我們得用XHR對象.responsebody得到數據.當然還有其他得,但是在按鍵,我們只要知曉這2種就行了


補充知識:關於網址
有些URL帶有"?",比如我們代碼裡的http://bbs./forum.php?mod=forumdisplay&fid=17,其實嚴格說它是網址是錯誤的,"?"前面的才是網址,後面的是請求的參數,只不過大家都這麼叫.叫習慣了而已
在很多情況下(注意是很多不是絕對):"GET"方式的"http://bbs./forum.php?mod=forumdisplay&fid=17",相當於,POST帶著"mod=forumdisplay&fid=17"內容向"http://bbs./forum.php"提交數據,也就是說,在很多情況下.GET和POST是可以互換著來玩的,注意是很多!!不是絕對,不是所有!!!

==============================

那要是沒"?"呢?這不是多問麼,那不就是POST帶著""(空內容)去網址提交數據麼.....
多說無益,讓俺們用事實來證明吧:把上面的代碼改一下下,改成POST

  1. URL = "http://bbs./forum.php" //改成post提交數據的地址("?"前面的哪些)
  2. str ="mod=forumdisplay&fid=17" //把提交的數據放在變量("?"後面的哪些)
  3. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//創建XHR對象
  4. http.open "POST", url, false//改成POST方式提交
  5. http.setrequestheader "Content-Type", "application/x-www-form-urlencoded" //在header裡設置提交提交的數據類型(post方式必須的)
  6. http.setrequestheader "Content-Length",len(str) //在header設置提交的數據的長度,其實就是字符串長度嘛(post方式必須的)
  7. http.send str //開始發送,提交的內容在這呢,..看到米...
  8. If Not isEmpty(http.responsetext) Then
  9. Plugin.Sys.SetCLB http.responsetext
  10. Else MessageBox "失敗"
  11. End If
複製代碼
事實證明,2者的結果是一樣的.我們都得到了按鍵綜合版塊的源代碼,只不過嘛..POST寫起來要比GET多打很多字啊,所以為了少打字,能GET的還是GET吧,不能GET的才去考慮POST 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多