藉助HttpWebRequest 調用第三方介面,獲取Token和數據

来源:https://www.cnblogs.com/moonstars/p/17276990.html
-Advertisement-
Play Games

在一次項目中,在給客戶做系統時,需要調用客戶的系統獲取數據,客戶提供了獲取Token和獲取數據的介面,用戶名和密碼,認證方式是基於Bearer的,通過學習和找資料,提供一個C#示例 一個C#示例 1、傳入語句獲取數據 /// <summary> /// 傳入語句獲取數據 /// </summary> ...


在一次項目中,在給客戶做系統時,需要調用客戶的系統獲取數據,客戶提供了獲取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.

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在處理大量PDF文檔時,有時我們需要快速找到特定的文本信息。本文將提供以下三個Python示例來幫助你在PDF文件中快速查找並高亮指定的文本。 查找並高亮PDF中所有的指定文本 查找並高亮PDF某個區域內的指定文本 使用正則表達式搜索指定文本並高亮 本文將用到國產第三方庫 - Spire.PDF f ...
  • 源碼下麵無秘密,這是程式員的口頭禪。對於強大而且設計優秀的Spring框架也是這樣的,在基礎代碼層層堆疊之下,Spring成為了一個非常流行的框架。 ...
  • Go(又稱為Golang)是一門由Google開發的開源編程語言,於2009年首次公開發佈。Go語言被設計用來提高軟體開發的效率和可靠性,在處理大規模系統時表現出色。以下是Go語言的一些特點和優勢: 特點 簡潔易讀:Go語法簡潔清晰,易於閱讀和學習,減少了代碼的複雜性。 併發支持:Go原生支持輕量級 ...
  • 我們將公共的,可利用的代碼進行打包,發佈到github上面,在需要的地方直接go get即可,需要註意的是go get中最小單位是包,如果一發佈的項目里包含多個子包,在go get時,應該精確到小包級別。 將go的項目發到github作成開源公用包 版本:v1.0.0,需要是3位的版本號,不然會報錯 ...
  • 大家好 ,我是R哥。 近兩年 AI 太火了,風靡全球,AI 編程工具也沒有落下,比如微軟的 GitHub Copilot,還有阿裡的通義靈碼,連 JetBrains 系列工具都逼出了自家的 AI 功能。 大家知道我是效率狂人,同樣也是工具狂人,之前給大家分享了不少開發神器,其中也不乏國內的優秀選手, ...
  • 本文深入探討了Java 8引入的全新日期時間API相較於傳統的Date和Calendar類的優勢及實際應用。鑒於Java 8新日期時間API在設計上的先進性和易用性,我們強烈建議開發者積極採納並替換掉陳舊的Date和Calendar類,轉而採用如LocalDate、LocalDateTime、Zon... ...
  • 如果最近您收到了MacOS 14.4的升級提醒,那麼建議你暫時先不要升級! 在x上,Java開發領域的一些大v們,也發現了這個問題,並提醒大家不要升級。 根據Java官方發佈的文章瞭解到,該問題主要是由於macOS上運行的進程可能會訪問受保護記憶體區域中的記憶體。在 macOS 14.4 更新之前,在某 ...
  • 本文介紹基於R語言中的geodetector包,依據多張柵格圖像數據,實現地理探測器(Geodetector)操作的詳細方法~ ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...