C#客戶端傳送http請求與伺服器通訊
阿新 • • 發佈:2019-01-31
本文介紹瞭如何使用C#,通過HttpWebRequest方法,向服務端傳送get,post,put和delete請求
環境介紹
- 軟體 vs2013
- 程式語言c# winform
- 服務端採用java+spring,restful風格
在客戶端,通過HttpWebRequest方法,向服務端傳送get,post,put和delete請求,但是由於服務端的接收引數不同,以及在具體請求下有稍微的不同,故分為以下幾種情況(本文所有程式碼均為底層介面的形式給出,可以直接被上層具體方法呼叫)
GET請求,服務端接收引數方式為@RequestParam
get請求接收引數的方式通常均為@RequestParam,此時,請求引數實際上是以 “url?param1=xx¶m2=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;
}