Xây dựng service cho ứng dụng mobile với ASP.Net Core
Bài đăng này đã không được cập nhật trong 3 năm
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
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
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);
}
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();
}
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();
}
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