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接口相关推荐
- 单页面axios_Axios封装之取消重复请求和接口缓存
在平时的单页面项目里,大家肯定接触过axios库,一个易用.简洁且高效,使用Promise管理异步,告别传统callback方式的http库. 最近有个项目里接口调取的频率比较高,接口队列长,然后等待 ...
- PostMan怎样携带登录信息请求后台接口防止出现无法访问资源问题
场景 前后端分离的项目. 前端在登录后请求后台的接口. 在使用postman进行测试后台接口时如果直接通过url进行访问 会提示认证失败,无法访问系统资源 注: 博客: https://blog.cs ...
- 请求微信接口,判断用户是否关注公众号
最近开发了一个投票活动,用户可上传一张照片,分享微信好友或朋友圈邀请好友点赞,点赞前几名可获得相应的奖品.上传照片的用户必须关注某公众号. 用户点击上传按钮,后台判断用户是否关注公众号,关注则前端可使 ...
- php发送https请求,php post 请求https接口
/** * POST请求https接口返回内容 * @param string $url [请求的URL地址] * @param string $post [请求的参数] * @return stri ...
- php请求接口两次,php curl post请求执行一次curl_exce 请求的接口确执行两次
1.php curl post请求接口,打印日志执行了一次curl_exce,但是请求的接口却重复执行两次. 2.代码: $ch = curl_init(); if(false === $ch){ w ...
- ajax背景、ajax对象、ajax状态、ajax与http、ajax请求数据接口、同步与异步、ajax请求XML数据、封装ajax函数、artTemplate简介、同源策略和跨域请求、JSONP
AJAX简介: ajax背景: 1.AJAX(Asynchronous JavaScript And Xml)异步的 JavaScript 和 XML:ajax是浏览器提供的一套API,最早出现在谷歌 ...
- python接口自动化(八)--发送post请求的接口(详解)
简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...
- Java HttpURLConnection模拟请求Rest接口解决中文乱码问题
Java HttpURLConnection模拟请求Rest接口解决中文乱码问题 参考文章: (1)Java HttpURLConnection模拟请求Rest接口解决中文乱码问题 (2)https: ...
- Flutter-防京东商城项目-创建商品数据模型 、请求Api接口渲染热门商品 推荐商品 获取数据然后模型赋值-06
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...
- PHP——get和post请求他人接口
在PHP实际开发过程中,经常需要与别人合作对接,这时候就有可能需要访问他人接口来进行数据的获取,这里特指是在同一网络下,不需要进行跨网闸的操作.现在,就需要方法来请求他人接口. 请求一般分为get和p ...
最新文章
- stata命令汇总_第九届高级计量经济学及stata应用研讨会在京顺利举办
- TensorFlow搭建垃圾分类系统大师(免费领源码)
- leetcode(1)485——最大连续 1 的个数(C++)
- 汇编语言学习系列 for循环实现
- DHL出台货运新方案
- Windows 10 2022 年更新来了!
- 一点关于cloze-style问题的简谈
- .wav格式的声音文件怎么变成matlab 中的.mat文件
- python是什么软件-python一般用什么软件
- python剑指offer剪绳子
- 阿里巴巴代码规范插件
- 家用电器插头插座外壳防冲击等级试验——IK摆锤冲击试验装置
- 教务管理系统的设计与实践
- pdfminer识别pdf无法识别问题
- 学科前沿:基因启动子甲基化与宫颈癌发展的关系 | 文献科普
- HDMI2.0/HDCP2.2 2x4 矩阵芯片——GSV2006
- 网站安全防护方案--WEB应用防火墙
- ‘M-BM-‘ character
- 在线格式化xml 工具
- 编写一个具有搜索功能的搜索框