#C

نحوه پیاده سازی Trello API با #NET/C.

در این مقاله قصد داریم تا شیوه ارتباط با Trello API را به صورت گام به گام توضیح دهیم. در کمال تعجب، به نظر نمی رسد که هیچ بسته کلاینت توسعه یافته فعالی برای دات نت وجود داشته باشد و Trello  نیز نمونه هایی را به زبان سی شارپ در وب سایت خود قرار نداده است. 

درادامه قصد داریم تا مروری اجمالی از آنچه آموخته ایم داشته باشیم.

برای تست، ما یک برنامه کنسول در NET 6. در تعامل با Trello API خواهیم ساخت. این کد به هیچ وجه مختص برنامه های کنسول نیست و می توان از آن در وب سایت نیز استفاده کرد.

برای برقراری ارتباط با Trello REST API به یک API Key و یک Token نیاز دارید. اگر قبلاً این کار را نکرده اید، برای یک کاربر جدید در trello.com ثبت نام کنید. در مرحله بعد، به آدرس بروید  https://trello.com/app-key و بعد از پذیرفتن شرایط استفاده از Trello API، در صفحه زیر کلید API خود را خواهید دید:

 

trello-api

 

هنگام توسعه یک وب سایت، معمولاً می خواهید به کاربر اجازه دهید تا با استفاده از Authorize که در مستندات Trello توضیح داده شده است، دسترسی وب سایت شما به Trello API را مجاز کند. از آنجایی که ما در حال توسعه یک برنامه کنسول برای این مقاله هستیم، از لینک Tokenنشان داده شده در تصویر بالا استفاده خواهیم کرد. هنگام تولید یک توکن جدید، باید مجوز دسترسی به بردهای خود را صادر کنید:

 

با کلیک بر روی دکمه Authorize  در پایین صفحه، یک توکن جدید ایجاد می شود:

 

 

با وجود کلید و توکن API، آماده شروع یکپارچه سازی هستیم. یک برنامه کنسول جدید ایجاد کنید. برای این نسخه آزمایشی، ما از یک برنامه دات نت 6 استفاده می کنیم:

dotnet new console

ما همچنین تمام بسته‌های NuGet را که نیاز داریم نصب می‌کنیم:

dotnet add package Microsoft.Extensions.Hosting
dotnet add package Microsoft.Extensions.Http
dotnet add package Spectre.Console
dotnet add package System.Net.Http.Json

پکیج Microsoft.Extensions.Hosting برای پیکربندی host builder مورد نیازاست

پکیج Microsoft.Extensions.Http به عنوان راهی برای پیکربندی موارد HttpClient مورد نیاز برای برقراری ارتباط با API عمل خواهد کرد

 پکیج Spectre.Console مقداری "UI" ایجاد می کند.(این پکیج جذاب را حتما نصب کنید و همچنین میتوانید به این  لینک مراجعه کنید.)

 پکیج System.Net.Http.Json یک راه مناسب برای مپ کردن (serialize و deserialize) response ها به اشیاء (Object Model) است.

بیایید با پیکربندی وابستگی ها شروع کنیم:

var host = Host
    .CreateDefaultBuilder(args)
    .ConfigureServices((_, services) =>
    {
        services.AddHttpClient("trello", options =>
        {
            options.BaseAddress = new Uri("https://api.trello.com/1/");
            options.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue(
                    "OAuth",
                    "oauth_consumer_key=\"API_KEY\", oauth_token=\"TOKEN\"");
        });
    })
    .Build();

اگر با ASP.NET Core آشنا هستید، کد بسیار ساده خواهد بود. ما از سازنده (Constructor) برای پیکربندی جدید استفاده می کنیم HttpClient  آدرس پایه روی API REST Trello تنظیم می شود و کلید API و توکن تولید شده در مراحل قبل به عنوان هدر مجوز برای همه request ها تنظیم می شود. شما باید مقادیر ایجاد شده در حساب Trello خود را جایگزین API_KEY و TOKEN آن کنید.

 

و در ادامه ارتباط با Trello API را برقرار میکنیم:

 

var httpClientFactory = host.Services.GetRequiredService<IHttpClientFactory>();
var httpClient = httpClientFactory.CreateClient("trello");

 

برای تست کوچکی از لیست API های ترلو یک برنامه کوچک را کدنویسی می‌کنیم که بتواند card را انتخاب کند و آن را ببندد. با گرفتن لیستی از board ها شروع کنیم ولی برای دسترسی به دیگر API های ترلو این  لینک را حتما مطالعه کنید.

var boards = await httpClient.GetFromJsonAsync<List<TrelloIdAndName>>($"members/me/boards");

 

این API لیستی از board ها را به ما میدهد که میخواهیم یک مورد را انتخاب کنیم برای این کار کلاس مدل ساده ایجاد میکنیم که در کد بالا به نام TrelloIdAndName قراردارد.

 

internal class TrelloIdAndName
{
    public string Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

 

بعد از اینکه لیست board ها را مشاهده کردید با استفاده از پکیج Spectre.Console امکان انتخاب از لیست را فراهم میکنیم.

 

var selectedBoard = AnsiConsole.Prompt(
    new SelectionPrompt<TrelloIdAndName>()
        .Title("Select board")
        .PageSize(10)
        .AddChoices(boards));
var selectedBoardId = selectedBoard.Id;

 

بیایید کد را اجرا کنیم:

 

خب همانور که در تصویر مشاهده میکنید اتصال ما به ترلو و همچنین لیست بورد هایمان با موفقیت انجام شده است حال میتوانیم یک مورد را انتخاب کنیم تا لیست card های آن board را مشاهده کنیم و یک cart را انتخاب که کد آن به صورت زیر است:

 

var lists = await httpClient.GetFromJsonAsync<List<TrelloIdAndName>>($"boards/{selectedBoardId}/lists");

var selectedList = AnsiConsole.Prompt(
    new SelectionPrompt<TrelloIdAndName>()
        .Title("Select list")
        .PageSize(10)
        .AddChoices(lists));
var selectedListId = selectedList.Id;

var cards = await httpClient.GetFromJsonAsync<List<TrelloIdAndName>>($"lists/{selectedListId}/cards");

var selectedCard = AnsiConsole.Prompt(
    new SelectionPrompt<TrelloIdAndName>()
        .Title("Select card")
        .PageSize(10)
        .AddChoices(cards));
var selectedCardId = selectedCard.Id;

 

کد تقریباً از همان ساختاری پیروی می کند که هنگام request به board نوشتیم. ما در حال دریافت card ها در داخل board انتخاب شده هستیم. سپس به کاربر اجازه میدهیم card موجود در لیست انتخاب شده را انتخاب کند و خروجی بگیرد.

برای دریافت جزئیات کارت انتخاب شده، یک کلاس مدل جدید ایجاد می کنیم:

 

internal class TrelloCard
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Desc { get; set; }
}

 

مانند گذشته، ما فقط ویژگی هایی را که برای این نمونه نیاز دارم، ترسیم می کنیم. هر card حاوی طیف وسیعی از ویژگی ها است که از Trello API بازگردانده می شود.

جزئیات card را دریافت کنید و آنها را در جدولی ارائه دهید:

 

var card = await httpClient.GetFromJsonAsync<TrelloCard>($"cards/{selectedCardId}");

var table = new Table();
table.HideHeaders();
table.AddColumn("");
table.AddRow(card.Name);
table.AddRow(new Panel(card.Desc));

AnsiConsole.Write(table);

 

کد بالا این UI را در کنسول تولید می کند:

 

 

مرحله آخر این است که به کاربر اجازه دهیم card را ببندد برای این کار:

 

if (AnsiConsole.Confirm("Close it?"))
{
    await httpClient.PutAsync($"cards/{card.Id}?closed=true", null);
}

 

اگر کاربر بسته شدن را تایید کند، API بالا اجرا میشود و card بسته می شود. کل جلسه به این شکل است:

 

 

شما میتوانید به راحتی تمام API های ترلو را استفاده کنید و مدیریت خوبی روی board ها و همه فعالیت هایی که لازم است داشته باشید 

امیدواریم از مطلالعه این مقاله لذت برده باشید و براتون مفید بوده باشه.