LoginSignup
4
7

More than 1 year has passed since last update.

「RestSharp」を使ってC#で簡単にREST APIを操作してみる

Posted at

はじめに

本記事はC#でREST APIを簡単に操作するためのライブラリである「RestSharp」を使ってみて得た知見をまとめることを目的としています。

RestSharpとは

REST APIをC#から簡単に操作するためのライブラリです。
C#標準のHttpClientを使うよりも手軽にREST APIを利用するための機能が搭載されています。
詳細はこちらを参照ください。

どれぐらい簡単に書けるのか

以前私が投稿したC#からSlackAPIを利用してみる記事を参考に、取得数を指定してSlackAPI経由でメッセージを取得するサービスをHttpClientとRestSharpの両方を使って書いてみて、どれぐらいRestSharpでREST APIの操作が楽になるかを見ていきたいと思います。

HttpClientを使った場合

HttpClientを使った場合は、以下のようなコードになります。
クエリパラメータを作るためにディクショナリを作り、文字列に変換したのちにAPIのURLにクエリパラメータとして連結して、GETすることでメッセージを取得しています。

/// <summary>
/// HttpClientを使った場合のSlackApiサービス
/// </summary>
internal static class SlackApiServiceFromHttpClient
{
    #region 定数

    /// <summary>
    /// アクセストークン用のクエリパラメータ名
    /// </summary>
    private const string _AccessTokenQueryParameterName = "token";

    /// <summary>
    /// チャンネルID用のクエリパラメータ名
    /// </summary>
    private const string _ChannelIdQueryParameterName = "channel";

    /// <summary>
    /// 取得メッセージ数用のクエリパラメータ名
    /// </summary>
    private const string _MessageCountQueryParameterName = "limit";

    #endregion

    #region フィールド

    /// <summary>
    /// HttpClient
    /// </summary>
    private static readonly HttpClient _HttpClient = new HttpClient();

    #endregion

    #region 公開サービス

    /// <summary>
    /// メッセージを取得する
    /// </summary>
    /// <param name="accessToken">アクセストークン</param>
    /// <param name="channelId">チャンネルID</param>
    /// <param name="messageCount">取得するメッセージ数</param>
    /// <returns>取得メッセージ一覧</returns>
    public static async Task<IEnumerable<Message>> GetMessages(string accessToken, string channelId, int messageCount)
    {
        var messages = new List<Message>();

        // クエリパラメータを作成するためにディクショナリを作成
        // ディクショナリのKeyがクエリパラメータ名、ディクショナリのValueがクエリパラメータの値
        var parameters = new Dictionary<string, string>()
        {
            { _AccessTokenQueryParameterName, accessToken},
            { _ChannelIdQueryParameterName, channelId},
            { _MessageCountQueryParameterName, messageCount.ToString()},
        };

        try
        {
            // クエリパラメータを作成し、文字列で読み出す
            var parametersString = await new FormUrlEncodedContent(parameters).ReadAsStringAsync();
            // 読みだしたクエリパラメータを使ってリクエストURLを作成する。
            var requestBaseUrl = "https://slack.com/api/conversations.history";
            var requestUrl = $"{requestBaseUrl}?{parametersString}";
            var response = await _HttpClient.GetAsync(requestUrl).ConfigureAwait(false);
            // レスポンスのコンテンツをstringで読み出す
            var responseBodyString = await response.Content.ReadAsStringAsync();
            // 読みだしたJsonを、オブジェクトにデシリアライズする
            var getMessages = JsonConvert.DeserializeObject<MessageList>(responseBodyString);

            // 戻り値用のメッセージ一覧を作成
            foreach (var messageResponce in getMessages.Messages)
            {
                // 本文を設定
                var message = new Message()
                {
                    Text = messageResponce.Text
                };

                messages.Add(message);
            }

            return messages;
        }
        catch
        {
            return messages;
        }
    }

    #endregion
}

RestSharpを使った場合

RestSharpを使った場合は、以下のようなコードになります。

/// <summary>
/// RestSharpを使った場合のSlackApiサービス
/// </summary>
internal static class SlackApiServiceFromRestSharp
{
    #region 定数

    /// <summary>
    /// アクセストークン用のクエリパラメータ名
    /// </summary>
    private const string _AccessTokenQueryParameterName = "token";

    /// <summary>
    /// チャンネルID用のクエリパラメータ名
    /// </summary>
    private const string _ChannelIdQueryParameterName = "channel";

    /// <summary>
    /// 取得メッセージ数用のクエリパラメータ名
    /// </summary>
    private const string _MessageCountQueryParameterName = "limit";

    #endregion

    #region 公開サービス

    /// <summary>
    /// メッセージを取得する
    /// </summary>
    /// <param name="accessToken">アクセストークン</param>
    /// <param name="channelId">チャンネルID</param>
    /// <param name="messageCount">取得するメッセージ数</param>
    /// <returns>取得メッセージ一覧</returns>
    public static async Task<IEnumerable<Message>> GetMessages(string accessToken, string channelId, int messageCount)
    {
        var messages = new List<Message>();

        // クライアント作成
        var client = new RestClient("https://slack.com/api/conversations.history");

        // クエリパラメータ作成
        var request = new RestRequest();
        request.AddQueryParameter(_AccessTokenQueryParameterName, accessToken);
        request.AddQueryParameter(_ChannelIdQueryParameterName, channelId);
        request.AddQueryParameter(_MessageCountQueryParameterName, messageCount.ToString());

        try
        {
            var getMessageList = await client.GetAsync<MessageList>(request);

            // 戻り値用のメッセージ一覧を作成
            foreach (var messageResponce in getMessageList.Messages)
            {
                // 本文を設定
                var message = new Message()
                {
                    Text = messageResponce.Text
                };

                messages.Add(message);
            }

            return messages;
        }
        catch
        {
            return messages;
        }
    }

    #endregion
}

大きな違いとしては、クエリパラメータを作成してからGETするまでのコード量です。
先述したようにHttpClientを使った場合は、クエリパラメータを作るためにディクショナリを作り、文字列に変換したのちにAPIのURLにクエリパラメータとして連結して、GETすることでメッセージを取得しています。一方RestSharpを使った場合は、クエリパラメータをメソッド経由で追加して、その後GETするだけでメッセージを取得しています。
個人的にはクエリパラメータが直感的なメソッドで登録できる点が使いやすいと感じました。

RestSharpの利用方法

RestSharpはNugetで取得可能なライブラリなので、VisualStudioでプロジェクトを右クリックし、[Nugetパッケージの管理]から開くダイアログでRestSharpと検索して、インストールすれば利用可能です。
image.png

まとめ

本記事ではRestSharpを使ってみて、HttpClientと比べて使いやすい点についてまとめました。
単純なREST API操作を例にしましたが、HttpClientと比べてメソッド経由で直感的にAPIを操作できると感じました。
今後C#でREST APIを操作する際にはぜひ使いたいと思いました。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7