Pinned Post

Hướng dẫn: Gọi API web ASP.NET Core bằng JavaScript

Hướng dẫn này trình bày cách gọi API web ASP.NET Core bằng JavaScript, sử dụng Fetch API . Điều kiện tiên quyết Hướng dẫn đầy đủ : Tạo API web Có kiế…
Hướng dẫn: Gọi API web ASP.NET Core bằng JavaScript

Hướng dẫn: Tạo API web dựa trên bộ điều khiển với ASP.NET Core

 Bài hướng dẫn này sẽ dạy bạn những kiến ​​thức cơ bản về xây dựng API web dựa trên controller sử dụng cơ sở dữ liệu. Một cách tiếp cận khác để tạo API trong ASP.NET Core là tạo API tối giản (Minimal API ). Để được trợ giúp trong việc lựa chọn giữa API tối giản và API dựa trên controller, hãy xem Tổng quan về API . Để xem hướng dẫn về cách tạo API tối giản, hãy xem Hướng dẫn: Tạo API tối giản với ASP.NET Core .

Tổng quan

Hướng dẫn này tạo ra API sau:

APISự miêu tảNội dung yêu cầuCơ quan phản hồi
GET /api/todoitemsNhận tất cả các mục cần làmKhông cóMảng các mục cần làm
GET /api/todoitems/{id}Tìm kiếm mặt hàng theo IDKhông cóMục cần làm
POST /api/todoitemsThêm mục mớiMục cần làmMục cần làm
PUT /api/todoitems/{id}Cập nhật mục hiện có  Mục cần làmKhông có
DELETE /api/todoitems/{id}    Xóa một mục    Không cóKhông có

Sơ đồ sau đây thể hiện thiết kế của ứng dụng.

Máy khách được biểu diễn bằng một ô vuông ở bên trái. Nó gửi yêu cầu và nhận phản hồi từ ứng dụng, một ô vuông được vẽ ở bên phải. Bên trong ô vuông ứng dụng, ba ô vuông đại diện cho bộ điều khiển, mô hình và lớp truy cập dữ liệu. Yêu cầu được chuyển đến bộ điều khiển của ứng dụng, và các thao tác đọc/ghi diễn ra giữa bộ điều khiển và lớp truy cập dữ liệu. Mô hình được tuần tự hóa và trả về cho máy khách trong phản hồi.

Điều kiện tiên quyết

Tạo dự án Web API

  • Từ menu Tệp , chọn Mới > Dự án .
  • Nhập "Web API" vào ô tìm kiếm.
  • Chọn mẫu ASP.NET Core Web API và chọn Tiếp theo .
  • Trong hộp thoại Cấu hình dự án mới của bạn , hãy đặt tên dự án là TodoApi và chọn Tiếp theo .
  • Trong hộp thoại Thông tin bổ sung :
    • Hãy xác nhận Framework đang sử dụng là .NET 9.0 (Hỗ trợ theo Điều khoản Tiêu chuẩn) .
    • Hãy xác nhận rằng ô chọn "Bật hỗ trợ OpenAPI" đã được chọn.
    • Hãy xác nhận rằng ô chọn " Sử dụng bộ điều khiển" (bỏ chọn để sử dụng API tối thiểu) đã được chọn.
    • Chọn Tạo .

Thêm gói NuGet

Cần phải thêm một gói NuGet để hỗ trợ cơ sở dữ liệu được sử dụng trong hướng dẫn này.

  • Từ menu Công cụ , chọn Trình quản lý gói NuGet > Quản lý gói NuGet cho giải pháp .
  • Chọn tab Duyệt .
  • Nhập Microsoft.EntityFrameworkCore.InMemory vào ô tìm kiếm, rồi chọn Microsoft.EntityFrameworkCore.InMemory.
  • Chọn ô Project ở ngăn bên phải rồi chọn Install .

 Ghi chú

Để được hướng dẫn về cách thêm gói vào ứng dụng .NET, hãy xem các bài viết trong phần Cài đặt và quản lý gói tại Quy trình sử dụng gói (tài liệu NuGet) . Xác nhận phiên bản gói chính xác tại NuGet.org .

Thực hiện dự án

Mẫu dự án này tạo ra một WeatherForecastAPI có hỗ trợ OpenAPI .

Nhấn Ctrl+F5 để chạy mà không cần trình gỡ lỗi.

Visual Studio sẽ hiển thị hộp thoại sau khi dự án chưa được cấu hình để sử dụng SSL:

Dự án này được cấu hình để sử dụng SSL. Để tránh cảnh báo SSL trong trình duyệt, bạn có thể chọn tin tưởng chứng chỉ tự ký do IIS Express tạo ra. Bạn có muốn tin tưởng chứng chỉ SSL của IIS Express không?

Chọn  nếu bạn tin tưởng chứng chỉ SSL của IIS Express.

Hộp thoại sau được hiển thị:

hộp thoại cảnh báo bảo mật

Chọn  nếu bạn đồng ý tin tưởng chứng chỉ phát triển.

Để biết thông tin về việc tin tưởng trình duyệt Firefox, hãy xem lỗi chứng chỉ Firefox SEC_ERROR_INADEQUATE_KEY_USAGE .

Visual Studio mở một cửa sổ terminal và hiển thị URL của ứng dụng đang chạy. API được lưu trữ tại https://localhost:<port>, trong đó <port>là một số cổng được chọn ngẫu nhiên khi tạo dự án.

Đầu ra
...
info: Microsoft.Hosting.Lifetime[14]
   Now listening on: https://localhost:7260
info: Microsoft.Hosting.Lifetime[14]
   Now listening on: http://localhost:7261
info: Microsoft.Hosting.Lifetime[0]
   Application started. Press Ctrl+C to shut down.
...

CtrlNhấp vào URL HTTPS trong kết quả để kiểm tra ứng dụng web trong trình duyệt. Không có điểm cuối nào tại đó https://localhost:<port>, vì vậy trình duyệt trả về lỗi HTTP 404 Not Found .

Thêm đoạn mã này /weatherforecastvào URL để kiểm tra API WeatherForecast. Trình duyệt sẽ hiển thị dữ liệu JSON tương tự như ví dụ sau:

JSON
[
    {
        "date": "2025-07-16",
        "temperatureC": 52,
        "temperatureF": 125,
        "summary": "Mild"
    },
    {
        "date": "2025-07-17",
        "temperatureC": 36,
        "temperatureF": 96,
        "summary": "Warm"
    },
    {
        "date": "2025-07-18",
        "temperatureC": 39,
        "temperatureF": 102,
        "summary": "Cool"
    },
    {
        "date": "2025-07-19",
        "temperatureC": 10,
        "temperatureF": 49,
        "summary": "Bracing"
    },
    {
        "date": "2025-07-20",
        "temperatureC": -1,
        "temperatureF": 31,
        "summary": "Chilly"
    }
]

Kiểm tra dự án

Hướng dẫn này sử dụng Endpoints Explorer và các tệp .http để kiểm tra API.

Thêm một lớp mô hình

Mô hình là một tập hợp các lớp đại diện cho dữ liệu mà ứng dụng quản lý. Mô hình của ứng dụng này là TodoItemlớp .

  • Trong Solution Explorer , nhấp chuột phải vào dự án. Chọn Add > New Folder . Đặt tên cho thư mục Models.
  • Nhấp chuột phải vào Modelsthư mục và chọn Thêm > Lớp . Đặt tên cho lớp là TodoItem và chọn Thêm .
  • Hãy thay thế đoạn mã mẫu bằng đoạn mã sau:
C#
namespace TodoApi.Models;

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}

Thuộc tính này Idđóng vai trò là khóa duy nhất trong cơ sở dữ liệu quan hệ.

Các lớp mô hình có thể được đặt ở bất kỳ đâu trong dự án, nhưng Modelsthư mục này được sử dụng theo quy ước.

Thêm ngữ cảnh cơ sở dữ liệu

Ngữ cảnh cơ sở dữ liệu là lớp chính điều phối các chức năng của Entity Framework cho một mô hình dữ liệu. Lớp này được tạo ra bằng cách kế thừa từ lớp Microsoft.EntityFrameworkCore.DbContext .

  • Nhấp chuột phải vào Modelsthư mục và chọn Thêm > Lớp . Đặt tên cho lớp là TodoContext và nhấp Thêm .

  • Nhập đoạn mã sau:

    C#
    using Microsoft.EntityFrameworkCore;
    
    namespace TodoApi.Models;
    
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }
    
        public DbSet<TodoItem> TodoItems { get; set; } = null!;
    }
    

