C#后台post發送http請求


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服務器交互:

 

HttpWebresponse類用於生成發送的Http請求和接收Http響應。

但是不要直接創建HttpWebResponse類的實例。而應當使用通過調用 HttpWebRequest.GetResponse 所返回的實例。您必須調用 Stream.Close 方法或 HttpWebResponse.Close 方法來關閉響應並將連接釋放出來供重用。

HttpWebRequest類主要包括如下方法與HTTP服務器交互:(與HttpWebRequest類相比,方法較少)

 

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();
}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM