文章目录

  • 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设置代理,进行接口请求拦截。共两个步骤:

  1. 在代码中添加如下:

    System.Net.WebProxy wp = new System.Net.WebProxy("127.0.0.1:5555", true);// 调试模式下,用于postman拦截测试参数问题
    request.Proxy = wp;
    

    Postman代理端口默认是5555

  2. Postman开启代理

    注意:调试模式下Postman才可以拦截到请求

    4. 参考链接

    • C# WebRequest设置代理访问
    • C# HttpWebRequest post 请求传参数

C#请求Post接口相关推荐

  1. 单页面axios_Axios封装之取消重复请求和接口缓存

    在平时的单页面项目里,大家肯定接触过axios库,一个易用.简洁且高效,使用Promise管理异步,告别传统callback方式的http库. 最近有个项目里接口调取的频率比较高,接口队列长,然后等待 ...

  2. PostMan怎样携带登录信息请求后台接口防止出现无法访问资源问题

    场景 前后端分离的项目. 前端在登录后请求后台的接口. 在使用postman进行测试后台接口时如果直接通过url进行访问 会提示认证失败,无法访问系统资源 注: 博客: https://blog.cs ...

  3. 请求微信接口,判断用户是否关注公众号

    最近开发了一个投票活动,用户可上传一张照片,分享微信好友或朋友圈邀请好友点赞,点赞前几名可获得相应的奖品.上传照片的用户必须关注某公众号. 用户点击上传按钮,后台判断用户是否关注公众号,关注则前端可使 ...

  4. php发送https请求,php post 请求https接口

    /** * POST请求https接口返回内容 * @param string $url [请求的URL地址] * @param string $post [请求的参数] * @return stri ...

  5. php请求接口两次,php curl post请求执行一次curl_exce 请求的接口确执行两次

    1.php curl post请求接口,打印日志执行了一次curl_exce,但是请求的接口却重复执行两次. 2.代码: $ch = curl_init(); if(false === $ch){ w ...

  6. ajax背景、ajax对象、ajax状态、ajax与http、ajax请求数据接口、同步与异步、ajax请求XML数据、封装ajax函数、artTemplate简介、同源策略和跨域请求、JSONP

    AJAX简介: ajax背景: 1.AJAX(Asynchronous JavaScript And Xml)异步的 JavaScript 和 XML:ajax是浏览器提供的一套API,最早出现在谷歌 ...

  7. python接口自动化(八)--发送post请求的接口(详解)

    简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...

  8. Java HttpURLConnection模拟请求Rest接口解决中文乱码问题

    Java HttpURLConnection模拟请求Rest接口解决中文乱码问题 参考文章: (1)Java HttpURLConnection模拟请求Rest接口解决中文乱码问题 (2)https: ...

  9. Flutter-防京东商城项目-创建商品数据模型 、请求Api接口渲染热门商品 推荐商品 获取数据然后模型赋值-06

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  10. PHP——get和post请求他人接口

    在PHP实际开发过程中,经常需要与别人合作对接,这时候就有可能需要访问他人接口来进行数据的获取,这里特指是在同一网络下,不需要进行跨网闸的操作.现在,就需要方法来请求他人接口. 请求一般分为get和p ...

最新文章

  1. stata命令汇总_第九届高级计量经济学及stata应用研讨会在京顺利举办
  2. TensorFlow搭建垃圾分类系统大师(免费领源码)
  3. leetcode(1)485——最大连续 1 的个数(C++)
  4. 汇编语言学习系列 for循环实现
  5. DHL出台货运新方案
  6. Windows 10 2022 年更新来了!
  7. 一点关于cloze-style问题的简谈
  8. .wav格式的声音文件怎么变成matlab 中的.mat文件
  9. python是什么软件-python一般用什么软件
  10. python剑指offer剪绳子
  11. 阿里巴巴代码规范插件
  12. 家用电器插头插座外壳防冲击等级试验——IK摆锤冲击试验装置
  13. 教务管理系统的设计与实践
  14. pdfminer识别pdf无法识别问题
  15. 学科前沿:基因启动子甲基化与宫颈癌发展的关系 | 文献科普
  16. HDMI2.0/HDCP2.2 2x4 矩阵芯片——GSV2006
  17. 网站安全防护方案--WEB应用防火墙
  18. ‘M-BM-‘ character
  19. 在线格式化xml 工具
  20. 编写一个具有搜索功能的搜索框

热门文章

  1. OpenCV之objdetect 模块. 物体检测:级联分类器
  2. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
  3. OpenCV学习笔记资料大集锦
  4. Matplotlib绘图库初探
  5. windows 下phpstudy 升级mysql版本5.7
  6. ProxySQL 监控和统计
  7. exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp
  8. 嵌入式工程师必读100本专业书籍
  9. RecyclerView导包
  10. javascript中的console.log有什么作用?