C# 模拟Http请求

瑞星  金牌会员 | 2022-9-16 17:15:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 533|帖子 533|积分 1599

使用原因:
在我们服务端调用第三方接口时,如:支付宝,微信支付,我们服务端需要模拟http请求并加上一些自己的逻辑响应给前端最终达到我们想要的效果
1.使用WebClient
引用命名空间
  1. using System.Net;
  2. using System.Collections.Specialized;
复制代码
Post发送请求
  1. public void TestRequest()
  2.         {
  3.             using (var client = new WebClient())
  4.             {
  5.                 var values = new NameValueCollection();
  6.                 values["school_name"] = "南轩中学";
  7.                 values["httpWithoutRpc"] = "1";
  8.                 var response = client.UploadValues("接口地址", values);
  9.                 var responseString = Encoding.Default.GetString(response);
  10.             }
  11.         }
复制代码
Get发送请求
  1. using (var client = new WebClient())
  2. {
  3.     var responseString = client.DownloadString("接口地址");
  4. }
复制代码
 2.使用WebRequest
我封装两个方法,用于处理post数据传输方式,Post Body form-data 传值形式专用,  application/json 这两种常用的,话不多说直接上代码
引用命名空间:
  1. using HttpWebRequest
  2. using System.IO
复制代码
方法封装:
  1.         /// <summary>
  2.         /// Http请求数据
  3.         /// </summary>
  4.         /// <typeparam name="T">返回类型</typeparam>
  5.         /// <param name="reqUrl">Url地址</param>
  6.         /// <param name="method">Get/Post</param>
  7.         /// <param name="paraObject">Http参数</param>
  8.         /// <param name="headerValue">HttpHeader</param>
  9.         /// <param name="timeOut">超时时间(毫秒)</param>
  10.         /// <returns></returns>
  11.         private T ReqUrlJson<T>(string reqUrl, string method, object paraObject, Dictionary<string, string> headerValue = null, int timeOut = 50000)
  12.         {
  13.             var paramData = JsonConvert.SerializeObject(paraObject);
  14.             var request = WebRequest.Create(reqUrl) as HttpWebRequest;
  15.             request.Timeout = timeOut;
  16.             request.Method = method.ToUpperInvariant(); //http method
  17.             //request.Headers.Add("source", "test"); //headers
  18.             if (headerValue != null && headerValue.Count > 0)
  19.             {
  20.                 foreach (var item in headerValue)
  21.                 {
  22.                     if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
  23.                     {
  24.                         request.Headers.Add(item.Key, item.Value);
  25.                     }
  26.                 }
  27.             }
  28.             //处理post请求
  29.             if (request.Method != "GET" && !string.IsNullOrEmpty(paramData) && paramData.Length > 0) //request data
  30.             {
  31.                 request.ContentType = "application/json";
  32.                 byte[] buffer = Encoding.UTF8.GetBytes(paramData.Replace("\r\n", ""));
  33.                 request.ContentLength = buffer.Length;
  34.                 request.GetRequestStream().Write(buffer, 0, buffer.Length);
  35.             }
  36.             using (var resp = request.GetResponse() as HttpWebResponse)
  37.             {
  38.                 using (var stream = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
  39.                 {
  40.                     string result = stream.ReadToEnd();
  41.                     return JsonConvert.DeserializeObject<T>(result); ;
  42.                 }
  43.             }
  44.         }
  45.         /// <summary>
  46.         /// Http请求数据(Post Body form-data 传值形式专用)
  47.         /// </summary>
  48.         /// <typeparam name="T">返回类型</typeparam>
  49.         /// <param name="reqUrl">Url地址</param>
  50.         /// <param name="headerValue">HttpHeader</param>
  51.         /// <param name="timeOut">超时时间(毫秒)</param>
  52.         /// <returns></returns>
  53.         private T ReqUrlJson<T>(string reqUrl, Dictionary<string, string> headerValue, int timeOut = 50000)
  54.         {
  55.             var client = new System.Net.Http.HttpClient();
  56.             client.Timeout = TimeSpan.FromMilliseconds(timeOut);
  57.             var postContent = new MultipartFormDataContent();
  58.             string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
  59.             postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
  60.             //postContent.Headers.Add("source", "test");
  61.             if (headerValue != null && headerValue.Count > 0)
  62.             {
  63.                 foreach (var key in headerValue.Keys)
  64.                 {
  65.                     postContent.Add(new StringContent(headerValue[key]?.ToString() ?? string.Empty), key);
  66.                 }
  67.             }
  68.             HttpResponseMessage response = client.PostAsync(reqUrl, postContent).Result;
  69.             var result = response.Content.ReadAsStringAsync().Result;
  70.             return JsonConvert.DeserializeObject<T>(result);
  71.         }
复制代码
使用方法:
  1. var response = new MZSABL().ReqUrlJson<MZSAResultModel<MZSASchoolListModel>>("第三方接口地址", "Post", JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(new MZWASerialNumberModel() { school_name = "南轩中学" })));
复制代码
 篇尾:
因为本人用的是WebRequest,所以可能WebRequest那写的较详细,封装的两个方法基本上大多数场景都通用哦,如有疑问可以直接私信哦,这里我也推荐大家可以去了解下Post的几种数据传输方式方便更好的理解本片文章哦~,那本章就到此结束啦

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表