Đăng ký ngữ cảnh cơ sở dữ liệu

Trong ASP.NET Core, các dịch vụ như ngữ cảnh cơ sở dữ liệu phải được đăng ký với bộ chứa tiêm phụ thuộc (DI) . Bộ chứa này cung cấp dịch vụ cho các bộ điều khiển.

Cập nhật Program.csvới đoạn mã được đánh dấu sau:

C#
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddOpenApi();
builder.Services.AddDbContext<TodoContext>(opt =>
    opt.UseInMemoryDatabase("TodoList"));

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

Đoạn mã trước đó:

  • Thêm usingcác chỉ thị.
  • Thêm ngữ cảnh cơ sở dữ liệu vào vùng chứa DI.
  • Chỉ định rằng ngữ cảnh cơ sở dữ liệu sẽ sử dụng cơ sở dữ liệu trong bộ nhớ.

Xây dựng giàn giáo cho bộ điều khiển

  • Nhấp chuột phải vào Controllersthư mục.

  • Chọn Thêm > Mục được tạo mới .

  • Chọn API Controller with actions, using Entity Framework , rồi chọn Add .

  • Trong hộp thoại Thêm bộ điều khiển API với các hành động, sử dụng Entity Framework :

    • Chọn TodoItem (TodoApi.Models) trong lớp Model .
    • Chọn TodoContext (TodoApi.Models) trong lớp ngữ cảnh Dữ liệu .
    • Chọn Thêm .

    Nếu thao tác tạo giàn giáo thất bại, hãy chọn Thêm để thử tạo giàn giáo lần thứ hai.

Bước này thêm các gói Microsoft.VisualStudio.Web.CodeGeneration.DesignNuGet Microsoft.EntityFrameworkCore.Toolsvào dự án. Các gói này cần thiết cho việc tạo cấu trúc dự án (scaffolding).

Mã được tạo ra:

  • Đánh dấu lớp bằng [ApiController]thuộc tính này. Thuộc tính này cho biết bộ điều khiển phản hồi các yêu cầu API web. Để biết thông tin về các hành vi cụ thể mà thuộc tính này cho phép, hãy xem Tạo API web với ASP.NET Core .
  • Sử dụng DI để tiêm ngữ cảnh cơ sở dữ liệu ( TodoContext) vào bộ điều khiển. Ngữ cảnh cơ sở dữ liệu được sử dụng trong mỗi phương thức CRUD trong bộ điều khiển.

Các mẫu ASP.NET Core dành cho:

  • Các bộ điều khiển có giao diện người dùng được bao gồm [action]trong mẫu định tuyến.
  • Bộ điều khiển API không được bao gồm [action]trong mẫu định tuyến.

Khi [action]token không có trong mẫu định tuyến, tên hành động (tên phương thức) sẽ không được bao gồm trong điểm cuối. Tức là, tên phương thức liên kết với hành động đó sẽ không được sử dụng trong tuyến đường phù hợp.

Cập nhật phương thức tạo PostTodoItem

Cập nhật câu lệnh return để PostTodoItemsử dụng toán tử nameof :

C#
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{
    _context.TodoItems.Add(todoItem);
    await _context.SaveChangesAsync();

    //    return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
    return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);
}

Đoạn mã trên là một HTTP POSTphương thức, như được chỉ ra bởi [HttpPost]thuộc tính. Phương thức này lấy giá trị từ TodoItemphần thân của yêu cầu HTTP.

Để biết thêm thông tin, hãy xem Định tuyến thuộc tính với các thuộc tính Http[Verb] .

Phương thức CreatedAtAction :

  • Trả về mã trạng thái HTTP 201 nếu thành công. HTTP 201Đây là phản hồi tiêu chuẩn cho một HTTP POSTphương thức tạo tài nguyên mới trên máy chủ.
  • Thêm tiêu đề Location vào phản hồi. LocationTiêu đề này chỉ định URI của mục việc cần làm mới được tạo. Để biết thêm thông tin, hãy xem 10.2.2 201 Created .
  • Tham chiếu đến GetTodoItemhành động tạo LocationURI cho tiêu đề. Từ khóa C# nameofđược sử dụng để tránh mã hóa cứng tên hành động trong lời CreatedAtActiongọi hàm.

Kiểm tra mục cần làm

  • Chọn Xem > Các cửa sổ khác > Trình khám phá điểm cuối .

  • Nhấp chuột phải vào điểm cuối POST và chọn Tạo yêu cầu .

    Menu ngữ cảnh của Endpoints Explorer đang làm nổi bật mục menu Generate Request.

    Một tệp mới được tạo trong thư mục dự án có tên TodoApi.http, với nội dung tương tự như ví dụ sau:

    @TodoApi_HostAddress = https://localhost:49738
    
    POST {{TodoApi_HostAddress}}/api/todoitems
    Content-Type: application/json
    
    {
      //TodoItem
    }
    
    ###
    
    • Dòng đầu tiên tạo ra một biến được sử dụng cho tất cả các điểm cuối.
    • Dòng tiếp theo định nghĩa một yêu cầu POST.
    • Các dòng sau dòng yêu cầu POST xác định các tiêu đề và một chỗ dành cho phần thân yêu cầu.
    • Dòng ba dấu thăng (# ###) là dấu phân định yêu cầu: những gì theo sau nó dành cho một yêu cầu khác.
  • Yêu cầu POST mong đợi một TodoItem. Để định nghĩa việc cần làm, hãy thay thế phần //TodoItembình luận bằng JSON sau:

    JSON
    {
      "name": "walk dog",
      "isComplete": true
    }
    

    Tệp TodoApi.http giờ sẽ trông giống như ví dụ sau, nhưng với số cổng của bạn:

    @TodoApi_HostAddress = https://localhost:7260
    
    Post {{TodoApi_HostAddress}}/api/todoitems
    Content-Type: application/json
    
    {
      "name": "walk dog",
      "isComplete": true
    }
    
    ###
    
  • Khởi chạy ứng dụng.

  • Chọn liên kết "Gửi yêu cầu" nằm phía trên POSTdòng yêu cầu.

    Cửa sổ tệp .http với liên kết chạy được tô sáng.

    Yêu cầu POST được gửi đến ứng dụng và phản hồi được hiển thị trong ngăn Phản hồi .

    Cửa sổ hiển thị tập tin .http với phản hồi từ yêu cầu POST.

Kiểm tra URI tiêu đề vị trí

Kiểm tra ứng dụng bằng cách gọi các GETđiểm cuối (endpoints) từ trình duyệt hoặc sử dụng Endpoints Explorer . Các bước sau đây dành cho Endpoints Explorer .

  • Trong Endpoints Explorer , nhấp chuột phải vào điểm cuối GET đầu tiên và chọn Generate request .

    Nội dung sau đây được thêm vào TodoApi.httptệp:

    GET {{TodoApi_HostAddress}}/api/todoitems
    
    ###
    
  • Chọn liên kết "Gửi yêu cầu" nằm phía trên GETdòng "Yêu cầu mới".

    Yêu cầu GET được gửi đến ứng dụng và phản hồi được hiển thị trong ngăn Phản hồi .

  • Nội dung phản hồi tương tự như JSON sau:

    JSON
    [
      {
        "id": 1,
        "name": "walk dog",
        "isComplete": true
      }
    ]
    
  • Trong Endpoints Explorer , nhấp chuột phải vào endpoint /api/todoitems/{id} GET và chọn Generate request . Nội dung sau sẽ được thêm vào TodoApi.httptệp:

    @id=0
    GET {{TodoApi_HostAddress}}/api/todoitems/{{id}}
    
    ###
    
  • Gán {@id}cho 1(thay vì 0).

  • Chọn liên kết "Gửi yêu cầu" nằm phía trên dòng yêu cầu GET mới.

    Yêu cầu GET được gửi đến ứng dụng và phản hồi được hiển thị trong ngăn Phản hồi .

  • Nội dung phản hồi tương tự như JSON sau:

    JSON
    {
      "id": 1,
      "name": "walk dog",
      "isComplete": true
    }
    

Kiểm tra các phương thức GET

Hai điểm cuối GET được triển khai:

  • GET /api/todoitems
  • GET /api/todoitems/{id}

Phần trước đã trình bày một ví dụ về /api/todoitems/{id}tuyến đường.

Hãy làm theo hướng dẫn POST để thêm một mục việc cần làm khác, sau đó kiểm tra /api/todoitemstuyến đường bằng Swagger.

Ứng dụng này sử dụng cơ sở dữ liệu trong bộ nhớ. Nếu ứng dụng bị dừng và khởi động lại, yêu cầu GET trước đó sẽ không trả về bất kỳ dữ liệu nào. Nếu không có dữ liệu nào được trả về, hãy gửi dữ liệu bằng phương thức POST đến ứng dụng.

Định tuyến và đường dẫn URL

Thuộc tính này [HttpGet]biểu thị phương thức phản hồi yêu HTTP GETcầu. Đường dẫn URL cho mỗi phương thức được xây dựng như sau:

  • Hãy bắt đầu với chuỗi mẫu trong Routethuộc tính của bộ điều khiển:

    C#
    [Route("api/[controller]")]
    [ApiController]
    public class TodoItemsController : ControllerBase
    
  • Thay thế [controller]bằng tên của bộ điều khiển, theo quy ước là tên lớp bộ điều khiển bỏ đi hậu tố "Controller". Trong ví dụ này, tên lớp bộ điều khiển là TodoItems Controller, vì vậy tên bộ điều khiển là "TodoItems". Định tuyến trong ASP.NET Core không phân biệt chữ hoa chữ thường.

  • Nếu [HttpGet]thuộc tính có mẫu định tuyến (ví dụ: [HttpGet("products")]), hãy thêm mẫu đó vào đường dẫn. Ví dụ này không sử dụng mẫu. Để biết thêm thông tin, hãy xem Định tuyến thuộc tính với thuộc tính Http[Verb] .

Trong GetTodoItemphương thức sau, "{id}"là một biến giữ chỗ cho mã định danh duy nhất của mục việc cần làm. Khi GetTodoItemđược gọi, giá trị của "{id}"trong URL sẽ được cung cấp cho phương thức thông qua idtham số của nó.

C#
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        return NotFound();
    }

    return todoItem;
}

