http協議是在日常開發中使用非常頻繁的一種超文本傳輸協議,http請求有post和get兩種常用方式,
get 方法是在向特定的資源發出請求,
post 向指定的資源提交數據進行處理請求(例如提交表單數據或者上傳文件),數據會被包裹在消息請求體中,post請求可能hi導致請的資源的建立或已有資源的修改。
- ET是從服務器上獲取數據,POST是向服務器傳送數據。
- GET是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。POST是通過HTTP POST機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
- 對於GET方式,服務器端用Request.QueryString獲取變量的值,對於POST方式,服務器端用Request.Form獲取提交的數據。
- GET傳送的數據量較小,不能大於2KB(這主要是因為受URL長度限制)。POST傳送的數據量較大,一般被默認為不受限制。但理論上,限制取決於服務器的處理能力。
- GET安全性較低,POST安全性較高。因為GET在傳輸過程,數據被放在請求的URL中,而如今現有的很多服務器、代理服務器或者用戶代理都會將請求URL記錄到日志文件中,然后放在某個地方,這樣就可能會有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數據,一些系統內部消息將會一同顯示在用戶面前。POST的所有操作對用戶來說都是不可見的。
在FORM提交的時候,如果不指定Method,則默認為GET請求(.net默認是POST),Form中提交的數據將會附加在url之后,以?分開與url分開。字母數字字符原樣發送,但空格轉換為“+”號,其它符號轉換為%XX,其中XX為該符號以16進制表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;GET方式提交的數據最多只能有2048字節,而POST則沒有此限制。
要想實現http請求需要使用到兩個類HttpWebRequest和HttpWebResponse,在C#中就是用這兩個類實現客戶端向服務器端發送HTTP消息、客戶端接受服務器端的HTTP響應。
HttpWebRequest這個類 提供了http需要的屬性和方法,
HttpWebRequest類主要包括如下方法,用於與HTTP服務器交互:
- Abort: 取消對 Internet 資源的請求。
- AddRange: 向請求添加范圍標頭。
- BeginGetRequestStream:開始對用來寫入數據的 Stream 對象的異步請求。
- BeginGetResponse:開始對Internet 資源的異步請求。
- Create:初始化新的 WebRequest。(從WebRequest 繼承。)
- CreateDefault:為指定的 URI 方案初始化新的 WebRequest 實例。(從WebRequest 繼承。)
- CreateObjRef:創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (從MarshalByRefObject 繼承。)
- EndGetRequestStream:結束對用於寫入數據的 Stream 對象的異步請求。
- EndGetResponse:結束對 Internet 資源的異步請求。
- GetRequestStream:獲取用於寫入請求數據的 Stream 對象。
- GetResponse:返回來自 Internet 資源的響應。
- GetSystemWebProxy:返回當前模擬用戶的 Internet Explorer 設置中配置的代理。(從 WebRequest 繼承。)
- InitializeLifetimeService:獲取控制此實例的生存期策略的生存期服務對象。 (從 MarshalByRefObject 繼承。)
- RegisterPrefix:為指定的URI 注冊WebRequest 子代。(從WebRequest 繼承。)
HttpWebresponse類用於生成發送的Http請求和接收Http響應。
但是不要直接創建HttpWebResponse類的實例。而應當使用通過調用 HttpWebRequest.GetResponse 所返回的實例。您必須調用 Stream.Close 方法或 HttpWebResponse.Close 方法來關閉響應並將連接釋放出來供重用。
HttpWebRequest類主要包括如下方法與HTTP服務器交互:(與HttpWebRequest類相比,方法較少)
- CreateObjRef:創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。(從MarshalByRefObject 繼承。)
- GetLifetimeService:檢索控制此實例的生存期策略的當前生存期服務對象。(從MarshalByRefObject 繼承。)
- GetResponseHeader:獲取與響應一起返回的標頭的內容。
- GetResponseStream:獲取流,該流用於讀取來自服務器的響應的體。
- InitializeLifetimeService:獲取控制此實例的生存期策略的生存期服務對象。(從 MarshalByRefObject 繼承。)
post請求需要使用form表單的形式提交
/// <summary>
/// 設置密碼
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void regist_Click(object sender, RoutedEventArgs e)
{
//對數據sys_pass進行加密
MD5 md5 = MD5.Create();
//需要將字符串轉成字節數組
byte[] buffer = Encoding.Default.GetBytes(sys_pass);
//加密后是一個字節類型的數組,這里要注意編碼UTF8/Unicode等的選擇
byte[] md5buffer = md5.ComputeHash(buffer);
string password = null;
// 通過使用循環,將字節類型的數組轉換為字符串,此字符串是常規字符格式化所得
foreach (byte b in md5buffer)
{
//得到的字符串使用十六進制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符
//但是在和對方測試過程中,發現我這邊的MD5加密編碼,經常出現少一位或幾位的問題;
//后來分析發現是 字符串格式符的問題, X 表示大寫, x 表示小寫,
//X2和x2表示不省略首位為0的十六進制數字;
password += b.ToString("x2");
}
//簡單的表單就是直接將數據拼接起來
string postData = string.Format("phonecode={0}&userphone={1}&type={2}&password={3}",
"", sys_name, 3, password);
string URL = "http://lapi.boyidev.top/loginin";
Post(URL, postData, 3);
}
/// <summary>
/// 指定Post地址使用Get 方式獲取全部字符串
/// </summary>
/// <param name="url">請求后台地址</param>
/// <param name="content">Post提交數據內容(utf-8編碼的)</param>
/// <returns></returns>
public void Post(string url, string content, int type)
{
string result = "";
//初始創建一個請求實例
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
//指定是post提交方式
req.Method = "POST";
//這里bai的application/x-www-form-urlencoded:是一種編碼du格式,窗體數據被編碼為名zhi稱/值對,是標准的編碼格式。
//當action為get時候,dao瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2...),然后把這個字串append到url后面,用?分割,加載這個新的url。 當action為post時候,瀏覽器把form數據封裝到http body中,然后發送到server。
req.ContentType = "application/x-www-form-urlencoded";
#region 添加Post 參數
byte[] data = Encoding.UTF8.GetBytes(content);
req.ContentLength = data.Length;
//通過流的方式將數據寫入
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
#endregion
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//獲取響應內容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
}