日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Winform模拟post请求和get请求登录网站

發(fā)布時(shí)間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Winform模拟post请求和get请求登录网站 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

最近有朋友問(wèn)如何用winform模擬post請(qǐng)求,然后登錄網(wǎng)站,稍微想了一下,大致就是對(duì)http報(bào)文的相關(guān)信息的封裝,然后請(qǐng)求網(wǎng)站登錄地址的樣子。發(fā)現(xiàn)自己的博客中對(duì)這部分只是也沒(méi)總結(jié),就借著這股風(fēng),總結(jié)一下http報(bào)文的相關(guān)知識(shí)吧。

HTTP定義

超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。

?這里對(duì)http的具體內(nèi)容就不再介紹了,主要分析http報(bào)文信息。

http報(bào)文分為:請(qǐng)求報(bào)文和響應(yīng)報(bào)文。

HTTP請(qǐng)求報(bào)文

一個(gè)Http請(qǐng)求報(bào)文由請(qǐng)求行(request line)、請(qǐng)求頭部(header)、空行和請(qǐng)求數(shù)據(jù)4個(gè)部分組成,請(qǐng)求報(bào)文個(gè)格式如下:

Post請(qǐng)求

弄一個(gè)簡(jiǎn)單的登錄頁(yè)面,使用ajax發(fā)送post請(qǐng)求,在IE下瀏覽,F12分析一下它的請(qǐng)求報(bào)文:

??? Accept:瀏覽器可接受的MIME類型。
??? Accept-Charset:瀏覽器可接受的字符集。
??? Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁(yè)面。許多情形下這可以減少5到10倍的下載時(shí)間。
??? Accept-Language:瀏覽器所希望的語(yǔ)言種類,當(dāng)服務(wù)器能夠提供一種以上的語(yǔ)言版本時(shí)要用到。
??? Authorization:授權(quán)信息,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW - Authenticate頭的應(yīng)答中。
??? Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep - Alive”,或者看到請(qǐng)求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接),它就可以利用持久連接的優(yōu)點(diǎn),當(dāng)頁(yè)面包含多個(gè)元素時(shí)(例如Applet,圖片),顯著地減少下載所需要的時(shí)間。要實(shí)現(xiàn)這一點(diǎn),Servlet需要在應(yīng)答中發(fā)送一個(gè)? Content-Length頭,最簡(jiǎn)單的實(shí)現(xiàn)方法是:先把內(nèi)容寫入ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計(jì)算它的大小。
??? Content-Length:表示請(qǐng)求消息正文的長(zhǎng)度。
??? Cookie:這是最重要的請(qǐng)求頭信息之一。

??? From:請(qǐng)求發(fā)送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會(huì)用到它。
??? Host:初始URL中的主機(jī)和端口。
??? If-Modified-Since:只有當(dāng)所請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過(guò)修改才返回它,否則返回304“Not Modified”應(yīng)答。
??? Pragma:指定“no-cache”值表示服務(wù)器必須返回一個(gè)刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁(yè)面的本地拷貝。
??? Referer:包含一個(gè)URL,用戶從該URL代表的頁(yè)面出發(fā)訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面。
??? User-Agent:瀏覽器類型,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用。
??? UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請(qǐng)求頭,表示屏幕大小、顏色深度、操作系統(tǒng)和CPU類型。

請(qǐng)求正文

從這里可以發(fā)現(xiàn),請(qǐng)求正文就是我們要向服務(wù)器post提交的數(shù)據(jù)。

Get請(qǐng)求

將ajax的請(qǐng)求方式換成"GET",那么get方式請(qǐng)求報(bào)文是怎樣的呢?

從上圖可以看出post和get請(qǐng)求報(bào)文的區(qū)別,post提交的數(shù)據(jù)是在請(qǐng)求正文中,而get提交的數(shù)據(jù)是在url中。

Http響應(yīng)報(bào)文

從上圖可以看出,響應(yīng)報(bào)文和請(qǐng)求報(bào)文非常相似,包括:狀態(tài)行、消息報(bào)文、響應(yīng)正文。

在響應(yīng)報(bào)文中第一行中用狀態(tài)信息代替了請(qǐng)求信息,狀態(tài)行(status)通過(guò)提供一個(gè)狀態(tài)嗎來(lái)說(shuō)明所請(qǐng)求的資源情況。

狀態(tài)行的格式為:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)碼;Reason-Phrase表示狀態(tài)碼的文本描述。狀態(tài)碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有5種可能取值:

    • 1xx:指示信息——表示請(qǐng)求已接收,繼續(xù)處理。

    • 2xx:成功——表示請(qǐng)求已被成功接收、理解、接受。比如200

    • 3xx:重定向——要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。

    • 4xx:客戶端錯(cuò)誤——請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。

    • 5xx:服務(wù)端錯(cuò)誤——服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。

常見(jiàn)的狀態(tài)碼:

    • 200 OK:客戶端請(qǐng)求成功。

    • 400 Bad Request:客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解。

    • 401 Unauthorized:請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用。

    • 403 Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)。

    • 404 Not Found:請(qǐng)求資源不存在。

    • 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。

    • 503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能回復(fù)正常。

