1. 程式人生 > >C#客戶端傳送http請求與伺服器通訊

C#客戶端傳送http請求與伺服器通訊

本文介紹瞭如何使用C#,通過HttpWebRequest方法,向服務端傳送get,post,put和delete請求

環境介紹

  • 軟體 vs2013
  • 程式語言c# winform
  • 服務端採用java+spring,restful風格

在客戶端,通過HttpWebRequest方法,向服務端傳送get,post,put和delete請求,但是由於服務端的接收引數不同,以及在具體請求下有稍微的不同,故分為以下幾種情況(本文所有程式碼均為底層介面的形式給出,可以直接被上層具體方法呼叫)

GET請求,服務端接收引數方式為@RequestParam

get請求接收引數的方式通常均為@RequestParam,此時,請求引數實際上是以 “url?param1=xx&param2=xx”的形式傳遞的,所以程式碼如下

        //url為請求的網址,param引數為需要查詢的條件(服務端接收的引數,沒有則為null)
        //返回該次請求的響應
        public string GET(string url,Dictionary<String,String> param)
        {
            if(param!=null) //有引數的情況下,拼接url
            {
                url = url + "?";
                foreach (var item in param)
                {
                    url = url + item.Key + "="
+ item.Value+"&"; } url = url.Substring(0, url.Length - 1); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;//建立請求 request.Method = "GET"; //請求方法為GET HttpWebResponse res; //定義返回的response try
{ res = (HttpWebResponse)request.GetResponse(); //此處傳送了請求並獲得響應 } catch (WebException ex) { res = (HttpWebResponse)ex.Response; } StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8); string content = sr.ReadToEnd(); //響應轉化為String字串 return content; }

POST(PUT)請求,服務端接收引數方式為@RequestParam

當在post或者put請求以@RequestParam接收引數時,實際提交引數的形式是類似於表單提交,這種情況下,每一個提交的引數前都需要新增boundary,用於將不同的引數分開,具體的提交方式可以參考我的另一篇文章:C#上傳檔案到服務端

POST(PUT)請求,服務端接收引數方式為@RequestBody

對於post請求,除非上傳檔案的特殊情況,否則我們推薦服務端以requestbody形式接收引數,因為在需要接受的引數較多時,程式碼可以更加簡潔,並且不再需要後期增加接收的引數,body即包含了一個物件所有的屬性。

言歸正傳,這種情況的處理是最理想的,只需要將需要提交的引數以json的方式提交即可,程式碼如下:

        //url為請求的網址,param為需要傳遞的引數
        //返回服務端的額響應
        public string POST(string url, Dictionary<String, String> param)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //建立請求
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            //request.AllowReadStreamBuffering = true;
            request.MaximumResponseHeadersLength = 1024;
            request.Method = "POST"; //請求方式為post
            request.AllowAutoRedirect = true;
            request.MaximumResponseHeadersLength = 1024;
            request.ContentType = "application/json";
            JObject json = new JObject();
            if(param.Count!=0) //將引數新增到json物件中
            {
                foreach(var item in param)
                {
                    json.Add(item.Key, item.Value);
                }
            }
            string jsonstring = json.ToString();//獲得引數的json字串
            byte[] jsonbyte = Encoding.UTF8.GetBytes(jsonstring);
            Stream postStream = request.GetRequestStream();
            postStream.Write(jsonbyte, 0, jsonbyte.Length);
            postStream.Close();
            //傳送請求並獲取相應迴應資料       
            HttpWebResponse res;
            try
            {
                res = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;
            }
            StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
            string content = sr.ReadToEnd(); //獲得響應字串
            return content;
        }

這裡寫圖片描述