在c#中常见发送http请求的方式如下
- HttpWebRequest:
.net 平台原生提供,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。
关于使用HttpWebRequest上传和下载文件,可参考:《c#使用Http上传下载文件》:https://blog.csdn.net/u010476739/article/details/105074171
- WebClient:
.net 平台原生提供,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,但也因此缺少了HttpWebRequest的灵活性。
- HttpClient:
.net 平台原生提供,.net core 推荐使用HttpClient :https://blog.csdn.net/u010476739/article/details/119782562
HttpWebRequest 使用
1.获取token接口

1 private string gettoken() 2 { 3 // 测试环境登陆用户 4 //string username = "as"; 5 //string password = "as"; 6 7 string Token = string.Empty; 8 try 9 { 10 if (string.IsNullOrEmpty(username) && username == null && string.IsNullOrEmpty(password) && password == null) 11 throw new Exception("调用系统接口:获取token失败 用户名或密码不能发为空!"); 12 var strParm = JsonConvert.SerializeObject(new 13 { 14 username = username, 15 password = password 16 }); 17 //string url = "http接口地址"; // 测试系统地址 18 19 Encoding encode = System.Text.Encoding.Default; 20 Byte[] arrB = encode.GetBytes(strParm); 21 HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(url); 22 Request.Method = "POST"; 23 Request.ContentType = "application/json"; // application/x-www-form-urlencoded 24 25 Request.ContentLength = arrB.Length; 26 //实例化写入请求的参数 27 using (Stream outStream = Request.GetRequestStream()) 28 { 29 outStream.Write(arrB, 0, arrB.Length); 30 outStream.Close(); 31 } 32 33 //接受http响应 34 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse; 35 //读取http返回的数据流 36 Stream ReceiveStream = myResponse.GetResponseStream(); 37 38 using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8)) 39 { 40 Token = reader.ReadToEnd(); 41 reader.Close(); 42 } 43 myResponse.Close(); 44 45 JObject obj = JObject.Parse(Token); 46 47 var msg = obj.GetValue("msg").ToString(); 48 if (msg != "操作成功") 49 throw new Exception(msg); 50 51 Token = obj.GetValue("token").ToString(); 52 } 53 catch (Exception ex) 54 { 55 throw ex; 56 } 57 return Token; 58 }
2.获取信息接口+表头token串

1 private string GetbjMerial(JObject infostr) 2 { 3 var apiResult = new ResultMessage(); 4 string result = string.Empty; 5 try 6 { 7 string url = "http接口地址"; // 测试系统地址 8 9 var para = JsonConvert.SerializeObject(infostr); 10 11 Encoding encode = System.Text.Encoding.Default; 12 Byte[] arrB = encode.GetBytes(para); 13 14 //获取token 15 string token = this.gettoken(); 16 17 HttpWebRequest Request = HttpWebRequest.Create(url) as HttpWebRequest; 18 Request.Method = "POST"; 19 Request.ContentType = "text/plain"; //"application/json"; 20 Request.Headers.Add("Authorization", token); 21 Request.ContentLength = arrB.Length; 22 //实例化写入请求的参数 23 using (Stream outStream = Request.GetRequestStream()) 24 { 25 outStream.Write(arrB, 0, arrB.Length); 26 outStream.Close(); 27 } 28 29 //接受http响应 30 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse; 31 //读取http返回的数据流 32 Stream ReceiveStream = myResponse.GetResponseStream(); 33 34 using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8)) 35 { 36 result = reader.ReadToEnd(); 37 reader.Close(); 38 } 39 myResponse.Close(); 40 41 } 42 catch (Exception ex) 43 { 44 throw ex; 45 } 46 return result; 47 }
2.1.获取token

public string gettoken() { string Token = string.Empty; try { //入参 var par = new { a= db, b = login, password = password }; var strParm = JsonConvert.SerializeObject(new { @params = par }); string url = “”; Encoding encode = System.Text.Encoding.Default; Byte[] arrB = encode.GetBytes(strParm); HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(url); Request.Method = "POST"; Request.CookieContainer = new System.Net.CookieContainer(); Request.ContentType = "application/json"; // application/x-www-form-urlencoded Request.ContentLength = arrB.Length; //实例化写入请求的参数 using (Stream outStream = Request.GetRequestStream()) { outStream.Write(arrB, 0, arrB.Length); outStream.Close(); } //接受http响应 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse; //读取http返回的数据流 Stream ReceiveStream = myResponse.GetResponseStream(); string mes = ""; using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8)) { mes = reader.ReadToEnd(); reader.Close(); } myResponse.Close(); JObject obj = JObject.Parse(mes); //dynamic resa = JsonConvert.DeserializeObject(mes); if (obj.Property("result") != null) // 存在结果集 { JObject res= obj.GetValue("result").ToObject<JObject>(); if(res.GetValue("username").ToString() == login && res.GetValue("name").ToString() == login) { // 调用成功,获取token System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)Request.GetResponse(); var json = Newtonsoft.Json.JsonConvert.SerializeObject(response.Cookies); if (response.Cookies.Count > 0) { Token = response.Cookies[0].Name + "=" + response.Cookies[0].Value; } } } if(obj.Property("error") != null) // 失败 { JObject res = obj.GetValue("error").ToObject<JObject>(); JObject resdata = res.GetValue("data").ToObject<JObject>(); throw new Exception("调用接口失败,错误信息:"+ res.GetValue("message").ToString() + " "+ resdata.GetValue("message").ToString()); } } catch (Exception ex) { throw ex; } return Token; }
通过返回接口的cookie中获取session_id作为获取数据接口的request请求的cookie调用接口。
2.2.根据2.1接口返回token结果获取数据

public dynamic GetData(string para) { var apiResult = new ResultMessage(); dynamic data ; try { string url =""; Encoding encode = System.Text.Encoding.Default; Byte[] arrB = encode.GetBytes(para); //获取token string token = this.gettoken(); HttpWebRequest Request = HttpWebRequest.Create(url) as HttpWebRequest; Request.Method = "POST"; Request.ContentType = "application/json"; Request.Headers.Add("Cookie", token); Request.ContentLength = arrB.Length; //实例化写入请求的参数 using (Stream outStream = Request.GetRequestStream()) { outStream.Write(arrB, 0, arrB.Length); outStream.Close(); } //接受http响应 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse; //读取http返回的数据流 Stream ReceiveStream = myResponse.GetResponseStream(); string str = string.Empty; using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8)) { str = reader.ReadToEnd(); reader.Close(); } myResponse.Close(); dynamic res = JsonConvert.DeserializeObject(str); dynamic result = JsonConvert.DeserializeObject(Convert.ToString(res.result)); if(Convert.ToString(result.code) =="200" && Convert.ToString(result.msg) == "操作成功") { data = JsonConvert.DeserializeObject(Convert.ToString(result.data)); } else { throw new Exception("接口失败,错误代码:" + Convert.ToString(result.code) + ",错误信息:" +Convert.ToString(result.msg)); } } catch (Exception ex) { throw ex; } return data; }
其他方式可访问:http://t.zoukankan.com/damugua-p-14368067.html
部分内容参考:https://blog.csdn.net/u010476739/article/details/119782562
分类:
.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?