iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1

串接API

相信很多時候開發程式不是只有自己開發就可以了,不論是公司外還是公司內部都有打Api的需求,所以在之前那篇Api文件之後今天來談談如何在網頁伺服器中打Api溝通。

本文同步放置於此

RestSharp

「前輩,我們要怎麼打Api跟第三方溝通阿。」
這天大頭收到一個需求,是要跟第三方溝通交換數據,所以大頭跟老K請教要如何跟第三方溝通。
「恩,土炮一點可以用HttpWebRequest或是WebClient來硬幹。」
聽到這裡大頭面有難色,因為這個需求還滿趕的。而老K看到大頭的表情後笑笑的跟他說。
「哈哈剛剛是開玩笑的,你來用用看RestSharp吧」

環境設定

第一動還是不免俗的來設定環境,所以請輸入以下指令。

dotnet add package RestSharp

安裝好套件後接下來說明一下如何使用RestSharp

發起請求

由於已經習慣依賴注入的開發方式,所以接下來還是以依賴注入的方式來透過RestSharp來發起請求,所以程式開發部分的第一動還是先注入相依的元件,所以在Startup.ConfigureServices加入以下程式來注入元件。

builder.RegisterType<RestSharp.RestClient>()
    .AsImplementedInterfaces()
    .InstancePerDependency();

注入完了之後在需求端的部分由建構子注入,並且設定連線的終端即可發起請求,如下列所示。

private readonly IRestClient _client = null;


public WeatherForecastController(ILogger<WeatherForecastController> logger,
    IRestClient client)
{
    _logger = logger;
    _client = client;
}

接下來發起請求的方式如下。

_client.BaseUrl = new Uri("第三方api的url");
var request = new RestRequest("請求的方法", Method.GET);
var fetchResult = await _client.GetAsync<解析後的類別>(request);

如果只有這樣使用的話根本不需要RestSharp,接下來如果有需要傳遞參數的話就透過以下方是傳遞。

request.AddParameter("param1", param2);
request.AddParameter("param2", param2);

再來如果遇到第三方需要傳遞header的話,例如走的是jwt的協定時,就透過以下方式傳遞。

request.AddHeaders("Key", value);

又或者想要簡單一點的作法處理jwt協定可以直接使用Authenticator,如下列方式。

_client.Authenticator = new RestSharp.Authenticators.JwtAuthenticator("token");

還有如果需求是抓取檔案可以透過以下方法。

var request = new RestRequest("Assets/LargeFile.7z");
request.ResponseWriter = responseStream =>
{
    using (responseStream)
    {
        responseStream.CopyTo(writer);
    }
};
var response = _client.DownloadData(request);

最後常會遇到的問題是訪問的網站是沒有ssl憑證的可以透過以下方法來避免錯誤發生。

_client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;

後記

今天跟小光還有大頭了解如何透過RestSharp跟第三方溝通,透過封裝後的套件讓跟第三方溝通的程式可以寫得更便利,希望大家在處理呼叫第三方Api的開發可以更容易,讓大家更專注在自己邏輯的開發。


上一篇
D-06-日誌寫入 ? NLog ? ILogger
下一篇
D-04-開始測試 ? mstest ? specflow
系列文
30天的asp.net core實習生活-從入門到進階技巧31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言