Tham khảo:
Tạo mới project dạng ASP.NET Core Web API
Default tick chọn sẵn Enable OpenAPI support để tự động cấu hình Swagger.
Sau đó chạy project sẽ thấy WeatherForcast GET API sẵn có.
Tạo các API liên quan tới người dùng và lưu trữ dữ liệu tĩnh:
GET /users ==> Lấy tất cả
GET /users/{id} ==> Lấy theo id
POST /users ==> Tạo mới
PUT /users/{id} ==> Sửa thông tin người dùng theo id
DELETE /users/{id} ==> Xóa thông tin người dùng theo id
Để đơn giản, định nghĩa các model tương ứng:
public class UserModel
{
public string UserName { get; set; }
public string Password { get; set; }
}
public class User : UserModel
{
public Guid Id { get; set; }
}
trong đó UserModel dùng để tạo mới người dùng, Id sẽ tự sinh ra.
Tạo mới API Controller empty có tên UsersController
namespace MyAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
public static List<User> Users = new List<User>();
}
}
trong đó biến Users dạng static lưu danh sách User. Bạn có thể kết nối trực tiếp đến database để lấy và thay đổi data.
API lấy tất cả người dùng (GET)
[HttpGet]
public IActionResult GetAll()
{
return Ok(Users);
}
API tạo mới người dùng (POST)
[HttpPost]
public IActionResult CreateNew(UserModel model)
{
//kiểm tra username trùng
var existedUser = Users.SingleOrDefault(p => p.UserName == model.UserName);
if (existedUser != null)
{
return Ok(new {
Success = false,
Message = $"User {model.UserName} đã tồn tại"
});
}
var user = new User
{
Id = Guid.NewGuid(),
UserName = model.UserName,
Password = model.Password
};
Users.Add(user);
return Ok(new { Success = true, Data = user });
}
trong đó có kiểm tra username có trùng không. Dù có hay không API vẫn trả về status = 200 nhưng nội dung trả về có field success = true/false
API lấy người dùng theo id (GET)
[HttpGet("{id}")]
public IActionResult GetById(Guid id)
{
var existedUser = Users.SingleOrDefault(p => p.Id == id);
if(existedUser == null)
{
return NotFound();
}
return Ok(existedUser);
}
API cập nhật thông tin người dùng theo id (PUT)
[HttpPut("{id}")]
public IActionResult UpdateById(Guid id, User model)
{
if (id != model.Id)
{
return Ok(new
{
Success = false,
Message = $"{id} không khớp"
});
}
for (int i = 0; i < Users.Count; i++)
{
if (Users[i].Id == id)
{
Users[i] = model;
break;
}
}
return Ok(model);
}
Tương tự SV thử viết API cho trường hợp DELETE và API tìm người dùng theo các tiêu chí.
Sau đó chuyển các thông tin người dùng vô database để lưu trữ.
Thử tạo API Controller with action using Entity Framework
Thực hiện các thao tác CRUD trên các API tương ứng.
GET /api/Loais
GET /api/Loais/{id}
POST /api/Loais
PUT /api/Loais/{id}
DELETE /api/Loais/{id}
Muốn có Swagger thì phải khai báo sử dụng
1/ Cài thư viện: Swashbuckle.AspNetCore
2/ Mở file Program.cs khai báo và sử dụng:
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
Sau đó mở web lên gõ https://host:post/swagger để xem swagger.
Tham khảo:
Thêm cấu hình trong appsettings.json:
"JWT": {
"ValidAudience": "User",
"ValidIssuer": "https://localhost:7014",
"Secret": "ThisIsTheSecureKey1234567890"
}
Thêm cấu hình Program.cs:
builder.Services.AddCors(options => options.AddDefaultPolicy(policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
builder.Services.AddAuthentication(options => {
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = builder.Configuration["JWT:ValidAudience"],
ValidIssuer = builder.Configuration["JWT:ValidIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Secret"]))
};
});
SignInModel:
public class SignInModel
{
[Required, EmailAddress]
public string Email { get; set; } = null!;
[Required]
public string Password { get; set; } = null!;
}
Hàm xử lý đăng nhập:
public async Task<string> SignInAsync(SignInModel model)
{
var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);
if (!result.Succeeded)
{
return string.Empty;
}
var authClaims = new List<Claim>
{
new Claim(ClaimTypes.Email, model.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var authenKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JWT:Secret"]));
var token = new JwtSecurityToken(
issuer: configuration["JWT:ValidIssuer"],
audience: configuration["JWT:ValidAudience"],
expires: DateTime.Now.AddMinutes(20),
claims: authClaims,
signingCredentials: new SigningCredentials(authenKey, SecurityAlgorithms.HmacSha512Signature)
);
return new JwtSecurityTokenHandler().WriteToken(token);
}