اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
پنج دقیقه
در قسمت قبل، ایجاد کردن Mutationها را در GraphQL تمام کردیم. در این قسمت تصمیم بر این است که از GraphQL API در یک برنامه ASP.NET Core استفاده کنیم. برای فراخوانی GraphQL API در یک برنامه ASP.NET Core، از یک کتابخانه ثالث که به ما در این فرآیند کمک میکند استفاده خواهیم کرد.
Preparing the ASP.NET Core Client Project
کار را با ایجاد کردن یک پروژه ASP.NET Core Web API شروع میکنیم :
dotnet new api -n DotNetGraphQLClient
به محض اینکه پروژه را ایجاد کردیم فایل launchsettings.json را باز میکنیم و مقدار خصوصیت launchBrowser را به false و خصوصیت applicationUrl را به
https://localhost:5003;http://localhost:5004
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "GraphQLURI": "https://localhost:5001/graphql", "AllowedHosts": "*" }
اکنون میتوانیم کتابخانه مورد نیاز را نصب کنیم. در ترمینال مربوط به VS Code دستور زیر را وارد کنید:
dotnet add package GraphQL.Client
public void ConfigureServices(IServiceCollection services) { services.AddScoped(x => new GraphQL.Client.GraphQLClient(Configuration["GraphQLURI"])); ... }
در سازنده کلاس GraphQLClient، آدرس endpoint را معرفی میکنیم (که در فایل appsettings.json می باشد) .
قدم بعد، ایجاد کردن یک کلاس به نام OwnerConsumer است که عملیات مربوط به فراخوانی API، در این کلاس میباشد.
public class OwnerConsumer { private readonly GraphQL.Client.GraphQLClient _client; public OwnerConsumer(GraphQL.Client.GraphQLClient client) { _client = client; } }
سپس کلاس ایجاد شده را در متد ConfigureServices از کلاس Startup ثبت میکنیم:
public void ConfigureServices(IServiceCollection services) { services.AddScoped(x => new GraphQL.Client.GraphQLClient(Configuration["GraphQLURI"])); services.AddScoped<OwnerConsumer>(); ... }
Creating Model Classes
در قسمت اول تعدادی کلاس را در پوشه Models ایجاد کردیم. همه آن کلاسها را برای این client application نیاز داریم؛ پس آنها را ایجاد میکنیم:
public enum TypeOfAccount { Cash, Savings, Expense, Income }
public class Account { public Guid Id { get; set; } public TypeOfAccount Type { get; set; } public string Description { get; set; } }
public class Owner { public Guid Id { get; set; } public string Name { get; set; } public string Address { get; set; } public ICollection<Account> Accounts { get; set; } }
در قسمت سوم ( GraphQL Mutation ) یک کلاس Input type را برای اکشنهای Mutation ایجاد کردیم. این کلاس هم مورد نیاز میباشد. پس آن را ایجاد میکنیم:
public class OwnerInput { public string Name { get; set; } public string Address { get; set; } }
Creating Queries and Mutations to Consume GraphQL API
کلاس OwnerConsumer را باز میکنیم و متد GetAllOwners را به آن اضافه میکنیم:
public async Task<List<Owner>> GetAllOwners() { var query = new GraphQLRequest { Query = @" query ownersQuery{ owners { id name address accounts { id type description } } }" }; var response = await _client.PostAsync(query); return response.GetDataFieldAs<List<Owner>>("owners"); }
در ابتدا یک شیء جدید از نوع GraphQLRequest را ایجاد میکنیم که شامل خصوصیت Query که برای ارسال queryی که میخواهیم به GraphQL API ارسال کنیم، میباشد. این query مثل همانی که در ابزار UI.Playground اجرا کردیم، میباشد. جهت اجرای این query، متد PostAsync را فراخوانی میکنیم که یک پاسخ را برگشت میدهد. در نهایت میتوان نتیجه را تبدیل به نوع مورد نیاز، با استفاده از متد GetDataFieldsAs کرد.
توجه کنید که آرگومان متد GetDataFieldAs باید با نام query مطابقت داشته باشد .
Implementing a Controller
یک کنترلر جدید را به نام OwnerController ایجاد میکنیم و آن را مطابق زیر ویرایش میکنیم:
[Route("api/owners")] public class OwnerController: Controller { private readonly OwnerConsumer _consumer; public OwnerController(OwnerConsumer consumer) { _consumer = consumer; } [HttpGet] public async Task<IActionResult> Get() { var owners = await _consumer.GetAllOwners(); return Ok(owners); } }
مثال ضمیمه شده در پایان قسمت قبل را اجرا کنید که بر روی پورت 5001 میباشد و سپس پروژه را اجرا کنید ( بر روی پورت 5003 است ).
اکنون میتوانیم آن را در Postman تست کنیم.
جهت بازیابی تمامی owner ها، در خواست زیر را در Postman صادر کنید:
جهت ایجاد یک owner جدید، کلاس OwnerConsumer را مطابق زیر ویرایش میکنیم ( اضافه کردن متد CreateOwner ) :
public async Task<Owner> CreateOwner(OwnerInput ownerToCreate) { var query = new GraphQLRequest { Query = @" mutation($owner: ownerInput!){ createOwner(owner: $owner){ id, name, address } }", Variables = new { owner = ownerToCreate } }; var response = await _client.PostAsync(query); return response.GetDataFieldAs<Owner>("createOwner"); }
[HttpPost] public async Task<IActionResult> PostItem([FromBody]OwnerInput model) { var result = await _consumer.CreateOwner(model); return Json(result); }
اکنون، در خواست ایجاد یک owner جدید را در Postman به صورت زیر صادر میکنیم:
همانطور که مشخص است، همه چیز به درستی کار میکند. شما میتوانید مابقی Query و Mutation ها را با استفاده از Postman تست کنید.
نتیجه گیری
در این قسمت یادگرفتیم که چگونه :
- یک کلاینت ASP.NET Core را برای فراخوانی GraphQL API آماده سازی کنیم.
- چه کتابخانههایی مورد نیاز است که میتوانند به ما در انجام فرآیند فراخوانی GraphQL API کمک کنند.
- ایجاد کردن queryها و mutationها در یک کلاینت ASP.NET Core.
کدهای کامل این قسمت را از اینجا دریافت کنید: DotNetGraphQLClient_4.zip
کدهای کامل قسمت قبل را میتوانید از اینجا دریافت کنید: ASPCoreGraphQL_3.rar