C#请求Post接口
生活随笔
收集整理的这篇文章主要介绍了
C#请求Post接口
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- 1. 应用场景
- 2. 解决方案
- 3. 问题汇总
- 3.1 传参问题
- 3.2 设置代理
- 4. 参考链接
1. 应用场景
防止前端直接调用某些隐私接口造成数据泄露,可以采用后端调用接口的方式,这样避免前端传参导致的数据泄露问题。
2. 解决方案
使用类HttpWebRequest,核心代码如下:
/// <summary> /// 接口请求 /// </summary> /// <param name="url">请求地址</param> /// <returns></returns> public static string GetToken(string url){string result = "";//返回结果HttpWebRequest request = null;HttpWebResponse response = null;Stream reqStream = null;try{request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ReadWriteTimeout = 5000;//System.Net.WebProxy wp = new System.Net.WebProxy("127.0.0.1:5555", true);// 调试模式下,用于postman拦截测试参数问题//request.Proxy = wp;request.ProtocolVersion = HttpVersion.Version10;request.KeepAlive = false;request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";request.ServicePoint.Expect100Continue = false;//添加Authorization到HTTP头request.Headers.Add("Authorization", "Basic ****************");Dictionary<string, string> parameters = new Dictionary<string, string>(); //参数列表parameters.Add("paraName", "paraValue");byte[] data = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8")); //使用utf-8格式组装post参数request.ContentLength = data.Length;reqStream = request.GetRequestStream();reqStream.Write(data, 0, data.Length);reqStream.Close();//获取服务端返回response = (HttpWebResponse)request.GetResponse();StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);result = sr.ReadToEnd().Trim();sr.Close();}catch (Exception e){LogManager.DefaultLogger.Error(e);}finally{//关闭连接和流if (response != null){response.Close();}if (request != null){request.Abort();}}return result;}//组装请求参数 private string BuildQuery(IDictionary<string, string> parameters, string encode) {StringBuilder postData = new StringBuilder();bool hasParam = false;IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();while (dem.MoveNext()){string name = dem.Current.Key;string value = dem.Current.Value;// 忽略参数名或参数值为空的参数if (!string.IsNullOrEmpty(name)){if (hasParam){postData.Append("&");}postData.Append(name);postData.Append("=");if (encode == "gb2312"){postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312")));}else if (encode == "utf8"){postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));}else{postData.Append(value);}hasParam = true;}}return postData.ToString(); }3. 问题汇总
3.1 传参问题
接口请求时总是无法返回正确结果,使用同样的参数在Postman中返回结果正常,通过[设置代理](#3.2 设置代理)进行请求拦截,发现应该时参数传递时出现问题,应该进行encode。参数处理参考如下代码:
Dictionary<string, string> parameters = new Dictionary<string, string>(); //参数列表 parameters.Add("paraName", "paraValue"); byte[] data = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8")); //使用utf-8格式组装 request.ContentLength = data.Length; reqStream = request.GetRequestStream(); reqStream.Write(data, 0, data.Length); reqStream.Close(); //获取服务端返回 response = (HttpWebResponse)request.GetResponse();//组装请求参数 private string BuildQuery(IDictionary<string, string> parameters, string encode) {StringBuilder postData = new StringBuilder();bool hasParam = false;IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();while (dem.MoveNext()){string name = dem.Current.Key;string value = dem.Current.Value;// 忽略参数名或参数值为空的参数if (!string.IsNullOrEmpty(name)){if (hasParam){postData.Append("&");}postData.Append(name);postData.Append("=");if (encode == "gb2312"){postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312")));}else if (encode == "utf8"){postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));}else{postData.Append(value);}hasParam = true;}}return postData.ToString(); }3.2 设置代理
当我们想要查看接口请求的详细内容时,包括请求头与参数等,可以配合Postman设置代理,进行接口请求拦截。共两个步骤:
在代码中添加如下:
System.Net.WebProxy wp = new System.Net.WebProxy("127.0.0.1:5555", true);// 调试模式下,用于postman拦截测试参数问题 request.Proxy = wp;Postman代理端口默认是5555
Postman开启代理
注意:调试模式下Postman才可以拦截到请求
4. 参考链接
- C# WebRequest设置代理访问
- C# HttpWebRequest post 请求传参数
总结
以上是生活随笔为你收集整理的C#请求Post接口的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 接口请求时params与data的区别
- 下一篇: C#中EventLog的使用