?GET和Post的區(qū)別

GET方式,請(qǐng)求的數(shù)據(jù)會(huì)在URL之后(就是將數(shù)據(jù)放置在http請(qǐng)求<request-line>中),以問(wèn)號(hào)分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)使用&連接,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文或其他字符,則直接將字符串用Base64加密,在url中最常見(jiàn)的:%E4%BD%A0%E5%A5%BD,這種東東%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII。

Post方式,把提交的數(shù)據(jù)防止在http的包體<request-body>中。上文請(qǐng)求正文中的數(shù)據(jù)就是實(shí)際傳輸?shù)臄?shù)據(jù)。

因此,get提交的數(shù)據(jù)會(huì)在地址欄中顯示出來(lái),而post不會(huì)。

GET:不同瀏覽器和服務(wù)器對(duì)URL長(zhǎng)度有限制。例如IE對(duì)url的限制是2083字節(jié)。其他瀏覽器如Netscape、FireFox等,理論上沒(méi)有長(zhǎng)度限制,其限制取決于操作系統(tǒng)的支持。

?因此對(duì)于get提交時(shí),傳輸數(shù)據(jù)就會(huì)收到url長(zhǎng)度限制。

POST:由于不是通過(guò)url傳值,理論上是不受限的。但實(shí)際各個(gè)web服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制。Apache、iis6都有各自的配置。

(以上參考文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html)

get方式和post方式比較在安全性上較低,所以比較隱私性的東東一般采用post方式提交。誰(shuí)也不愿意將自己用戶名和密碼在url中顯示出來(lái)吧?

?winform登錄模擬post方式登錄

上面參考網(wǎng)絡(luò)資源對(duì)http請(qǐng)求與響應(yīng)報(bào)文又學(xué)習(xí)了一下,現(xiàn)在模擬post方式登錄。get方式大致相似,不再贅述。

post類

1 using System;2 using System.Collections.Generic;3 using System.IO;4 using System.IO.Compression;5 using System.Linq;6 using System.Net;7 using System.Text;8 using System.Threading.Tasks;9 10 namespace Wolfy.LoginTest 11 { 12 public class Post 13 { 14 /// <summary> 15 /// 獲得post請(qǐng)求后響應(yīng)的數(shù)據(jù) 16 /// </summary> 17 /// <param name="postUrl">請(qǐng)求地址</param> 18 /// <param name="referUrl">請(qǐng)求引用地址</param> 19 /// <param name="data">請(qǐng)求帶的數(shù)據(jù)</param> 20 /// <returns>響應(yīng)內(nèi)容</returns> 21 public string PostLogin(string postUrl, string referUrl, string data) 22 { 23 string result = ""; 24 try 25 { 26 //命名空間System.Net下的HttpWebRequest類 27 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); 28 //參照瀏覽器的請(qǐng)求報(bào)文 封裝需要的參數(shù) 這里參照ie9 29 //瀏覽器可接受的MIME類型 30 request.Accept = "text/plain, */*; q=0.01"; 31 //包含一個(gè)URL,用戶從該URL代表的頁(yè)面出發(fā)訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面 32 request.Referer = referUrl; 33 //瀏覽器類型,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用 34 request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)"; 35 request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 36 //請(qǐng)求方式 37 request.Method = "POST"; 38 //是否保持常連接 39 request.KeepAlive = false; 40 request.Headers.Add("Accept-Encoding", "gzip, deflate"); 41 //表示請(qǐng)求消息正文的長(zhǎng)度 42 request.ContentLength = data.Length; 43 44 Stream postStream = request.GetRequestStream(); 45 byte[] postData = Encoding.UTF8.GetBytes(data); 46 //將傳輸?shù)臄?shù)據(jù),請(qǐng)求正文寫入請(qǐng)求流 47 postStream.Write(postData, 0, postData.Length); 48 postStream.Dispose(); 49 //響應(yīng) 50 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 51 //判斷響應(yīng)的信息是否為壓縮信息 若為壓縮信息解壓后返回 52 if (response.ContentEncoding == "gzip") 53 { 54 MemoryStream ms = new MemoryStream(); 55 GZipStream zip = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress); 56 byte[] buffer = new byte[1024]; 57 int l = zip.Read(buffer, 0, buffer.Length); 58 while (l > 0) 59 { 60 ms.Write(buffer, 0, l); 61 l = zip.Read(buffer, 0, buffer.Length); 62 } 63 ms.Dispose(); 64 zip.Dispose(); 65 result = Encoding.UTF8.GetString(ms.ToArray()); 66 } 67 return result; 68 } 69 catch (Exception) 70 { 71 72 throw; 73 } 74 } 75 } 76 }

?請(qǐng)求中相關(guān)屬性的值,你可以在瀏覽器,F12中,將對(duì)應(yīng)的值,復(fù)制粘貼就可以,這東西不需要記。這里沒(méi)有考慮cookie的,驗(yàn)證碼的情況。

測(cè)試結(jié)果:根據(jù)返回值是1(成功),2(失敗)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Winform模拟post请求和get请求登录网站的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。