Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

Hướng dẫn này cung cấp 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 các API tối thiểu. Để được trợ giúp trong việc lựa chọn giữa API tối thiểu và API dựa trên controller, hãy xem Chọn giữa API dựa trên controller và API tối thiểu. Để biết hướng dẫn về cách tạo API tối thiểu, hãy xem Hướng dẫn: Tạo API tối thiểu với ASP.NET Core.

Tổng quan

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

API Mô tả Request body Response body

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

4 Nhận tất cả các mục việc cần làm Không có Mảng việc cần làm

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

5 Nhận một mục theo ID Không có Mục việc cần làm

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

6 Thêm một mục mới Mục việc cần làm Mục việc cần làm

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

7 Cập nhật một mục hiện có Mục việc cần làm Không có

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

8 Xóa một mục Không có Không có

Sơ đồ sau đây cho thấy thiết kế của ứng dụng.

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

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

Với Visual Studio

đã cài đặt ASP.NET and web development.

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

Với Visual Studio Code

  • Visual Studio Code
  • C# dành cho Visual Studio Code (phiên bản mới nhất)
  • SDK .NET 7.0

Hướng dẫn Visual Studio Code sử dụng .NET CLI cho các chức năng phát triển ASP.NET Core, chẳng hạn như tạo dự án. Bạn có thể làm theo các hướng dẫn này trên macOS, Linux hoặc Windows và với bất kỳ trình chỉnh sửa mã nào. Những thay đổi nhỏ có thể được yêu cầu nếu bạn sử dụng thứ gì đó khác với Visual Studio Code.

Với Visual Studio dành cho Mac

  • Visual Studio 2022 for Mac

Tạo một dự án web

Visual Studio

  • Từ menu File, chọn New > Project.
  • Nhập API Web vào hộp tìm kiếm.
  • Chọn mẫu ASP.NET Core Web API và chọn Next.
  • Trong hộp thoại Configure your new project dialog, hãy đặt tên cho dự án là TodoApi và chọn Next.
  • Trong hộp thoại Additional information:
    • Xác nhận Framework là .NET 7.0 (hoặc mới hơn).
    • Xác nhận đã chọn vào check box Use controllers(uncheck to use minimal APIs).
    • Chọn Create.

Với Visual Studio Code

  • Mở terminal đã được tích hợp.
  • Thay đổi thư mục (cd) thành thư mục chứa thư mục dự án.
  • Chạy các lệnh sau:

dotnet new webapi -o TodoApi cd TodoApi dotnet add package Microsoft.EntityFrameworkCore.InMemory code -r ../TodoApi

Các lệnh này sẽ:

  • Tạo một dự án API web mới và mở nó trong Visual Studio Code.
  • Thêm gói NuGet cần thiết cho phần tiếp theo.

• Khi hộp thoại hỏi bạn có muốn thêm nội dung cần thiết vào dự án hay không, hãy chọn Yes.

Với Visual Studio dành cho Mac

  • Trong Visual Studio for Mac 2022, chọn File > New project....
  • Trong hộp thoại Choose a template for your new project:
    • Chọn Web and Console > App > API.
    • Chọn Continue.
  • Trong hộp thoại Configure your new API, hãy thực hiện các lựa chọn sau:
    • Xác nhận Target framework là .NET 7.0 (hoặc mới hơn).
    • Xác nhận đã chọn hộp kiểm Use controllers (uncheck to use minimal APIs).
    • Xác nhận đã chọn hộp kiểm Enable OpenAPI support.
    • Chọn Continue.
  • Nhập theo chỉ dẫn:
    • Project name: TodoApi
    • Solution name: TodoApi
    • Chọn Create.

Thêm gói NuGet

  • Trong thanh công cụ Visual Studio cho Mac 2022, chọn Project > Manage NuGet Packages...
  • Trong hộp tìm kiếm, nhập Microsoft.EntityFrameworkCore.InMemory.
  • Trong cửa sổ kết quả, kiểm tra [
    {  
        "date": "2019-07-16T19:04:05.7257911-06:00",  
        "temperatureC": 52,  
        "temperatureF": 125,  
        "summary": "Mild"  
    },  
    {  
        "date": "2019-07-17T19:04:05.7258461-06:00",  
        "temperatureC": 36,  
        "temperatureF": 96,  
        "summary": "Warm"  
    },  
    {  
        "date": "2019-07-18T19:04:05.7258467-06:00",  
        "temperatureC": 39,  
        "temperatureF": 102,  
        "summary": "Cool"  
    },  
    {  
        "date": "2019-07-19T19:04:05.7258471-06:00",  
        "temperatureC": 10,  
        "temperatureF": 49,  
        "summary": "Bracing"  
    },  
    {  
        "date": "2019-07-20T19:04:05.7258474-06:00",  
        "temperatureC": -1,  
        "temperatureF": 31,  
        "summary": "Chilly"  
    }  
    
    ]
    9.
  • Chọn Add package
  • Trong cửa sổ Select Projects chọn Ok
  • Trong cửa sổ License Agreement, chọn Agree
    Ghi chú
Để biết 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 tiêu thụ gói (tài liệu NuGet). Xác nhận các phiên bản gói chính xác tại NuGet.org.

Chạy thử dự án

Mẫu dự án tạo một API

namespace TodoApi.Models; public class TodoItem {

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

0 có hỗ trợ cho Swagger.

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

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

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

Chọn Yes nếu bạn tin cậy chứng chỉ SSL IIS Express.

Khi đó hộp thoại sau sẽ hiển thị:

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

Chọn Yes nếu bạn đồng ý tin cậy chứng chỉ phát triển.

Để biết thông tin về cách tin cậy trình duyệt Firefox, hãy xem .

Visual Studio khởi chạy trình duyệt mặc định và điều hướng đến

namespace TodoApi.Models; public class TodoItem {

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

1, trong đó

namespace TodoApi.Models; public class TodoItem {

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

2 có số cổng được chọn ngẫu nhiên.

Trang Swagger

namespace TodoApi.Models; public class TodoItem {

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

3 được hiển thị. Chọn GET > Try it out > Execute. Trang hiển thị:

  • Lệnh Curl để kiểm tra WeatherForecast API.
  • URL để kiểm tra WeatherForecast API.
  • Mã phản hồi, nội dung và tiêu đề.
  • Một hộp danh sách thả xuống với các loại phương tiện và giá trị ví dụ và giản đồ.

Nếu trang Swagger không xuất hiện, hãy xem vấn đề GitHub này.

Swagger được sử dụng để tạo các trang trợ giúp và tài liệu hữu ích cho các API web. Hướng dẫn này tập trung vào việc tạo API web. Để biết thêm thông tin về Swagger, hãy xem tài liệu API web ASP.NET Core với Swagger/OpenAPI.

Sao chép và dán URL yêu cầu trong trình duyệt:

namespace TodoApi.Models; public class TodoItem {

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

4

JSON tương tự như ví dụ sau được trả về:

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

Thêm một lớp model

Model 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ý. Model cho ứng dụng này là lớp

namespace TodoApi.Models; public class TodoItem {

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

5.

  • 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 namespace TodoApi.Models; public class TodoItem {
    public long Id { get; set; }  
    public string? Name { get; set; }  
    public bool IsComplete { get; set; }  
    
    } 6.
  • Bấm chuột phải vào thư mục namespace TodoApi.Models; public class TodoItem {
    public long Id { get; set; }  
    public string? Name { get; set; }  
    public bool IsComplete { get; set; }  
    
    } 6 và chọn Add > Class. Đặt tên cho lớp là TodoItem và chọn Add.
  • Thay thế mã mẫu bằng mã sau:

namespace TodoApi.Models; public class TodoItem {

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

Property

namespace TodoApi.Models; public class TodoItem {

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

8 hoạt động như một khóa duy nhất trong cơ sở dữ liệu quan hệ.

Các lớp model có thể đi đến bất kỳ đâu trong dự án, nhưng thư mục

namespace TodoApi.Models; public class TodoItem {

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

6 được sử dụng theo quy ước.

Thêm một database context

Database context là lớp chính điều phối chức năng Entity Framework cho một model dữ liệu. Lớp này được tạo bằng cách dẫn xuất từ ​​lớp Microsoft.EntityFrameworkCore.DbContext.

Thêm gói NuGet

  • Từ menu Tools, chọn NuGet Package Manager > Manage NuGet Packages for Solution.
  • Chọn tab Browse, sau đó nhập [
    {  
        "date": "2019-07-16T19:04:05.7257911-06:00",  
        "temperatureC": 52,  
        "temperatureF": 125,  
        "summary": "Mild"  
    },  
    {  
        "date": "2019-07-17T19:04:05.7258461-06:00",  
        "temperatureC": 36,  
        "temperatureF": 96,  
        "summary": "Warm"  
    },  
    {  
        "date": "2019-07-18T19:04:05.7258467-06:00",  
        "temperatureC": 39,  
        "temperatureF": 102,  
        "summary": "Cool"  
    },  
    {  
        "date": "2019-07-19T19:04:05.7258471-06:00",  
        "temperatureC": 10,  
        "temperatureF": 49,  
        "summary": "Bracing"  
    },  
    {  
        "date": "2019-07-20T19:04:05.7258474-06:00",  
        "temperatureC": -1,  
        "temperatureF": 31,  
        "summary": "Chilly"  
    }  
    
    ]
    9 vào hộp tìm kiếm.
  • Chọn [
    {  
        "date": "2019-07-16T19:04:05.7257911-06:00",  
        "temperatureC": 52,  
        "temperatureF": 125,  
        "summary": "Mild"  
    },  
    {  
        "date": "2019-07-17T19:04:05.7258461-06:00",  
        "temperatureC": 36,  
        "temperatureF": 96,  
        "summary": "Warm"  
    },  
    {  
        "date": "2019-07-18T19:04:05.7258467-06:00",  
        "temperatureC": 39,  
        "temperatureF": 102,  
        "summary": "Cool"  
    },  
    {  
        "date": "2019-07-19T19:04:05.7258471-06:00",  
        "temperatureC": 10,  
        "temperatureF": 49,  
        "summary": "Bracing"  
    },  
    {  
        "date": "2019-07-20T19:04:05.7258474-06:00",  
        "temperatureC": -1,  
        "temperatureF": 31,  
        "summary": "Chilly"  
    }  
    
    ]
    9 trong ngăn bên trái.
  • Chọn hộp kiểm Project trong ngăn bên phải rồi chọn Install.

Thêm database context TodoContext

  • Bấm chuột phải vào thư mục namespace TodoApi.Models; public class TodoItem {
    public long Id { get; set; }  
    public string? Name { get; set; }  
    public bool IsComplete { get; set; }  
    
    } 6 và chọn Add > Class. Đặt tên cho lớp là TodoContext và nhấp vào Add.
  • Đưa vào đoạn code sau đây:

using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext {

public TodoContext(DbContextOptions options)  
    : base(options)  
{  
}
public DbSet TodoItems { get; set; } = null!;  
}

Đăng ký database context

Trong ASP.NET Core, các dịch vụ như database context phải được đăng ký với vùng chứa dependency injection (DI). Vùng chứa cung cấp dịch vụ cho controller.

Cập nhật code cho

using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext {

public TodoContext(DbContextOptions options)  
    : base(options)  
{  
}
public DbSet TodoItems { get; set; } = null!;  
}

3 như sau:

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

Trong đoạn code trên:

  • Thêm chỉ thị using Microsoft.EntityFrameworkCore;

    namespace TodoApi.Models; public class TodoContext : DbContext {

    public TodoContext(DbContextOptions options)  
        : base(options)  
    {  
    }  
    public DbSet TodoItems { get; set; } = null!;  
    
    }

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

Scaffold một controller

  • Nhấp chuột phải vào thư mục Controllers.
  • Chọn Add > New Scaffold Item.
  • Chọn API Controller with actions, using Entity Framework, sau đó chọn Add.
  • Trong hộp thoại Add API Controller with actions, using Entity Framework:
    • Chọn TodoItem (TodoApi.Models) trong Model class.
    • Chọn TodoContext (TodoApi.Models) trong Data context class.
    • Chọn Add.

Nếu hoạt động scaffold không thành công, hãy chọn Add để thử scaffold lần thứ hai.

Đối với đoạn code đã được tạo:

  • Đánh dấu lớp bằng attribute [ApiController]. Attribute này cho biết rằng controller 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à atribute cho phép, hãy xem Tạo API web bằng ASP.NET Core.
  • Sử dụng DI để đưa database context ( using Microsoft.EntityFrameworkCore;

    namespace TodoApi.Models; public class TodoContext : DbContext {

    public TodoContext(DbContextOptions options)  
        : base(options)  
    {  
    }  
    public DbSet TodoItems { get; set; } = null!;  
    
    }

  • vào controller. Database context được sử dụng trong mỗi phương thức CRUD trong controller.

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

  • Controller có view bao gồm using Microsoft.EntityFrameworkCore;

    namespace TodoApi.Models; public class TodoContext : DbContext {

    public TodoContext(DbContextOptions options)  
        : base(options)  
    {  
    }  
    public DbSet TodoItems { get; set; } = null!;  
    
    }

    6 trong mẫu route.
  • Controller API không bao gồm using Microsoft.EntityFrameworkCore;

    namespace TodoApi.Models; public class TodoContext : DbContext {

    public TodoContext(DbContextOptions options)  
        : base(options)  
    {  
    }  
    public DbSet TodoItems { get; set; } = null!;  
    
    }

    6 trong mẫu route.

Khi token

using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext {

public TodoContext(DbContextOptions options)  
    : base(options)  
{  
}
public DbSet TodoItems { get; set; } = null!;  
}

6 không có trong mẫu route, thì tên (tên phương thức) không được bao gồm trong điểm cuối. Nghĩa là, tên phương thức được liên kết của hành động không được sử dụng trong lộ trình phù hợp.

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

Cập nhật câu lệnh return trong toán tử

using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext {

public TodoContext(DbContextOptions options)  
    : base(options)  
{  
}
public DbSet TodoItems { get; set; } = null!;  
}

9 để sử dụng nameof:

[HttpPost] public async Task> 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 code trên là một phương thức

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

0, như được biểu thị bởi attribute [HttpPost]. Phương thức lấy giá trị của

namespace TodoApi.Models; public class TodoItem {

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

5 từ body của request HTTP.

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

Phương thức CreatedAtAction:

  • Trả về mã trạng thái HTTP 201 nếu thành công. using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    2 là phản hồi tiêu chuẩn cho một phương thức

    using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    0 tạo tài nguyên mới trên máy chủ.
  • Thêm header Location vào phản hồi. Header using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    4 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 .
  • Tham chiếu action using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    5 để tạo URI của header

    using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    4. Từ khóa

    using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    7 của C# được sử dụng để tránh mã hóa cứng tên hành động trong lời gọi

    using Microsoft.EntityFrameworkCore;

    using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

    opt.UseInMemoryDatabase("TodoList"));  
    
    builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
    app.UseSwagger();  
    app.UseSwaggerUI();  
    
    } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

    8.

Kiểm thử PostTodoItem

