+1

Xây dựng service cho ứng dụng mobile với ASP.Net Core

Tạo một ứng dụng ASP.Net Core

Tạo một ứng dụng ASP.NET Core trong Visual Studio. Chọn Web API và chọn No Authentication

web-api-template.png

Chúng ta sẽ thay đổi cổng mặc định thành 5000 trong file Program.cs như sau:

var host = new WebHostBuilder()
    .UseKestrel()
    .UseUrls("http://*:5000")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

Tạo model ToDoItem

using System.ComponentModel.DataAnnotations;

namespace ToDoApi.Models
{
    public class ToDoItem
    {
        [Required]
        public string ID { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Notes { get; set; }

        public bool Done { get; set; }
    }
}

Tiếp đến chúng ta tạo class interface IToDoRepository

using System.Collections.Generic;
using ToDoApi.Models;

namespace ToDoApi.Interfaces
{
    public interface IToDoRepository
    {
        bool DoesItemExist(string id);
        IEnumerable<ToDoItem> All { get; }
        ToDoItem Find(string id);
        void Insert(ToDoItem item);
        void Update(ToDoItem item);
        void Delete(string id);
    }
}

Viết code triển khai cho các hàm trong IToDoRepository

using System.Collections.Generic;
using System.Linq;
using ToDoApi.Interfaces;
using ToDoApi.Models;

namespace ToDoApi.Services
{
    public class ToDoRepository : IToDoRepository
    {
        private List<ToDoItem> _toDoList;

        public ToDoRepository()
        {
            InitializeData();
        }

        public IEnumerable<ToDoItem> All
        {
            get { return _toDoList; }
        }

        public bool DoesItemExist(string id)
        {
            return _toDoList.Any(item => item.ID == id);
        }

        public ToDoItem Find(string id)
        {
            return _toDoList.FirstOrDefault(item => item.ID == id);
        }

        public void Insert(ToDoItem item)
        {
            _toDoList.Add(item);
        }

        public void Update(ToDoItem item)
        {
            var todoItem = this.Find(item.ID);
            var index = _toDoList.IndexOf(todoItem);
            _toDoList.RemoveAt(index);
            _toDoList.Insert(index, item);
        }

        public void Delete(string id)
        {
            _toDoList.Remove(this.Find(id));
        }

        private void InitializeData()
        {
            _toDoList = new List<ToDoItem>();

            var todoItem1 = new ToDoItem
            {
                ID = "6bb8a868-dba1-4f1a-93b7-24ebce87e243",
                Name = "Learn app development",
                Notes = "Attend Xamarin University",
                Done = true
            };

            var todoItem2 = new ToDoItem
            {
                ID = "b94afb54-a1cb-4313-8af3-b7511551b33b",
                Name = "Develop apps",
                Notes = "Use Xamarin Studio/Visual Studio",
                Done = false
            };

            var todoItem3 = new ToDoItem
            {
                ID = "ecfa6f80-3671-4911-aabe-63cc442c1ecf",
                Name = "Publish apps",
                Notes = "All app stores",
                Done = false,
            };

            _toDoList.Add(todoItem1);
            _toDoList.Add(todoItem2);
            _toDoList.Add(todoItem3);
        }
    }
}

Dữ liệu chúng ta tạm fix cứng với hàm InitializeData. Sau đó cấu hình sử dụng class đó trong file Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddSingleton<IToDoRepository,ToDoRepository>();
}

Tạo Controller

Thêm một controller mới có tên là ToDoItemsController. Sử dụng thuộc tính Route để handle các request có đường dẫn bắt đầu với api/todoitems

Chúng ta dùng phương pháp dependency injection để sử dụng IToDoRepository

using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ToDoApi.Interfaces;
using ToDoApi.Models;

namespace ToDoApi.Controllers
{
    [Route("api/[controller]")]
    public class ToDoItemsController : Controller
    {
        private readonly IToDoRepository _toDoRepository;

        public ToDoItemsController(IToDoRepository toDoRepository)
        {
            _toDoRepository = toDoRepository;
        }

API này hỗ trợ 4 phương thức HTTP khác nhau để thao tác với dữ liệu: CRUD (Create, Read, Update, Delete)

Đọc dữ liệu

Khi đọc dữ liệu chúng ta nên dùng [HttpGet]

[HttpGet]
public IActionResult List()
{
    return Ok(_toDoRepository.All);
}

Phương thức này sẽ trả về 200 OK và danh sách ToDoItem với kiểu dữ liệu là JSON. Để test bạn có thể dụng dụng 1 công cụ là Postman postman-get.png

Tạo dữ liệu

Chúng ta sẽ dùng [HttpPost] với API tạo dữ liệu. Khi tạo dữ liệu chúng ta sẽ kiểm tra hợp lệ dữ liệu với lệnh ModelState.IsValid. Các ràng buộc hợp lệ dữ liệu này đã được quy định ở file model

[HttpPost("{id}")]
public IActionResult Create(string id, [FromBody]ToDoItem item)
{
    try
    {
        if (item == null || !ModelState.IsValid)
        {
            return BadRequest(ErrorCode.TodoItemNameAndNotesRequired.ToString());
        }
        bool itemExists = _toDoRepository.DoesItemExist(item.ID);
        if (itemExists)
        {
            return StatusCode(StatusCodes.Status409Conflict, ErrorCode.TodoItemIDInUse.ToString());
        }
        _toDoRepository.Insert(item);
    }
    catch (Exception)
    {
        return BadRequest(ErrorCode.CouldNotCreateItem.ToString());
    }
    return Ok(item);
}

postman-post.png

Cập nhập dữ liệu

Sử dụng [HttpPut] với phương thức cập nhật dữ liệu. Nếu không tìm thấy đối tượng cần sửa thì sẽ trả về NotFound (404)

[HttpPut("{id}")]
public IActionResult Edit(string id, [FromBody] ToDoItem item)
{
    try
    {
        if (item == null || !ModelState.IsValid)
        {
            return BadRequest(ErrorCode.TodoItemNameAndNotesRequired.ToString());
        }
        var existingItem = _toDoRepository.Find(id);
        if (existingItem == null)
        {
            return NotFound(ErrorCode.RecordNotFound.ToString());
        }
        _toDoRepository.Update(item);
    }
    catch (Exception)
    {
        return BadRequest(ErrorCode.CouldNotUpdateItem.ToString());
    }
    return NoContent();
}

postman-put.png

Xóa dữ liệu

Sử dụng [HttpDelete] với phương thức xóa dữ liệu. Nếu xóa thành công sẽ trả về NoContent (204), ngược lại nếu không tìm thấy đối tượng cần xóa sẽ trả về NotFound (404)

[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
    try
    {
        var item = _toDoRepository.Find(id);
        if (item == null)
        {
            return NotFound(ErrorCode.RecordNotFound.ToString());
        }
        _toDoRepository.Delete(id);
    }
    catch (Exception)
    {
        return BadRequest(ErrorCode.CouldNotDeleteItem.ToString());
    }
    return NoContent();
}

postman-delete.png

Như vậy chúng ta đã tạo xong 1 service cho các ứng dụng mobile với ASP.Net Core 😃


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí