借助HttpWebRequest 调用第三方接口,获取Token和数据

  金牌会员 | 2024-5-14 15:12:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

在一次项目中,在给客户做系统时,需要调用客户的系统获取数据,客户提供了获取Token和获取数据的接口,用户名和密码,认证方式是基于Bearer的,通过学习和找资料,提供一个C#示例

一个C#示例

1、传入语句获取数据
  1.          /// <summary>
  2.         /// 传入语句获取数据
  3.         /// </summary>
  4.         /// <param name="param"></param>
  5.         /// <returns></returns>
  6.         public async Task<string> ThirdSystemDataPostAsync(string param,string dataUrlAddress)
  7.         {
  8.             string token = await Bearer_TokenPostAsync();
  9.             _logger.Warn($"获取Token结构:{token}");
  10.             string responseString = string.Empty;
  11.             try
  12.             {
  13.                 var tokenJson = JsonConvert.DeserializeObject<TokenResultDto>(token);
  14.                 _logger.Warn($"获取Token值参数据:{tokenJson}");
  15.                 //跳过ssl验证
  16.                 ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
  17.                 // 创建HttpWebRequest对象
  18.                 HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(dataUrlAddress);
  19.                 _logger.Warn($"入参数据:{param}");
  20.                 _logger.Warn($"智慧系统数据地址:{dataUrlAddress}");
  21.                 // 设置Post调⽤⽅法
  22.                 httpRequest.Method = "Post";
  23.                 //设置参数传输类型
  24.                 httpRequest.ContentType = " application/json; charset=utf-8";
  25.                 // 设置Http Bearer认证的请求头
  26.                 httpRequest.Headers.Add("Authorization", "Bearer " + tokenJson.accessToken);
  27.                 //传输参数格式转换
  28.                 byte[] bytesRequestData = Encoding.UTF8.GetBytes(param);
  29.                 //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
  30.                 httpRequest.ContentLength = bytesRequestData.Length;
  31.                 Stream postStream = await httpRequest.GetRequestStreamAsync();
  32.                 postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
  33.                 postStream.Close();
  34.                 //获取设置身份认证及请求超时时间
  35.                 SetWebRequest(httpRequest);
  36.                 // HttpWebRequest发起调⽤
  37.                 using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
  38.                 {
  39.                     //myResponse.StatusCode
  40.                     // StreamReader对象
  41.                     StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  42.                     // 返回结果
  43.                     responseString = sr.ReadToEnd();
  44.                     _logger.Warn($"调用智慧系统返回结果数据:{responseString}");
  45.                     return responseString;
  46.                 }
  47.             }
  48.             catch (Exception ex)
  49.             {
  50.                 //返回错误信息
  51.                 responseString = ex.ToString();
  52.             }
  53.             return responseString;
  54.         }
复制代码
2、获取token
  1.          /// <summary>
  2.         /// 获取token
  3.         /// </summary>
  4.         /// <returns></returns>
  5.         private async Task<string> Bearer_TokenPostAsync(string sSoUrlAddress,string userName,string userPassword)
  6.         {
  7.             string responseString = string.Empty;
  8.             try
  9.             {
  10.                 // 创建HttpWebRequest对象
  11.                 HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(sSoUrlAddress);
  12.                 _logger.Warn($"智慧系统Token地址:{sSoUrlAddress}");
  13.                 // 设置Post调⽤⽅法
  14.                 httpRequest.Method = "Post";
  15.                 //设置参数传输类型
  16.                 httpRequest.ContentType = " application/json; charset=utf-8";
  17.                 // 设置用户名和密码
  18.                 var usermesg = new UserMesgInput()
  19.                 {
  20.                     Username = userName,
  21.                     Password = userPassword,
  22.                     UserDetail = true
  23.                 };
  24.                 string base64 = JsonConvert.SerializeObject(usermesg);
  25.                 //传输参数格式转换
  26.                 byte[] bytesRequestData = Encoding.UTF8.GetBytes(base64);
  27.                 //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
  28.                 httpRequest.ContentLength = bytesRequestData.Length;
  29.                 Stream postStream = await httpRequest.GetRequestStreamAsync();
  30.                 postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
  31.                 postStream.Close();
  32.                 //获取设置身份认证及请求超时时间
  33.                 SetWebRequest(httpRequest);
  34.                 _logger.Warn($"获取设置身份认证及请求超时时间");
  35.                 // HttpWebRequest发起调⽤
  36.                 using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
  37.                 {
  38.                     _logger.Warn($"StreamReader对象");
  39.                     // StreamReader对象
  40.                     StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  41.                     //_logger.Warn($"返回结果{sr.ReadToEnd()}");
  42.                     // 返回结果
  43.                     responseString = sr.ReadToEnd();
  44.                   
  45.                     _logger.Warn($"调用智慧系统返回结果Token:{responseString}");
  46.                     //return responseString;
  47.                 }
  48.             }
  49.             catch (Exception ex)
  50.             {
  51.                 //返回错误信息
  52.                 responseString = ex.ToString();
  53.             }
  54.             return responseString;
  55.         }
复制代码
3、获取设置身份认证及请求超时时间
  1.         /// <summary>
  2.         /// 获取设置身份认证及请求超时时间
  3.         /// </summary>
  4.         /// <param name="request"></param>
  5.         private static void SetWebRequest(HttpWebRequest request)
  6.         {
  7.             request.Credentials = CredentialCache.DefaultCredentials;
  8.             request.Timeout = 1000000;
  9.         }
复制代码
4、在我使用的时候出现了下面的错误,通过查找是证书的问题,因为客户的web访问使用的IP地址访问,所以在代码中要加入跳过ssl验证的一行代码
  1. System.Net.WebException: The SSL connection could not be established, see inner exception. The remote certificate is invalid according to the validation procedure.
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表