Get方法
public string HttpGet(string Url, string param) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (param == "" ? "" : "?") + param); request.Method = "GET"; request.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; }
//使用示例 HttpGet("http://192.168.2.100/xxx", "SchoolID=S27-511-AF57&UserID=S001")
Post方法
Post請求是通過請求頭(headers)的 Content-Type 字段值來描述其消息主體的編碼方式,在日常開發中以下3種編碼方式比較常見的:
- application/x-www-form-urlencoded
- application/json;charset=UTF-8
- multipart/form-data
其他詳細的 Content-Type 講解可以參考這篇文章 四種常見的 POST 提交數據方式 專題
所以,使用 HttpWebRequest 發送請求POST的 “姿勢”(數據格式),會因為消息主體的編碼方式的不同而有所差異。
1、application/x-www-form-urlencoded
public string HttpPost(string url, string param) { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Encoding encoding = Encoding.UTF8; byte[] byteArray = Encoding.UTF8.GetBytes(param); string responseData = String.Empty; req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = byteArray.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(byteArray, 0, byteArray.Length); } using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { responseData = reader.ReadToEnd(); } return responseData; } }
//使用示例 HttpPost("http://192.168.2.100/xxx", "SchoolID=S27-511-AF57&UserID=S001")
2、application/json;charset=UTF-8
public string HttpPost(string url, Dictionary<string, object> param) { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Encoding encoding = Encoding.UTF8; byte[] byteArray = Encoding.UTF8.GetBytes(new JavaScriptSerializer().Serialize(param)); string responseData = String.Empty; req.Method = "POST"; req.ContentType = "application/json;charset=UTF-8"; req.ContentLength = byteArray.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(byteArray, 0, byteArray.Length); } using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { responseData = reader.ReadToEnd(); } return responseData; } }
//使用示例
Dictionary<string, object> param = new Dictionary<string, object>();
param.Add("SchoolID", "S27-511-AF57");
param.Add("UserID", "S001");
HttpPost("http://192.168.2.100/xxx", param);
3、multipart/form-data ,一般用來上傳文件
public string HttpPost(string url, string file) { //邊界 string boundary = DateTime.Now.Ticks.ToString("x"); HttpWebRequest uploadRequest = (HttpWebRequest)WebRequest.Create(url);//url為上傳的地址 uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary; uploadRequest.Method = "POST"; uploadRequest.Accept = "*/*"; uploadRequest.KeepAlive = true; uploadRequest.Headers.Add("Accept-Language", "zh-cn"); uploadRequest.Headers.Add("Accept-Encoding", "gzip, deflate"); uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials; //uploadRequest.Headers["Cookie"] = cookies;//上傳文件時需要的cookies WebResponse response; string responseData = String.Empty; //創建一個內存流 Stream memStream = new MemoryStream(); //確定上傳的文件路徑 if (!String.IsNullOrEmpty(file)) { boundary = "--" + boundary; //添加上傳文件參數格式邊界 string paramFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}\r\n"; NameValueCollection param = new NameValueCollection(); param.Add("fname", Guid.NewGuid().ToString() + Path.GetExtension(file)); //寫上參數 foreach (string key in param.Keys) { string formitem = string.Format(paramFormat, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); memStream.Write(formitembytes, 0, formitembytes.Length); } //添加上傳文件數據格式邊界 string dataFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n"; string header = string.Format(dataFormat, "Filedata", Path.GetFileName(file)); byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); memStream.Write(headerbytes, 0, headerbytes.Length); //獲取文件內容 FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[1024]; int bytesRead = 0; //將文件內容寫進內存流 while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { memStream.Write(buffer, 0, bytesRead); } fileStream.Close(); //添加文件結束邊界 byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("\r\n\n" + boundary + "\r\nContent-Disposition: form-data; name=\"Upload\"\r\n\nSubmit Query\r\n" + boundary + "--"); memStream.Write(boundarybytes, 0, boundarybytes.Length); //設置請求長度 uploadRequest.ContentLength = memStream.Length; //獲取請求寫入流 Stream requestStream = uploadRequest.GetRequestStream(); //將內存流數據讀取位置歸零 memStream.Position = 0; byte[] tempBuffer = new byte[memStream.Length]; memStream.Read(tempBuffer, 0, tempBuffer.Length); memStream.Close(); //將內存流中的buffer寫入到請求寫入流 requestStream.Write(tempBuffer, 0, tempBuffer.Length); requestStream.Close(); } //獲取到上傳請求的響應 response = uploadRequest.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { responseData = reader.ReadToEnd(); } return responseData; }
此方法出處
作者:Louja
原址:https://www.cnblogs.com/loujady/archive/2011/09/13/2174695.html