Giá trị trả về

Kiểu trả về của các phương thức ` GetTodoItemsand` GetTodoItemlà kiểu `ActionResult<T>` . ASP.NET Core tự động tuần tự hóa đối tượng thành JSON và ghi JSON vào phần thân của thông báo phản hồi. Mã phản hồi cho kiểu trả về này là 200 OK , giả sử không có ngoại lệ nào chưa được xử lý. Các ngoại lệ chưa được xử lý được dịch thành lỗi 5xx.

ActionResultCác kiểu trả về có thể đại diện cho nhiều mã trạng thái HTTP khác nhau. Ví dụ, GetTodoItemnó có thể trả về hai giá trị trạng thái khác nhau:

  • Nếu không có mục nào khớp với ID được yêu cầu, phương thức sẽ trả về mã lỗi 404 NotFound .
  • Ngược lại, phương thức này trả về mã trạng thái 200 kèm theo nội dung phản hồi JSON. Việc trả về itemkết quả sẽ tạo ra một HTTP 200phản hồi.

Phương thức PutTodoItem

Hãy xem xét PutTodoItemphương pháp:

C#
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, TodoItem todoItem)
{
    if (id != todoItem.Id)
    {
        return BadRequest();
    }

    _context.Entry(todoItem).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!TodoItemExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

PutTodoItemTương tự như PostTodoItem, ngoại trừ việc nó sử dụng HTTP PUT. Phản hồi là 204 (Không có nội dung) . Theo đặc tả HTTP, PUTyêu cầu này đòi hỏi máy khách phải gửi toàn bộ thực thể đã cập nhật, chứ không chỉ những thay đổi. Để hỗ trợ cập nhật một phần, hãy sử dụng HTTP PATCH .

Kiểm tra phương thức PutTodoItem

Ví dụ này sử dụng cơ sở dữ liệu trong bộ nhớ, cần được khởi tạo mỗi khi ứng dụng được khởi chạy. Phải có một mục trong cơ sở dữ liệu trước khi bạn thực hiện lệnh PUT. Hãy gọi lệnh GET để đảm bảo có mục trong cơ sở dữ liệu trước khi thực hiện lệnh PUT.

Sử dụng PUTphương thức này để cập nhật phần TodoItemtử có Id = 1 và đặt tên cho nó thành "feed fish". Lưu ý rằng phản hồi nhận được là HTTP 204 No Content.

  • Trong Endpoints Explorer , nhấp chuột phải vào endpoint PUT và chọn Generate request .

    Nội dung sau đây được thêm vào TodoApi.httptệp:

    PUT {{TodoApi_HostAddress}}/api/todoitems/{{id}}
    Content-Type: application/json
    
    {
      //TodoItem
    }
    
    ###
    
  • Trong dòng yêu cầu PUT, hãy thay thế {{id}}bằng 1.

  • Thay thế đoạn //TodoItemvăn bản giữ chỗ bằng các dòng sau:

    PUT {{TodoApi_HostAddress}}/api/todoitems/1
    Content-Type: application/json
    
    {
      "id": 1,
      "name": "feed fish",
      "isComplete": false
    }
    
  • Chọn liên kết "Gửi yêu cầu" nằm phía trên dòng yêu cầu PUT mới.

    Yêu cầu PUT được gửi đến ứng dụng và phản hồi được hiển thị trong ngăn Phản hồi . Phần thân phản hồi trống và mã trạng thái là 204.

Phương thức DeleteTodoItem

Hãy xem xét DeleteTodoItemphương pháp:

C#
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);
    if (todoItem == null)
    {
        return NotFound();
    }

    _context.TodoItems.Remove(todoItem);
    await _context.SaveChangesAsync();

    return NoContent();
}

