借助HttpWebRequest 调用第三方接口,获取Token和数据
|
在一次项目中,在给客户做系统时,需要调用客户的系统获取数据,客户提供了获取Token和获取数据的接口,用户名和密码,认证方式是基于Bearer的,通过学习和找资料,提供一个C#示例
一个C#示例
1、传入语句获取数据
- /// <summary>
- /// 传入语句获取数据
- /// </summary>
- /// <param name="param"></param>
- /// <returns></returns>
- public async Task<string> ThirdSystemDataPostAsync(string param,string dataUrlAddress)
- {
- string token = await Bearer_TokenPostAsync();
- _logger.Warn($"获取Token结构:{token}");
- string responseString = string.Empty;
- try
- {
- var tokenJson = JsonConvert.DeserializeObject<TokenResultDto>(token);
- _logger.Warn($"获取Token值参数据:{tokenJson}");
- //跳过ssl验证
- ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
- // 创建HttpWebRequest对象
- HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(dataUrlAddress);
- _logger.Warn($"入参数据:{param}");
- _logger.Warn($"智慧系统数据地址:{dataUrlAddress}");
- // 设置Post调⽤⽅法
- httpRequest.Method = "Post";
- //设置参数传输类型
- httpRequest.ContentType = " application/json; charset=utf-8";
- // 设置Http Bearer认证的请求头
- httpRequest.Headers.Add("Authorization", "Bearer " + tokenJson.accessToken);
- //传输参数格式转换
- byte[] bytesRequestData = Encoding.UTF8.GetBytes(param);
- //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
- httpRequest.ContentLength = bytesRequestData.Length;
- Stream postStream = await httpRequest.GetRequestStreamAsync();
- postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
- postStream.Close();
- //获取设置身份认证及请求超时时间
- SetWebRequest(httpRequest);
- // HttpWebRequest发起调⽤
- using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
- {
- //myResponse.StatusCode
- // StreamReader对象
- StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
- // 返回结果
- responseString = sr.ReadToEnd();
- _logger.Warn($"调用智慧系统返回结果数据:{responseString}");
- return responseString;
- }
- }
- catch (Exception ex)
- {
- //返回错误信息
- responseString = ex.ToString();
- }
- return responseString;
- }
复制代码 2、获取token
- /// <summary>
- /// 获取token
- /// </summary>
- /// <returns></returns>
- private async Task<string> Bearer_TokenPostAsync(string sSoUrlAddress,string userName,string userPassword)
- {
- string responseString = string.Empty;
- try
- {
- // 创建HttpWebRequest对象
- HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(sSoUrlAddress);
- _logger.Warn($"智慧系统Token地址:{sSoUrlAddress}");
- // 设置Post调⽤⽅法
- httpRequest.Method = "Post";
- //设置参数传输类型
- httpRequest.ContentType = " application/json; charset=utf-8";
- // 设置用户名和密码
- var usermesg = new UserMesgInput()
- {
- Username = userName,
- Password = userPassword,
- UserDetail = true
- };
- string base64 = JsonConvert.SerializeObject(usermesg);
- //传输参数格式转换
- byte[] bytesRequestData = Encoding.UTF8.GetBytes(base64);
- //_logger.Warn($"入参数据格式转换:{bytesRequestData}");
- httpRequest.ContentLength = bytesRequestData.Length;
- Stream postStream = await httpRequest.GetRequestStreamAsync();
- postStream.Write(bytesRequestData, 0, bytesRequestData.Length);
- postStream.Close();
- //获取设置身份认证及请求超时时间
- SetWebRequest(httpRequest);
- _logger.Warn($"获取设置身份认证及请求超时时间");
- // HttpWebRequest发起调⽤
- using (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse())
- {
- _logger.Warn($"StreamReader对象");
- // StreamReader对象
- StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
- //_logger.Warn($"返回结果{sr.ReadToEnd()}");
- // 返回结果
- responseString = sr.ReadToEnd();
-
- _logger.Warn($"调用智慧系统返回结果Token:{responseString}");
- //return responseString;
- }
- }
- catch (Exception ex)
- {
- //返回错误信息
- responseString = ex.ToString();
- }
- return responseString;
- }
复制代码 3、获取设置身份认证及请求超时时间
- /// <summary>
- /// 获取设置身份认证及请求超时时间
- /// </summary>
- /// <param name="request"></param>
- private static void SetWebRequest(HttpWebRequest request)
- {
- request.Credentials = CredentialCache.DefaultCredentials;
- request.Timeout = 1000000;
- }
复制代码 4、在我使用的时候出现了下面的错误,通过查找是证书的问题,因为客户的web访问使用的IP地址访问,所以在代码中要加入跳过ssl验证的一行代码
- 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】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2024-3-18 22:22:33
举报
回复
分享
|
|
|
|