  • Nhấn Ctrl + F5 để chạy ứng dụng.
  • Trong cửa sổ trình duyệt Swagger, chọn POST /api/TodoItems rồi chọn Try it out.
  • Trong Request body, hãy cập nhật JSON. Ví dụ,

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

  • Chọn Execute

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

Kiểm thử URI của header location

Trong POST ở trên, giao diện người dùng Swagger hiển thị tiêu đề vị trí bên dưới Response headers. Ví dụ như

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

9. Ở đây tiêu đề vị trí hiển thị URI cho tài nguyên đã tạo.

Để kiểm tra tiêu đề vị trí:

  • Trong cửa sổ trình duyệt Swagger, hãy chọn GET /api/TodoItems/{id} rồi chọn Try it out.
  • Nhập [HttpPost]

    public async Task> 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);  
    
    }

    0 vào hộp nhập

    [HttpPost]

    public async Task> 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);  
    
    }

    1, sau đó chọn Execute.

Services.adddbcontext todocontext opt opt.useinmemorydatabase todolist bị lỗi

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

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

  • [
    {  
        "date": "2019-07-16T19:04:05.7257911-06:00",  
        "temperatureC": 52,  
        "temperatureF": 125,  
        "summary": "Mild"  
    },  
    {  
        "date": "2019-07-17T19:04:05.7258461-06:00",  
        "temperatureC": 36,  
        "temperatureF": 96,  
        "summary": "Warm"  
    },  
    {  
        "date": "2019-07-18T19:04:05.7258467-06:00",  
        "temperatureC": 39,  
        "temperatureF": 102,  
        "summary": "Cool"  
    },  
    {  
        "date": "2019-07-19T19:04:05.7258471-06:00",  
        "temperatureC": 10,  
        "temperatureF": 49,  
        "summary": "Bracing"  
    },  
    {  
        "date": "2019-07-20T19:04:05.7258474-06:00",  
        "temperatureC": -1,  
        "temperatureF": 31,  
        "summary": "Chilly"  
    }  
    
    ]
    4
  • [
    {  
        "date": "2019-07-16T19:04:05.7257911-06:00",  
        "temperatureC": 52,  
        "temperatureF": 125,  
        "summary": "Mild"  
    },  
    {  
        "date": "2019-07-17T19:04:05.7258461-06:00",  
        "temperatureC": 36,  
        "temperatureF": 96,  
        "summary": "Warm"  
    },  
    {  
        "date": "2019-07-18T19:04:05.7258467-06:00",  
        "temperatureC": 39,  
        "temperatureF": 102,  
        "summary": "Cool"  
    },  
    {  
        "date": "2019-07-19T19:04:05.7258471-06:00",  
        "temperatureC": 10,  
        "temperatureF": 49,  
        "summary": "Bracing"  
    },  
    {  
        "date": "2019-07-20T19:04:05.7258474-06:00",  
        "temperatureC": -1,  
        "temperatureF": 31,  
        "summary": "Chilly"  
    }  
    
    ]
    5

Phần bên trên cho thấy một ví dụ về route

[HttpPost] public async Task> 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);  
}

4.

Thực hiện theo các hướng dẫn để thêm một mục việc cần làm khác, sau đó kiểm tra route

[HttpPost] public async Task> 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);  
}

5 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, thì 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ề, dữ liệu vào ứng dụng.

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

Attribute [HttpGet] biểu thị một phương thức đáp ứng request

[HttpPost] public async Task> 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);  
}

