.NET HttpWebRequest發送請求的幾個方法


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

 


免責聲明!

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



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