在用C#調用介面的時候,遇到需要通過調用登錄介面才能調用其他的介面,因為在其他的介面需要在登錄的狀態下保存Cookie值才能有許可權調用, 所以首先需要通過調用登錄介面來保存cookie值,再進行其他介面的調用 1.通過Get方式 但是並不是所有的get請求都需要添加這個heard的內容,有些加了這個 ...
在用C#調用介面的時候,遇到需要通過調用登錄介面才能調用其他的介面,因為在其他的介面需要在登錄的狀態下保存Cookie值才能有許可權調用,
所以首先需要通過調用登錄介面來保存cookie值,再進行其他介面的調用
1.通過Get方式
#region get方式 public string HttpGet(string url) { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; request.Headers["Accept-Encoding"] = "gzip,deflase"; request.AutomaticDecompression = DecompressionMethods.GZip; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // HttpCookie cookies = new HttpCookie("admin"); //如果有需要通過登錄實現保存cookie值的話可以加一部分 // cookies.Value = Convert.ToString(response.Headers["Set-Cookie"]); // 通過響應請求讀取帶cookie的http數據 // cookies.Expires = DateTime.Now.AddDays(1); // HttpContext.Current.Response.Cookies.Add(cookies); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } #endregion
但是並不是所有的get請求都需要添加這個heard的內容,有些加了這個可能出現亂碼的情況,所以不要設置Accept-Encoding的Header
此處之所以加此header,是因為看到網頁分析工具中所得到的瀏覽器瀏覽該網頁,對應的http的header的內容中,就是這樣設置的。
所以,代碼中,也是模擬瀏覽器去訪問網頁,就設置了對應的Accept-Encoding為gzip,deflate了
普通瀏覽器訪問網頁,之所以添加:"Accept-Encoding" = "gzip,deflate"
那是因為,瀏覽器對於從伺服器中返回的對應的gzip壓縮的網頁,會自動解壓縮,所以,其request的時候,添加對應的頭,表明自己接受壓縮後的數據。
同時添加了 request.AutomaticDecompression = DecompressionMethods.GZip;這一句,便可以獲得正確的數據。
如果你獲取網頁內容太大的話,那麼還是可以用這個辦法的,這樣就可以讓HttpWebRequest自動幫你實現對應的解壓縮了,可以減少數據數據傳輸量,節省時間,提高效率。
2.通過post方式
public string HttpPost2(string url, string body) { //把用戶傳過來的數據轉成“UTF-8”的位元組流 Encoding encoding = Encoding.UTF8; //先根據用戶請求的uri構造請求地址 //創建Web訪問對象 HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.Method = "POST"; // request.Accept = "application/json"; request.ContentType = "application/json; charset=UTF-8"; request.Headers["Accept-Encoding"] = "gzip, deflate"; request.AutomaticDecompression = DecompressionMethods.GZip; //HttpCookie Cookie = System.Web.HttpContext.Current.Request.Cookies["admin"]; //若是需要登錄過後再能訪問獲取url的數據,需要在請求頭中設置cookie值 //if (Cookie != null) // request.Headers.Add("Cookie", Cookie.Value.ToString()); byte[] buffer = encoding.GetBytes(body); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); //通過Web訪問對象獲取響應內容 HttpWebResponse response = (HttpWebResponse) request.GetResponse(); //通過響應內容流創建StreamReader對象,因為StreamReader更高級更快 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd();//利用StreamReader就可以從響應內容從頭讀到尾 } }
3.通過put請求
#region Put請求 public string Put(string data, string uri) {//創建Web訪問對象 HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(uri); //把用戶傳過來的數據轉成“UTF-8”的位元組流 byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data); Request.Method = "PUT"; Request.ContentLength = buf.Length; Request.ContentType = "application/json"; Request.MaximumAutomaticRedirections = 1; Request.AllowAutoRedirect = true; //發送請求 Stream stream = Request.GetRequestStream(); stream.Write(buf, 0, buf.Length); stream.Close(); //獲取介面返回值 //通過Web訪問對象獲取響應內容 HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); //通過響應內容流創建StreamReader對象,因為StreamReader更高級更快 StreamReader reader = new StreamReader(Response.GetResponseStream(), Encoding.UTF8); //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有編碼問題就用這個方法 string returnXml = reader.ReadToEnd();//利用StreamReader就可以從響應內容從頭讀到尾 reader.Close(); Response.Close(); return returnXml; } #endregion
4.通過Delete請求
#region Delete請求 public string Delete(string data, string uri) { //創建Web訪問對象 HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(uri); //把用戶傳過來的數據轉成“UTF-8”的位元組流 byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data); Request.Method = "DELETE"; Request.ContentLength = buf.Length; Request.ContentType = "application/json"; Request.MaximumAutomaticRedirections = 1; Request.AllowAutoRedirect = true; //發送請求 Stream stream = Request.GetRequestStream(); stream.Write(buf, 0, buf.Length); stream.Close(); //獲取介面返回值 //通過Web訪問對象獲取響應內容 HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); //通過響應內容流創建StreamReader對象,因為StreamReader更高級更快 StreamReader reader = new StreamReader(Response.GetResponseStream(), Encoding.UTF8); //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有編碼問題就用這個方法 string returnXml = reader.ReadToEnd();//利用StreamReader就可以從響應內容從頭讀到尾 reader.Close(); Response.Close(); return returnXml; } #endregion
不同的場景需求,使用不同的方式,應用在不同的場景 。
通過這幾種組合方式 ,可以調用http介面,完成調用和測試。