6. Đường dẫn URL cho mỗi phương thức được xây dựng như sau:

  • Bắt đầu với chuỗi mẫu trong attribute [HttpPost]

    public async Task> 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);  
    
    }

    7 của controller:

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

  • Thay thế [HttpPost]

    public async Task> 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);  
    
    }

    8 bằng tên của controller, theo quy ước là tên lớp của controller trừ hậu tố "Controller". Đối với mẫu này, tên lớp controller là TodoItemsController, vì vậy tên controller là "TodoItems". Định tuyến ASP.NET Core không phân biệt chữ hoa chữ thường.
  • Nếu attribute [HttpPost]

    public async Task> 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);  
    
    }

    9 có mẫu route (ví dụ:

    {

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

    0), hãy thêm mẫu đó vào đường dẫn. Mẫu này không sử dụng template. Để biết thêm thông tin, hãy xem .

Trong phương thức

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

5 sau đây,

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

2 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

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

5 được gọi, giá trị của

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

2 trong URL được cung cấp cho phương thức trong tham số

[HttpPost] public async Task> 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);  
}

1 của nó.

[HttpGet("{id}")] public async Task> 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 phương thức

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

6 và

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

5 là . ASP.NET Core tự động tuần tự hóa đối tượng thành JSON và ghi JSON vào phần body của thông báo phản hồi. Mã phản hồi cho loại 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.

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

8 trả về các kiểu có thể đại diện cho nhiều loại mã trạng thái HTTP. Ví dụ:

using Microsoft.EntityFrameworkCore; using TodoApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddDbContext(opt =>

opt.UseInMemoryDatabase("TodoList"));  
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) {
app.UseSwagger();  
app.UseSwaggerUI();  
} app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();

5 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 này sẽ trả về mã lỗi 404 NotFound.
  • Mặt khác, phương thức trả về 200 với nội dung phản hồi JSON. Trả lại kết quả [Route("api/[controller]")]

    [ApiController] public class TodoItemsController : ControllerBase

    0 trong một phản hồi

    [Route("api/[controller]")]

    [ApiController] public class TodoItemsController : ControllerBase

    1.

Phương thức PutTodoItem

Kiểm thử phương thức

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

2:

[HttpPut("{id}")] public async Task 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();  
}

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

2 tương tự như

using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext {

public TodoContext(DbContextOptions options)  
    : base(options)  
{  
}
public DbSet TodoItems { get; set; } = null!;  
}

9, ngoại trừ nó sử dụng

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

5. Câu trả lời là . Theo đặc tả HTTP, một yêu cầu

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

6 yêu cầu máy khách gửi toàn bộ thực thể được cập nhật, không chỉ các thay đổi. Để hỗ trợ cập nhật một phần, hãy sử dụng HTTP PATCH.

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

Mẫu này sử dụng cơ sở dữ liệu trong bộ nhớ phải được khởi tạo mỗi khi khởi động ứng dụng. Phải có một mục trong cơ sở dữ liệu trước khi bạn thực hiện lời gọi PUT. Lời gọi GET để đảm bảo có một mục trong cơ sở dữ liệu trước khi thực hiện lời gọi PUT.

Sử dụng giao diện người dùng Swagger, sử dụng nút PUT để cập nhật

namespace TodoApi.Models; public class TodoItem {

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

5 có Id = 1 và đặt tên thành

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

8. Lưu ý rằng phản hồi là HTTP 204 No Content.

Phương thức DeleteTodoItem

Kiểm thử phương thức

[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase

9:

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

0

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

Sử dụng UI Swagger để xóa giao diện người dùng

namespace TodoApi.Models; public class TodoItem {

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

5 có Id = 1. Lưu ý rằng phản hồi là HTTP 204 No Content.

Kiểm thử với http-repl, Postman hoặc curl

http-repl, Postman và curl thường được sử dụng để kiểm tra API. Swagger sử dụng

[HttpGet("{id}")] public async Task> GetTodoItem(long id) {

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

1 và hiển thị lệnh

[HttpGet("{id}")] public async Task> GetTodoItem(long id) {

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

1 mà nó đã gửi.

Để biết hướng dẫn về các công cụ này, hãy xem các liên kết sau:

Để biết thêm thông tin về

[HttpGet("{id}")] public async Task> GetTodoItem(long id) {

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

3, hãy xem Kiểm thử API web với HttpRepl.

Ngăn chặn đăng quá nhiều

Hiện tại, ứng dụng mẫu hiển thị toàn bộ đối tượng

namespace TodoApi.Models; public class TodoItem {

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

5. Các ứng dụng production 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 model. Có nhiều lý do đằng sau điều này và bảo mật là một trong những lý do chính. Tập hợp con của một model 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 xem. DTO được sử dụng trong hướng dẫn này.

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

  • Ngăn chặn đăng quá nhiều.
  • Ẩn các property mà khách hàng không được phép xem.
  • Bỏ qua một số thuộc tính để giảm kích thước tải trọng.
  • Làm phẳng đồ thị đối tượng có chứa các đối tượng lồng nhau. Biểu đồ đối tượng phẳng có thể thuận tiện hơn cho khách hàng.

Để minh họa cách tiếp cận DTO, hãy cập nhật lớp

namespace TodoApi.Models; public class TodoItem {

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

5 để bao gồm một trường bí mật:

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

1

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

Xác minh rằng bạn có thể đăng và nhận trường bí mật.

Tạo mô hình DTO:

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

2

Cập nhật

[HttpGet("{id}")] public async Task> GetTodoItem(long id) {

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

6 để sử dụng

[HttpGet("{id}")] public async Task> GetTodoItem(long id) {

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

7:

[

{  
    "date": "2019-07-16T19:04:05.7257911-06:00",  
    "temperatureC": 52,  
    "temperatureF": 125,  
    "summary": "Mild"  
},  
{  
    "date": "2019-07-17T19:04:05.7258461-06:00",  
    "temperatureC": 36,  
    "temperatureF": 96,  
    "summary": "Warm"  
},  
{  
    "date": "2019-07-18T19:04:05.7258467-06:00",  
    "temperatureC": 39,  
    "temperatureF": 102,  
    "summary": "Cool"  
},  
{  
    "date": "2019-07-19T19:04:05.7258471-06:00",  
    "temperatureC": 10,  
    "temperatureF": 49,  
    "summary": "Bracing"  
},  
{  
    "date": "2019-07-20T19:04:05.7258474-06:00",  
    "temperatureC": -1,  
    "temperatureF": 31,  
    "summary": "Chilly"  
}  
]

3

Xác minh rằng bạn không thể đăng hoặc lấy trường 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.

Loạt video API Web

Xem Video: Loạt bài dành cho Người mới bắt đầu về: API Web.

Các mẫu ứng dụng web đáng tin cậy

Xem Bài viết và mẫu ứng dụng web đáng tin cậy dành cho.NET trên YouTube để biết hướng dẫn về cách tạo ứng dụng ASP.NET Core hiện đại, đáng tin cậy, hiệu quả, có thể kiểm tra, tiết kiệm chi phí và có thể mở rộng, cho dù là từ đầu hay tái cấu trúc một ứng dụng hiện có.

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 API web và SPA, hãy sử dụng một trong các cách sau:

  • Azure Active Directory
  • Azure Active Directory B2C (Azure AD B2C)
  • Máy chủ nhận dạng Duende

Duende Identity Server là một khung OpenID Connect và OAuth 2.0 cho ASP.NET Core. Duende Identity Server kích hoạt 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/tắt một lần (SSO) trên nhiều loại ứng dụng
  • Kiểm soát truy cập cho API
  • Cổng liên bang
    Quan trọng

Phần mềm Duende có thể yêu cầu bạn trả phí giấy phép để sử dụng sản xuất Máy chủ nhận dạng Duende. Để biết thêm thông tin, hãy xem .

Để biết thêm thông tin, hãy xem tài liệu Máy chủ Nhận dạng Duende (trang web Phần mềm Duende).

Xuất bản lên Azure

Để biết thông tin về cách triển khai lên Azure, hãy xem Bắt đầu nhanh: Triển khai ứng dụng web ASP.NET.