پیاده سازی Web API در ASP.NET Core

پنجشنبه 4 آذر 1395

در این مقاله قصد داریم پیاده سازی Web API را به شما آموزش دهیم و آن را بر روی نسخه جدید ASP.NET یعنی ASP.NET Core پیاده سازی کنیم و تفاوت آن را با نسخه قبلی شرح دهیم .

پیاده سازی Web API در ASP.NET Core

پیاده سازی Web API در ASP.NET Core مانند پیاده سازی آن در ASP.NET MVC می باشد تنها کمی تفاوت دارند.

تفاوت های آن ها را در زیر خلاصه کرده ایم :

-Web API یک فریم ورک جداگانه نیست و آن در ASP.NET Core MVC ادغام شده است.

-اوایل کلاس Web API از کلاس پایه ApiController ارث بری می کرد . اما در ASP.NET Core از کلاس Controller ارث بری می کند.

-از آنجا که Web API از Controller ارث بری می کند،  میتوان از اکشن متد های زیادی استفاده کنید.البته برای ایجاد سرویس REST به  اکشن های Get(), Post(), Put(), نیاز دارید.

همچنین میتوان افعال HTTP  را بر روی اکشن ها تعریف کنید. برای این کار میتوان از صفت های [HttpPost],[HttpPut],[HttpDelete], استفاده کنید.

در این قسمت میخواهیم با استفاده از Web API یک مثال ساده از REST ایجاد کنیم که عملیات CURD را انجام می دهد.

یک پروژه جدید از نوع ASP.NET Core ایجاد کنید و در قسمت Template ، Web API را انتخاب کنید. 

پروژه ایجاد شده شامل یک کنترلر به نام ValueController می باشد . توجه داشته باشید که این کنترلر از کلاس Controller ارث بری کرده است.

نام آن را به CustomerServiceController تغییر دهید. برای ارتباط با بانک اطلاعاتی  نیاز از پکیج مربوط به Entity Framework Core را از Nuget  دریافت کنیم . قطعه کد زیر را در فایل Project.Json و در قسمت dependencies وارد کنید:

....
"Microsoft.EntityFrameworkCore": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1"
....

کلاس Statup را باز کنید و تغییرات زیر را بر روی آن اعمال کنید :

public class Startup
{
    public void ConfigureServices
           (IServiceCollection services)
    {
        services.AddMvc();
        services.AddEntityFrameworkSqlServer();
    }

    public void Configure
               (IApplicationBuilder app)
    {
        app.UseStaticFiles();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}
                           /{action=Index}
                           /{id?}");
        });
    }
}

در متد ConfigureService() ، MVC و Entity Framework Core  را به مجموعه سرویس ها اضافه می کنیم . در متد Configur()  MVC Routing را پیکربندی می کنیم. این Route برای Web API نیاز نمی شود اما برای استفاده از Local نیاز است یک پوشه به نام Model  به پروژه اضافه کنید و مدل زیر را به آن اضافه کنید :

[Table("Customers")]
public class Customer
{
    [Key]
    public string CustomerID { get; set; }
    public string CompanyName { get; set; }
    public string ContactName { get; set; }
    public string Country { get; set; }
}

بر روی کلاس Customer یک صفت به نام Table قرار دارد که نشان دهنده نام جدول در بانک اطلاعاتی می باشد و بروی خاصیت CustomerID صفت Key قرار دارد که آن را به عنوان کلید اصلی معرفی می کند.

سپس کلاس ApplicationDbContext را اضافه می کنیم و کد های زیر را در آن وارد می کنیم :

namespace App.Models
{
    using Microsoft.EntityFrameworkCore;

    public class ApplicationDbContext : DbContext
    {
        public DbSet<Customer> Customers { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("data source=.;initial catalog=CoreAppDb;integrated security = true");
        }
    }
}

کلاس ApplicationDbContext  برای دسترسی به داده از کلاس DbContext ارث بری می کند. در این کلاس یک DbSet به نام  Customers  تعریف شده است.

متد OnConfiguring()  با مشخص کردن Connection String ،  DbContext را برای استفاده از بانک اطلاعاتی  پیکربندی می کند . برای این که به خطا بر خورد نکنید از صحیح بودن Connection string خود اطمینان حاصل کنید.

حال CustomerServiceController را باز کنید و کد ها زیر را در آن وارد کنید.

namespace App.Controllers
{
    using System.Collections.Generic;
    using System.Linq;

    using App.Models;

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;

    [Route("Api/[controller]")]
    public class CustomerServiceController : Controller
    {
        [HttpGet]
        public List<Customer> Get()
        {
            using (ApplicationDbContext db =
                   new ApplicationDbContext())
            {
                return db.Customers.OrderBy(
                       i => i.CustomerId).ToList();
            }
        }

        [HttpGet("{id}")]
        public IActionResult Get(int id)
        {
            using (ApplicationDbContext db =
                    new ApplicationDbContext())
            {
                var data = db.Customers.SingleOrDefault(i => i.CustomerId == id);
                if (data == null)
                {
                    return NotFound("شناه شما معتبر نمی باشد.");
                }

                return new ObjectResult(data);
            }
        }

        [HttpPost]
        public string Post([FromBody]Customer obj)
        {
            using (ApplicationDbContext db =
                   new ApplicationDbContext())
            {
                db.Customers.Add(obj);
                db.SaveChanges();
                return "افزودن اطلاعات با موفقیت انجتم شد.";
            }
        }

        [HttpPut("{id}")]
        public IActionResult Put(string id, [FromBody] Customer obj)
        {
            using (ApplicationDbContext db =
                   new ApplicationDbContext())
            {
                db.Entry(obj).State = EntityState.Modified;
                db.SaveChanges();
                return new ObjectResult("ویرایش اطلاعات با موفقیت انجام شد.");
            }
        }

        [HttpDelete("{id}")]
        public string Delete(int id)
        {
            using (ApplicationDbContext db =
                   new ApplicationDbContext())
            {
                var obj = db.Customers.SingleOrDefault(i => i.CustomerId == id);
                db.Customers.Remove(obj);
                db.SaveChanges();
                return "حذف اطلاعات با موفقیت انجام شد.";
            }
        }
    }
}

توضیح Web API ایجاد شده :

-برروی CustomerServiceController یک صفت به نام [Route] برای پیکربندی Routing برای Web Api قرار دارد. با استفاده از این Route این کنترلر با نام /api  همراه است. مثال :  api/CustomerServic .

-Web API شامل پنج متد با نام های Get(), Get(id),Post(),Put(),Delete() می باشد.

-افعال HTTP را میتوان با استفاده از صفت های [HttpGet],[HttpPost],[HttpDelete],[HttpPost] برروی اکشن ها تعریف کرد.

پارامتر Customer در اکشن های مدل را با استفاده از صفت [FormBody]  قید می کند. و مشخص می کند که درخواست از Body فرستاده شده است.

همچنین این صفت ها، هرجا که نیاز به پارامتر id باشد آن را مشخص می کنند.

در این مقاله قصد بررسی جزئیات کد Entity Framework Core را نداریم. اکشن های موجود در این کنترلر عملیات CURD را بر روی جدول Customers انجام می دهند.

تا این قسمت از کار کنترلر ما کامل شده است. حال برنامه را اجرا می کنیم. خروجی آن را میتوان در شکل زیر مشاهده کنید که

شی Customer با فرمت Json نمایش داده می شود.

Return شدن IActionResult و HTTP Status Code

در مثال قبلی  اکشن ها  نوع مشخص شده را Return می کردند مانند: List<Customer> .ممکن است شما بخوهید این اکشن ها را از طریق IActionResult فراخوانی کنید. این روش به صورت دستی HTTP status code و مقدار آن را بازمیگرداند.

استفاده از آن روش در متد Put() :

[HttpPut("{id}")]
        public IActionResult Put(string id, [FromBody] Customer obj)
        {
            using (ApplicationDbContext db =
                   new ApplicationDbContext())
            {
                db.Entry(obj).State = EntityState.Modified;
                db.SaveChanges();
                return new ObjectResult("ویرایش اطلاعات با موفقیت انجام شد.");
            }
        }

متد Put()   به جای string، IActionResult بازمیگرداند. درون کد یک ObjectResult جدید ایجاد کرده ایم. که یک شی با مقدار string بازمیگرداند. ObjectResult  ، HTTP Status Code را بر روی 200 قرار می دهد.  اگر میخواهید  محتوای خالی را بازگردانید میتوان از NoContentResult استفاده کنید. NoContentResult، HTTP Status Code را بر روی 200 قرار می دهد.

اجزای دیگر :

Ok() : HTTP Status Code  را بر روی 200 قرار می دهد.

BadRequest() : HTTP Status Code  را بر روی 400 قرار می دهد.

NotFound() : HTTP Status Code  را بر روی 404 قرار می دهد.

در متد Get(id) از NotFound() استفاده شده است :


        [HttpGet("{id}")]
        public IActionResult Get(int id)
        {
            using (ApplicationDbContext db =
                    new ApplicationDbContext())
            {
                var data = db.Customers.SingleOrDefault(i => i.CustomerId == id);
                if (data == null)
                {
                    return NotFound("شناه شما معتبر نمی باشد.");
                }

                return new ObjectResult(data);
            }
        }

کد بالا چک می کند که مقدار data، خالی است یا خیر. و در صورت خالی بودن متد NotFound() با یک پیام سفارشی بازگردانده می شود.

آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید