C# 请求http网络资源

文章详细介绍了如何在C#中使用HttpGet和HttpPost方法进行网络请求,包括GET请求的特殊情况、POST请求的参数处理、multipart/form-data格式以及如何处理JSON数据。还提到了如何处理SSL验证和下载网络资源文件。
摘要由CSDN通过智能技术生成

http GET() 、POST() 方法

public class HttpHelp
{
   /// <summary>
   /// GET请求与获取结果
   /// </summary>
   public static string HttpGet(string url)
   {
    //跳过SSL验证
    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    request.ContentType = "text/html;charset=UTF-8";

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream myResponseStream = response.GetResponseStream();
    StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
    string retString = myStreamReader.ReadToEnd();
    myStreamReader.Close();
    myResponseStream.Close();

    return retString;
   }


    /// <summary>
    /// POST请求与获取结果
    /// </summary>
    public static string HttpPost(string Url, string postDataStr)
    {
        //跳过SSL验证
        ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
        Encoding encoding = Encoding.GetEncoding("UTF-8");
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
        request.Method = "post";
        request.ContentType = "application/json";
        //request.Timeout = 0;
        //request.KeepAlive = true;
        byte[] buffer = encoding.GetBytes(postDataStr);
        request.ContentLength = buffer.Length;
        request.GetRequestStream().Write(buffer, 0, buffer.Length);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
        string result = reader.ReadToEnd();
        return result;
    }
    
       /// <summary>
       /// 提交Form表单
       /// </summary>
       /// <param name="kVDatas">表单数据(Key,Value)</param>
      public static string HttpPostMultipartFormData(string url, NameValueCollection kVDatas, string method = WebRequestMethods.Http.Post, string encoding = "UTF-8", int timeOut = -1)
      {
          string resultStr = "";
          try
          {
             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
             byte[] boundarybytes = Encoding.GetEncoding(encoding).GetBytes("\r\n--" + boundary + "\r\n");
             byte[] endbytes = Encoding.GetEncoding(encoding).GetBytes("\r\n--" + boundary + "--\r\n");

             //1.HttpWebRequest
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
             request.ContentType = "multipart/form-data; boundary=" + boundary;
             request.Method = method;
             request.KeepAlive = true;
             request.Timeout = timeOut;

             using (Stream stream = request.GetRequestStream())
             {
              //1.1 key/value
              string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
              if (kVDatas != null)
              {
                foreach (string key in kVDatas.Keys)
                {
                    stream.Write(boundarybytes, 0, boundarybytes.Length);
                    string formitem = string.Format(formdataTemplate, key, kVDatas[key]);
                    byte[] formitembytes = Encoding.GetEncoding(encoding).GetBytes(formitem);
                    stream.Write(formitembytes, 0, formitembytes.Length);
                }
              }
              stream.Write(endbytes, 0, endbytes.Length);
            }
           //2.WebResponse
           using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
           {
            using (StreamReader stream = new StreamReader(response.GetResponseStream()))
            {
                resultStr = stream.ReadToEnd();
            }
          }
       }
       catch (WebException ex)
       {
         var errorSr = new StreamReader(ex.Response.GetResponseStream());
         resultStr = errorSr.ReadToEnd();
       }
       return resultStr;
    }
}

GET方法含Body请求体 (一般情况不建议:–HTTP 标准不允许 GET 请求包含请求体)

/// <summary>
/// GET请求包含body数据,(不正规,特殊时候用)
/// </summary>
/// <param name="postDataStr">body数据</param>
/// <param name="headersList">请求头集合</param>
public static string HttpGet(string url, string postDataStr, Dictionary<string, string> headersDic)
{
    //跳过SSL验证
    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
    request.Content = new StringContent(postDataStr, Encoding.UTF8, "application/json"); // 设置请求体
    foreach (var item in headersDic)
    {
        request.Headers.Add(item.Key, item.Value);
    }
    HttpClient client = new HttpClient();
    // 发送请求并获取响应
    HttpResponseMessage response = client.SendAsync(request).Result;
    response.EnsureSuccessStatusCode(); // 确保响应成功
    string responseBody = response.Content.ReadAsStringAsync().Result; // 读取响应内容

    return responseBody;
}

使用POST() 获取网络资源

 dynamic body = new
 {
     data_item_type = dataItemType,
     query_date = date,
 };

 //将数据序列化成JSON字符串
 string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(body);

 //向服务端发送请求
 string strRet = HttpHelp.HttpPost("http://127.0.0.1/MW_EMS/API/SyncData", strJson);
 
 //将返回字符串反序列化成对象
 var oRet = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(strRet);
 

附下载网络资源文件

string strURL="http://127.0.0.1/123.doc";
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(strURL);
request.Timeout = _TimeOut;
request.ReadWriteTimeout = _TimeOut;

using (Stream stream = request.GetResponse().GetResponseStream())
{
    //文件流,流信息读到文件流中,读完关闭
    using (FileStream fs = File.Create("D:\File\hello.doc"))
    {
        //建立字节组,并设置它的大小是多少字节
        byte[] bytes = new byte[102400];
        int n = 1;
        while (n > 0)
        {
            //一次从流中读多少字节,并把值赋给N,当读完后,N为0,并退出循环
            n = stream.Read(bytes, 0, 10240);
            fs.Write(bytes, 0, n); //将指定字节的流信息写入文件流中
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值