Kiểm tra phương thức DeleteTodoItem

Sử dụng DELETEphương thức này để xóa phần TodoItemtử có Id = 1. Lưu ý rằng phản hồi là HTTP 204 No Content.

  • Trong Endpoints Explorer , nhấp chuột phải vào endpoint DELETE và chọn Generate request .

    Một yêu cầu XÓA được thêm vào TodoApi.http.

  • Thay thế {{id}}trong dòng yêu cầu DELETE bằng 1. Yêu cầu DELETE sẽ trông giống như ví dụ sau:

    DELETE {{TodoApi_HostAddress}}/api/todoitems/{{id}}
    
    ###
    
  • Chọn liên kết "Gửi yêu cầu" cho yêu cầu XÓA.

    Yêu cầu DELETE được gửi đến ứng dụng và phản hồi được hiển thị trong ngăn Phản hồi . Phần thân phản hồi trống và mã trạng thái là 204.

Thử nghiệm với các công cụ khác

Có rất nhiều công cụ khác có thể được sử dụng để kiểm tra API web, ví dụ:

Ngăn chặn việc đăng bài quá nhiều

Hiện tại, ứng dụng mẫu hiển thị toàn bộ TodoItemđối tượng. Các ứng dụng sản xuất thường giới hạn dữ liệu được nhập và trả về bằng cách sử dụng một tập hợp con của mô hình. Có nhiều lý do đằng sau điều này, và bảo mật là một lý do chính. Tập hợp con của một mô hình thường được gọi là Đối tượng Truyền dữ liệu (DTO), mô hình đầu vào hoặc mô hình hiển thị. DTO được sử dụng trong hướng dẫn này.

Một DTO có thể được sử dụng để:

  • Tránh đăng bài quá nhiều.
  • Ẩn các thuộc tính mà khách hàng không được phép xem.
  • Loại bỏ một số thuộc tính để giảm kích thước dữ liệu truyền tải.
  • Làm phẳng các đồ thị đối tượng chứa các đối tượng lồng nhau. Đồ thị đối tượng được làm phẳng có thể thuận tiện hơn cho người dùng.

Để minh họa cách tiếp cận DTO, hãy cập nhật TodoItemlớp để bao gồm một trường bí mật:

C#
namespace TodoApi.Models;

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
    public string? Secret { get; set; }
}

Trường thông tin bí mật cần được ẩn khỏi ứng dụng này, nhưng một ứng dụng quản trị có thể chọn hiển thị nó.

Xác minh xem bạn có thể đăng bài và lấy thông tin bí mật hay không.

Tạo mô hình DTO trong tệp Models/TodoItemDTO.cs :

C#
namespace TodoApi.Models;

public class TodoItemDTO
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}

Cập nhật TodoItemsControllerđể sử dụng TodoItemDTO:

C#
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

namespace TodoApi.Controllers;

[Route("api/[controller]")]
[ApiController]
public class TodoItemsController : ControllerBase
{
    private readonly TodoContext _context;

    public TodoItemsController(TodoContext context)
    {
        _context = context;
    }

