翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
在一次项目中,在给客户做系统时,需要调用客户的系统获取数据,客户提供了获取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.
复制代码
来源:https://www.cnblogs.com/moonstars/p/17276990.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具