    // GET: api/TodoItems
    [HttpGet]
    public async Task<ActionResult<IEnumerable<TodoItemDTO>>> GetTodoItems()
    {
        return await _context.TodoItems
            .Select(x => ItemToDTO(x))
            .ToListAsync();
    }

    // GET: api/TodoItems/5
    // <snippet_GetByID>
    [HttpGet("{id}")]
    public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id)
    {
        var todoItem = await _context.TodoItems.FindAsync(id);

        if (todoItem == null)
        {
            return NotFound();
        }

        return ItemToDTO(todoItem);
    }
    // </snippet_GetByID>

    // PUT: api/TodoItems/5
    // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
    // <snippet_Update>
    [HttpPut("{id}")]
    public async Task<IActionResult> PutTodoItem(long id, TodoItemDTO todoDTO)
    {
        if (id != todoDTO.Id)
        {
            return BadRequest();
        }

        var todoItem = await _context.TodoItems.FindAsync(id);
        if (todoItem == null)
        {
            return NotFound();
        }

        todoItem.Name = todoDTO.Name;
        todoItem.IsComplete = todoDTO.IsComplete;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
        {
            return NotFound();
        }

        return NoContent();
    }
    // </snippet_Update>

    // POST: api/TodoItems
    // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
    // <snippet_Create>
    [HttpPost]
    public async Task<ActionResult<TodoItemDTO>> PostTodoItem(TodoItemDTO todoDTO)
    {
        var todoItem = new TodoItem
        {
            IsComplete = todoDTO.IsComplete,
            Name = todoDTO.Name
        };

        _context.TodoItems.Add(todoItem);
        await _context.SaveChangesAsync();

        return CreatedAtAction(
            nameof(GetTodoItem),
            new { id = todoItem.Id },
            ItemToDTO(todoItem));
    }
    // </snippet_Create>

    // DELETE: api/TodoItems/5
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteTodoItem(long id)
    {
        var todoItem = await _context.TodoItems.FindAsync(id);
        if (todoItem == null)
        {
            return NotFound();
        }

        _context.TodoItems.Remove(todoItem);
        await _context.SaveChangesAsync();

        return NoContent();
    }

    private bool TodoItemExists(long id)
    {
        return _context.TodoItems.Any(e => e.Id == id);
    }

    private static TodoItemDTO ItemToDTO(TodoItem todoItem) =>
       new TodoItemDTO
       {
           Id = todoItem.Id,
           Name = todoItem.Name,
           IsComplete = todoItem.IsComplete
       };
}

Hãy xác minh rằng bạn không thể đăng bài hoặc lấy thông tin bí mật.

Gọi API web bằng JavaScript

Xem hướng dẫn: Gọi API web ASP.NET Core bằng JavaScript .

Chuỗi video về Web API

Xem video: Chuỗi bài giảng dành cho người mới bắt đầu về: API web .

Các mẫu ứng dụng web doanh nghiệp

Để được hướng dẫn về cách tạo ứng dụng ASP.NET Core đáng tin cậy, an toàn, hiệu quả, dễ kiểm thử và có khả năng mở rộng, hãy xem các mẫu ứng dụng web doanh nghiệp . Một ứng dụng web mẫu hoàn chỉnh chất lượng sản xuất triển khai các mẫu này cũng có sẵn.

Thêm hỗ trợ xác thực vào API web

ASP.NET Core Identity bổ sung chức năng đăng nhập giao diện người dùng (UI) cho các ứng dụng web ASP.NET Core. Để bảo mật các API web và SPA, hãy sử dụng một trong các phương pháp sau:

Duende Identity Server là một framework OpenID Connect và OAuth 2.0 dành cho ASP.NET Core. Duende Identity Server hỗ trợ các tính năng bảo mật sau:

  • Xác thực dưới dạng dịch vụ (AaaS)
  • Đăng nhập/đăng xuất một lần (SSO) trên nhiều loại ứng dụng
  • Kiểm soát quyền truy cập cho API
  • Cổng Liên bang

Post a Comment

Hoan nghênh sự góp ý của bạn cho website!
- Nếu bạn không có các tài khoản để nhắn tin/bình luận bạn có thể chọn trong "Nhận xét với tư cách" với tài khoản "Ẩn danh" (Anonymous).

Cám ơn bạn đã đọc blog! Chúc bạn tìm được nhiều bài viết hay và hữu ích cho mình!
Bài đăng phổ biến
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Test link