Samouczek: tworzenie internetowego interfejsu API opartego na kontrolerze przy użyciu platformy ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję artykułu dla .NET 9.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz zasady pomocy technicznej platformy .NET i platformy .NET Core. Aby zapoznać się z bieżącą wersją, sprawdź wersję tego artykułu dla .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu w wersji .NET 9.
Autorzy: Tim Deschryver i Rick Anderson
Ten samouczek uczy podstaw tworzenia webowego interfejsu API opartego na kontrolerze, który korzysta z bazy danych. Innym podejściem do tworzenia interfejsów API w środowisku ASP.NET Core jest utworzenie minimalnych interfejsów API. Aby uzyskać pomoc dotyczącą wybierania między minimalnymi interfejsami API i interfejsami API opartymi na kontrolerach, zobacz Omówienie interfejsów API. Aby zapoznać się z samouczkiem dotyczącym tworzenia minimalnego interfejsu API, zobacz Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core.
Omówienie
Ten samouczek tworzy następujący interfejs API:
Interfejs API | opis | Treść żądania | Treść odpowiedzi |
---|---|---|---|
GET /api/todoitems |
Pobierz wszystkie zadania do zrobienia | Brak | Tablica elementów do wykonania |
GET /api/todoitems/{id} |
Pobieranie elementu według identyfikatora | Brak | Element do wykonania |
POST /api/todoitems |
Dodawanie nowego elementu | Element do wykonania | Element do wykonania |
PUT /api/todoitems/{id} |
Aktualizowanie istniejącego elementu | Element do wykonania | Brak |
DELETE /api/todoitems/{id} |
Usuwanie elementu | Brak | Brak |
Na poniższym diagramie przedstawiono projekt aplikacji.
Wymagania wstępne
Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych.
Tworzenie projektu Web API
- W menu Plik wybierz pozycję Nowy>projekt.
- Wprowadź Web API w polu wyszukiwania.
- Wybierz szablon internetowego interfejsu API platformy ASP.NET Core i wybierz pozycję Dalej.
- W oknie dialogowym Konfigurowanie nowego projektu nadaj projektowi nazwę TodoApi i wybierz pozycję Dalej.
-
W oknie dialogowym Dodatkowe informacje:
- Upewnij się, że Framework jest .NET 9.0 (obsługa terminów standardowych).
- Upewnij się, że zaznaczono pole wyboru Włącz obsługę interfejsu OpenAPI.
- Potwierdź, że pole wyboru Użyj kontrolerów (usuń zaznaczenie, aby korzystać z minimalnych interfejsów API) jest zaznaczone.
- Wybierz pozycję Utwórz.
Dodawanie pakietu NuGet
Aby dodać obsługę dla bazy danych używanej w tym samouczku, należy dodać pakiet NuGet.
- W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > Zarządzaj pakietami NuGet dla rozwiązania.
- Wybierz kartę Przeglądaj.
- Wprowadź ciąg Microsoft.EntityFrameworkCore.InMemory w polu wyszukiwania, a następnie wybierz pozycję
Microsoft.EntityFrameworkCore.InMemory
. - Zaznacz pole wyboru Projekt w okienku po prawej stronie, a następnie wybierz pozycję Zainstaluj.
Uwaga
Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.
Uruchamianie projektu
Szablon projektu tworzy interfejs API WeatherForecast
, który wspiera OpenAPI.
Naciśnij Ctrl+F5, aby uruchomić bez debugera.
Program Visual Studio wyświetla następujące okno dialogowe, gdy projekt nie jest jeszcze skonfigurowany do używania protokołu SSL:
Wybierz pozycję Tak , jeśli ufasz certyfikatowi SSL usług IIS Express.
Zostanie wyświetlone następujące okno dialogowe:
Wybierz pozycję Tak, jeśli wyrażasz zgodę na zaufanie certyfikatowi programistycznemu.
Aby uzyskać informacje na temat zaufania przeglądarce Firefox, zobacz Błąd certyfikatu przeglądarki Firefox SEC_ERROR_INADEQUATE_KEY_USAGE.
Program Visual Studio uruchamia okno terminalu i wyświetla adres URL uruchomionej aplikacji. Interfejs API jest hostowany w https://localhost:<port>
, gdzie <port>
jest losowo wybranym numerem portu ustawionym podczas tworzenia projektu.
...
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.
...
Naciśnij Ctrl+, aby przetestować aplikację internetową w przeglądarce, kliknij adres URL HTTPS w danych wyjściowych. Brak punktu końcowego w adresie https://localhost:<port>
, więc przeglądarka zwraca błąd HTTP 404 Nie znaleziono.
Dołącz /weatherforecast
do adresu URL, aby przetestować interfejs API WeatherForecast.
W przeglądarce zostanie wyświetlony kod JSON podobny do następującego przykładu:
[
{
"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"
}
]
Testowanie projektu
W tym samouczku używamy Endpoints Explorer i plików .http do testowania interfejsu API.
Dodawanie klasy modelu
Model to zestaw klas reprezentujących dane, którymi zarządza aplikacja. Model dla tej aplikacji jest klasą TodoItem
.
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt. Wybierz pozycję Dodaj>nowy folder. Nadaj folderowi
Models
nazwę . - Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoItem i wybierz pozycję Dodaj. - Zastąp kod szablonu następującym kodem:
namespace TodoApi.Models;
public class TodoItem
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Właściwość Id
działa jako unikatowy klucz w relacyjnej bazie danych.
Klasy modeli mogą znajdować się w dowolnym miejscu w projekcie, ale Models
folder jest używany zgodnie z konwencją.
Dodawanie kontekstu bazy danych
Kontekst bazy danych jest klasą główną, która koordynuje funkcje programu Entity Framework dla modelu danych. Ta klasa jest tworzona przez wyprowadzanie z Microsoft.EntityFrameworkCore.DbContext klasy .
Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoContext i kliknij przycisk Dodaj.Wprowadź następujące kod:
using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } = null!; }
Rejestrowanie kontekstu bazy danych
W ASP.NET Core usługi, takie jak kontekst bazy danych, muszą być zarejestrowane w kontenerze wstrzykiwania zależności (DI). Kontener udostępnia usługę kontrolerom.
Zaktualizuj Program.cs
za pomocą następującego wyróżnionego kodu:
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();
Poprzedni kod:
- Dodaje
using
dyrektywy. - Dodaje kontekst bazy danych do kontenera DI.
- Określa, że kontekst bazy danych będzie używać bazy danych w pamięci.
Tworzenie szkieletu kontrolera
Kliknij prawym przyciskiem myszy folder
Controllers
.Wybierz Dodaj>New Scaffolded Item.
Wybierz pozycję Kontroler interfejsu API z akcjami przy użyciu platformy Entity Framework, a następnie wybierz pozycję Dodaj.
W oknie dialogowym Dodaj kontroler API z akcjami, za pomocą Entity Framework:
- Wybierz pozycję TodoItem (TodoApi.Models) w klasie Model.
- Wybierz pozycję TodoContext (TodoApi.Models) w klasie Kontekst danych.
- Wybierz Dodaj.
Jeśli operacja tworzenia szkieletu nie powiedzie się, wybierz pozycję Dodaj , aby spróbować utworzyć szkielet po raz drugi.
Ten krok dodaje do projektu pakiety Microsoft.VisualStudio.Web.CodeGeneration.Design
i Microsoft.EntityFrameworkCore.Tools
NuGet.
Te pakiety są wymagane do tworzenia szkieletów.
Wygenerowany kod:
- Oznacza klasę za pomocą atrybutu
[ApiController]
. Ten atrybut wskazuje, że kontroler odpowiada na żądania internetowego interfejsu API. Aby uzyskać informacje o konkretnych zachowaniach, które włącza atrybut, zobacz Tworzenie internetowych interfejsów API za pomocą ASP.NET Core. - Używa DI do implementacji kontekstu bazy danych (
TodoContext
) do kontrolera. Kontekst bazy danych jest używany w każdej z metod CRUD w kontrolerze.
Szablony ASP.NET Core dla:
- Kontrolery z widokami zawierają
[action]
w szablonie trasy. - Kontrolery interfejsów API nie zawierają
[action]
w szablonie trasy.
[action]
Jeśli token nie znajduje się w szablonie trasy, nazwa akcji (nazwa metody) nie jest uwzględniona w punkcie końcowym. Oznacza to, że skojarzona nazwa metody akcji nie jest używana w pasującej ścieżce.
Aktualizowanie metody PostTodoItem create
Zaktualizuj instrukcję return PostTodoItem
, aby użyć operatora nameof:
[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);
}
Kod przedstawiony powyżej to metoda HTTP POST
, co jest wskazane przez atrybut [HttpPost]
. Metoda pobiera wartość TodoItem
z treści żądania HTTP.
Aby uzyskać więcej informacji, zobacz Routing atrybutów z użyciem atrybutów Http[Verb].
Metoda CreatedAtAction:
-
Zwraca kod stanu HTTP 201, jeśli się powiedzie.
HTTP 201
to standardowa odpowiedź dlaHTTP POST
metody, która tworzy nowy zasób na serwerze. -
Dodaje nagłówek Location do odpowiedzi. Nagłówek
Location
określa identyfikator URI nowo utworzonego elementu do wykonania. Aby uzyskać więcej informacji, zobacz 10.2.2 201 Utworzono. - Odwołuje się do akcji
GetTodoItem
w celu utworzenia identyfikatora URI nagłówkaLocation
. Słowo kluczowe języka C#nameof
służy do unikania kodowania na stałe nazwy akcji w wywołaniuCreatedAtAction
.
Test PostTodoItem
Wybierz Widok>Inne okna>Eksplorator punktów końcowych.
Kliknij prawym przyciskiem myszy punkt końcowy POST i wybierz polecenie Generuj żądanie.
Nowy plik jest tworzony w folderze projektu o nazwie
TodoApi.http
, z zawartością podobną do następującego przykładu:@TodoApi_HostAddress = https://localhost:49738 POST {{TodoApi_HostAddress}}/api/todoitems Content-Type: application/json { //TodoItem } ###
- Pierwszy wiersz tworzy zmienną używaną dla wszystkich punktów końcowych.
- Następny wiersz definiuje żądanie POST.
- Wiersze po wierszu żądania POST definiują nagłówki i symbol zastępczy treści żądania.
- Potrójny hasztag (
###
) jest ogranicznikiem żądania: to, co następuje po nim, jest przeznaczone dla innego żądania.
Żądanie POST oczekuje
TodoItem
. Aby zdefiniować todo, zastąp komentarz//TodoItem
następującym kodem JSON:{ "name": "walk dog", "isComplete": true }
Plik TodoApi.http powinien teraz wyglądać podobnie do poniższego przykładu, ale z numerem portu:
@TodoApi_HostAddress = https://localhost:7260 Post {{TodoApi_HostAddress}}/api/todoitems Content-Type: application/json { "name": "walk dog", "isComplete": true } ###
Uruchom aplikację.
Wybierz link Wyślij żądanie powyżej
POST
wiersza żądania.Żądanie POST jest wysyłane do aplikacji, a odpowiedź jest wyświetlana w okienku Odpowiedź .
Testowanie URI nagłówka Location
Przetestuj GET
aplikację, wywołując punkty końcowe z przeglądarki lub przy użyciu Eksploratora punktów końcowych. Poniższe kroki dotyczą Eksploratora punktów końcowych.
W Eksploratorze punktów końcowych kliknij prawym przyciskiem myszy pierwszy punkt końcowy GET i wybierz polecenie Generuj żądanie.
Do pliku zostanie dodana następująca
TodoApi.http
zawartość:GET {{TodoApi_HostAddress}}/api/todoitems ###
Wybierz link Wyślij żądanie powyżej nowego
GET
wiersza żądania.Żądanie GET jest wysyłane do aplikacji, a odpowiedź jest wyświetlana w okienku Odpowiedź .
Treść odpowiedzi jest podobna do następującego kodu JSON:
[ { "id": 1, "name": "walk dog", "isComplete": true } ]
W Eksploratorze punktów końcowych kliknij prawym przyciskiem
/api/todoitems/{id}
myszy punkt końcowy GET i wybierz pozycję Generuj żądanie. Do pliku zostanie dodana następującaTodoApi.http
zawartość:@id=0 GET {{TodoApi_HostAddress}}/api/todoitems/{{id}} ###
Przypisz
{@id}
do1
(zamiast0
).Wybierz link Wyślij żądanie powyżej nowego wiersza żądania GET.
Żądanie GET jest wysyłane do aplikacji, a odpowiedź jest wyświetlana w okienku Odpowiedź .
Treść odpowiedzi jest podobna do następującego kodu JSON:
{ "id": 1, "name": "walk dog", "isComplete": true }
Zbadanie metod GET
Zaimplementowano dwa punkty końcowe GET:
GET /api/todoitems
GET /api/todoitems/{id}
W poprzedniej sekcji przedstawiono przykład /api/todoitems/{id}
trasy.
Postępuj zgodnie z instrukcjami POST, aby dodać kolejny element zadania do wykonania, a następnie przetestuj /api/todoitems
trasę przy użyciu narzędzia Swagger.
Ta aplikacja używa bazy danych w pamięci. Jeśli aplikacja zostanie zatrzymana i uruchomiona, powyższe żądanie GET nie zwraca żadnych danych. Jeśli żadne dane nie są zwracane, prześlij dane metodą POST do aplikacji.
Routing i ścieżki adresów URL
Atrybut [HttpGet]
określa metodę, która odpowiada na HTTP GET
żądanie. Ścieżka adresu URL dla każdej metody jest skonstruowana w następujący sposób:
Zacznij od ciągu szablonu w atrybucie kontrolera
Route
:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase
Zastąp
[controller]
nazwę kontrolera, który zgodnie z konwencją jest nazwą klasy kontrolera minus końcówka "Kontroler". W tym przykładzie nazwa klasy kontrolera to TodoItemsController, więc nazwa kontrolera to "TodoItems". ASP.NET Core routing jest niewrażliwy na wielkość liter.[HttpGet]
Jeśli atrybut ma szablon trasy (na przykład[HttpGet("products")]
), dołącz go do ścieżki. Ten przykład nie używa szablonu. Aby uzyskać więcej informacji, zobacz Routing atrybutowy z użyciem atrybutów Http[Verb].
W poniższej metodzie GetTodoItem
, zmienna "{id}"
pełni rolę zastępczą dla unikatowego identyfikatora zadania do wykonania. Gdy GetTodoItem
jest wywoływane, wartość "{id}"
w adresie URL jest przekazywana do metody jako parametr id
.
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
Wartości zwracane
Typ zwracany przez metody GetTodoItems
i GetTodoItem
to typ ActionResult<T>. ASP.NET Core automatycznie serializuje obiekt w formacie JSON i zapisuje kod JSON w treści komunikatu odpowiedzi. Kod odpowiedzi dla tego typu zwracanego to 200 OK, zakładając, że nie ma żadnych nieobsługiwanych wyjątków. Nieobsługiwane wyjątki są tłumaczone na błędy 5xx.
ActionResult
typy zwracane mogą reprezentować szeroką gamę kodów stanu HTTP. Na przykład GetTodoItem
może zwrócić dwie różne wartości stanu:
- Jeśli żaden element nie pasuje do żądanego identyfikatora, metoda zwraca kod błędu stanuNotFound 404.
- W przeciwnym razie, metoda zwraca wartość 200 z ciałem odpowiedzi w formacie JSON. Zwrócenie
item
wyników skutkujeHTTP 200
odpowiedzią.
Metoda PutTodoItem
Przeanalizuj metodę PutTodoItem
:
[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();
}
PutTodoItem
jest podobny do PostTodoItem
, z wyjątkiem tego, że używa HTTP PUT
. Odpowiedź to 204 (brak zawartości). Zgodnie ze specyfikacją PUT
PROTOKOŁU HTTP żądanie wymaga od klienta wysłania całej zaktualizowanej jednostki, a nie tylko zmian. Aby obsługiwać aktualizacje częściowe, użyj poprawki HTTP PATCH.
Testowanie metody PutTodoItem
W tym przykładzie użyto bazy danych w pamięci, która musi zostać zainicjowana przy każdym uruchomieniu aplikacji. Przed wykonaniem wywołania PUT musi istnieć element w bazie danych. Wywołaj metodę GET, aby upewnić się, że istnieje element w bazie danych przed wykonaniem wywołania PUT.
Użyj metody PUT
, aby zaktualizować TodoItem
o identyfikatorze = 1 i ustawić jej nazwę na "feed fish"
. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
W Eksploratorze punktów końcowych kliknij prawym przyciskiem myszy punkt końcowy PUT i wybierz pozycję Generuj żądanie.
Do pliku zostanie dodana następująca
TodoApi.http
zawartość:PUT {{TodoApi_HostAddress}}/api/todoitems/{{id}} Content-Type: application/json { //TodoItem } ###
W wierszu żądania PUT zastąp ciąg
{{id}}
ciągiem1
.Zastąp symbol zastępczy
//TodoItem
następującymi wierszami:PUT {{TodoApi_HostAddress}}/api/todoitems/1 Content-Type: application/json { "id": 1, "name": "feed fish", "isComplete": false }
Wybierz link Wyślij żądanie powyżej nowego wiersza żądania PUT.
Żądanie PUT jest wysyłane do aplikacji, a odpowiedź jest wyświetlana w okienku Odpowiedź . Treść odpowiedzi jest pusta, a kod stanu to 204.
Metoda DeleteTodoItem
Przeanalizuj metodę DeleteTodoItem
:
[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();
}
Testowanie metody DeleteTodoItem
Użyj metody DELETE
, aby usunąć TodoItem
o identyfikatorze = 1. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
W Eksploratorze punktów końcowych kliknij prawym przyciskiem myszy punkt końcowy DELETE i wybierz pozycję Generuj żądanie.
Żądanie DELETE jest dodawane do
TodoApi.http
.Zastąp
{{id}}
w wierszu żądania DELETE na1
. Żądanie DELETE powinno wyglądać podobnie do następującego przykładu:DELETE {{TodoApi_HostAddress}}/api/todoitems/{{id}} ###
Wybierz link Wyślij żądanie dla żądania DELETE.
Żądanie DELETE jest wysyłane do aplikacji, a odpowiedź jest wyświetlana w okienku Odpowiedź . Treść odpowiedzi jest pusta, a kod stanu to 204.
Testowanie za pomocą innych narzędzi
Istnieje wiele innych narzędzi, których można użyć do testowania internetowych interfejsów API, na przykład:
Aby uzyskać więcej informacji, zobacz:
Zapobieganie nadmiernemu publikowaniu
Obecnie przykładowa aplikacja uwidacznia cały TodoItem
obiekt. Aplikacje produkcyjne zwykle ograniczają dane wejściowe i zwracane przy użyciu podzestawu modelu. Istnieje wiele powodów, a bezpieczeństwo jest jednym z głównych. Podzbiór modelu jest zwykle nazywany obiektem transferu danych (DTO), modelem wejściowym lub modelem widoku.
DTO jest używany w tym samouczku.
DTO może służyć do:
- Zapobiegaj nadmiernemu publikowaniu.
- Ukryj właściwości, których klienci nie powinni wyświetlać.
- Pomiń niektóre właściwości, aby zmniejszyć rozmiar ładunku.
- Spłaszczaj grafy obiektów zawierających zagnieżdżone obiekty. Spłaszczone grafy obiektów mogą być wygodniejsze dla klientów.
Aby zademonstrować podejście DTO, zaktualizuj klasę TodoItem
tak, aby zawierała pole tajne.
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; }
}
Pole tajne musi być ukryte w tej aplikacji, ale aplikacja administracyjna może je uwidocznić.
Sprawdź, czy możesz opublikować i uzyskać pole tajne.
Utwórz model DTO w pliku Models/TodoItemsDTO.cs:
namespace TodoApi.Models;
public class TodoItemDTO
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Zaktualizuj TodoItemsController
tak, aby używał TodoItemDTO
.
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
};
}
Sprawdź, czy nie możesz publikować ani uzyskiwać dostępu do pola tajnego.
Wywoływanie internetowego interfejsu API za pomocą języka JavaScript
Cykl filmów o webowym API
Zobacz Wideo: Seria dla początkujących dotycząca: Web APIs.
Wzorce aplikacji internetowej dla przedsiębiorstw
Aby uzyskać wskazówki dotyczące tworzenia niezawodnej, bezpiecznej, wydajnej, testowalnej i skalowalnej aplikacji ASP.NET Core, zobacz wzorce aplikacji internetowych Enterprise. Dostępna jest kompletna przykładowa aplikacja internetowa jakości produkcyjnej, która implementuje wzorce.
Dodawanie obsługi uwierzytelniania do internetowego interfejsu API
ASP.NET Core Identity dodaje funkcjonalność logowania w interfejsie użytkownika (UI) do aplikacji internetowych ASP.NET Core. Aby zabezpieczyć internetowe interfejsy API i SPA, użyj jednego z następujących elementów.
Duende Identity Server to platforma OpenID Connect i OAuth 2.0 dla platformy ASP.NET Core. Serwer Duende Identity umożliwia korzystanie z następujących funkcji zabezpieczeń:
- Uwierzytelnianie jako usługa (AaaS)
- Logowanie jednokrotne/wyłączanie logowania jednokrotnego w wielu typach aplikacji
- Kontrola dostępu dla interfejsów API
- Brama federacyjna
Ważne
Oprogramowanie Duende może wymagać zapłacenia opłaty licencyjnej za korzystanie z serwera Duende Identity Server w środowisku produkcyjnym. Aby uzyskać więcej informacji, zobacz Migracja z platformy ASP.NET Core w wersji 5.0 do wersji 6.0.
Aby uzyskać więcej informacji, zobacz dokumentację serwera Duende (witryna internetowa Duende Identity Software).
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Szybki start: wdrażanie aplikacji internetowej ASP.NET.
Dodatkowe zasoby
Wyświetl lub pobierz przykładowy kod dla tego samouczka. Zobacz , jak pobrać.
Aby uzyskać więcej informacji, zobacz następujące zasoby:
- Tworzenie internetowych interfejsów API za pomocą platformy ASP.NET Core
- Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core
- Korzystanie z wygenerowanych dokumentów OpenAPI
- Dokumentacja webowego API ASP.NET Core z użyciem Swagger / OpenAPI
- Razor Strony przy użyciu Entity Framework Core w ASP.NET Core — samouczek 1 z 8
- Routing do akcji kontrolera na platformie ASP.NET Core
- Zwracane typy akcji kontrolera w internetowym interfejsie API platformy ASP.NET Core
- Wdrażanie aplikacji ASP.NET Core w usłudze Azure App Service
- Hostowanie i wdrażanie ASP.NET Core
- Tworzenie internetowego interfejsu API przy użyciu platformy ASP.NET Core
W tym samouczku przedstawiono podstawy tworzenia web API bazującego na kontrolerze, korzystającego z bazy danych. Innym podejściem do tworzenia interfejsów API w środowisku ASP.NET Core jest utworzenie minimalnych interfejsów API. Aby uzyskać pomoc dotyczącą wybierania między minimalnymi interfejsami API i interfejsami API opartymi na kontrolerach, zobacz Omówienie interfejsów API. Aby zapoznać się z samouczkiem dotyczącym tworzenia minimalnego interfejsu API, zobacz Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core.
Omówienie
Ten samouczek tworzy następujący interfejs API:
Interfejs API | opis | Treść żądania | Treść odpowiedzi |
---|---|---|---|
GET /api/todoitems |
Uzyskaj wszystkie elementy do wykonania | Brak | Tablica elementów do wykonania |
GET /api/todoitems/{id} |
Uzyskaj element po identyfikatorze | Brak | Element do wykonania |
POST /api/todoitems |
Dodawanie nowego elementu | Element do wykonania | Element do wykonania |
PUT /api/todoitems/{id} |
Aktualizowanie istniejącego elementu | Element do wykonania | Brak |
DELETE /api/todoitems/{id} |
Usuwanie elementu | Brak | Brak |
Na poniższym diagramie przedstawiono projekt aplikacji.
Wymagania wstępne
Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych.
Tworzenie projektu internetowego
- W menu Plik wybierz pozycję Nowy>projekt.
- Wprowadź Web API w polu wyszukiwania.
- Wybierz szablon internetowego interfejsu API platformy ASP.NET Core i wybierz pozycję Dalej.
- W oknie dialogowym Konfigurowanie nowego projektu nadaj projektowi nazwę TodoApi i wybierz pozycję Dalej.
-
W oknie dialogowym Dodatkowe informacje:
- Potwierdź, że platforma to .NET 8.0 (obsługa długoterminowa).
- Upewnij się, że pole wyboru Użyj kontrolerów (usuń zaznaczenie pola wyboru, aby używać minimalnych interfejsów API) jest zaznaczone.
- Upewnij się, że zaznaczono pole wyboru Włącz obsługę interfejsu OpenAPI.
- Wybierz pozycję Utwórz.
Dodawanie pakietu NuGet
Aby obsługiwać bazę danych używaną w tym samouczku, konieczne jest dodanie pakietu NuGet.
- W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > Zarządzaj pakietami NuGet dla rozwiązania.
- Wybierz kartę Przeglądaj.
- Wprowadź ciąg Microsoft.EntityFrameworkCore.InMemory w polu wyszukiwania, a następnie wybierz pozycję
Microsoft.EntityFrameworkCore.InMemory
. - Zaznacz pole wyboru Projekt w okienku po prawej stronie, a następnie wybierz pozycję Zainstaluj.
Uwaga
Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.
Testowanie projektu
Szablon projektu tworzy WeatherForecast
API z obsługą Swagger.
Naciśnij Ctrl+F5, aby uruchomić bez debugera.
Program Visual Studio wyświetla następujące okno dialogowe, gdy projekt nie jest jeszcze skonfigurowany do używania protokołu SSL:
Wybierz pozycję Tak , jeśli ufasz certyfikatowi SSL usług IIS Express.
Zostanie wyświetlone następujące okno dialogowe:
Wybierz pozycję Tak, jeśli wyrażasz zgodę na zaufanie certyfikatowi programistycznemu.
Aby uzyskać informacje na temat zaufania certyfikatom w przeglądarce Firefox, zobacz Błąd certyfikatu SEC_ERROR_INADEQUATE_KEY_USAGE w przeglądarce Firefox.
Program Visual Studio uruchamia domyślną przeglądarkę i przechodzi do https://localhost:<port>/swagger/index.html
adresu, gdzie <port>
jest losowo przydzielonym numerem portu ustawionym podczas tworzenia projektu.
Wyświetlana jest strona Swagger /swagger/index.html
. Wybierz GET>Wypróbuj>Wykonaj. Strona wyświetla:
- Polecenie Curl w celu przetestowania interfejsu API WeatherForecast.
- Adres URL do przetestowania interfejsu API WeatherForecast.
- Kod odpowiedzi, treść i nagłówki.
- Pole listy rozwijanej z typami multimediów oraz przykładową wartością i schematem.
Jeśli strona Swagger nie jest wyświetlana, zobacz ten problem na GitHub.
Narzędzie Swagger służy do generowania przydatnej dokumentacji i stron pomocy dla internetowych interfejsów API. W tym samouczku do testowania aplikacji używany jest Swagger. Aby uzyskać więcej informacji na temat struktury Swagger, zobacz dokumentację internetowego interfejsu API platformy ASP.NET Core za pomocą programu Swagger/OpenAPI.
Skopiuj i wklej adres URL żądania w przeglądarce: https://localhost:<port>/weatherforecast
Zwracany jest kod JSON podobny do następującego przykładu:
[
{
"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"
}
]
Dodawanie klasy modelu
Model to zestaw klas reprezentujących dane, którymi zarządza aplikacja. Model dla tej aplikacji jest klasą TodoItem
.
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt. Wybierz pozycję Dodaj>nowy folder. Nadaj folderowi
Models
nazwę . - Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoItem i wybierz pozycję Dodaj. - Zastąp kod szablonu następującym kodem:
namespace TodoApi.Models;
public class TodoItem
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Właściwość Id
działa jako unikatowy klucz w relacyjnej bazie danych.
Klasy modeli mogą znajdować się w dowolnym miejscu w projekcie, ale Models
folder jest używany zgodnie z konwencją.
Dodawanie kontekstu bazy danych
Kontekst bazy danych jest klasą główną, która koordynuje funkcje programu Entity Framework dla modelu danych. Ta klasa jest tworzona przez wyprowadzanie z Microsoft.EntityFrameworkCore.DbContext klasy .
- Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoContext i kliknij przycisk Dodaj.
Wprowadź następujące kod:
using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } = null!; }
Rejestrowanie kontekstu bazy danych
W ASP.NET Core usługi, takie jak kontekst bazy danych, muszą być zarejestrowane w kontenerze DI (wstrzykiwania zależności). Kontener udostępnia usługę kontrolerom.
Zaktualizuj Program.cs
za pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(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();
Poprzedni kod:
- Dodaje
using
dyrektywy. - Dodaje kontekst bazy danych do kontenera DI.
- Określa, że kontekst bazy danych będzie używać bazy danych w pamięci.
Tworzenie szkieletu kontrolera
Kliknij prawym przyciskiem myszy
Controllers
folder.Wybierz Dodaj>New Scaffolded Item.
Wybierz pozycję Kontroler interfejsu API z akcjami przy użyciu platformy Entity Framework, a następnie wybierz pozycję Dodaj.
W oknie dialogowym Dodaj kontroler API z akcjami przy użyciu Entity Framework:
- Wybierz element TodoItem (TodoApi.Models) w klasa Model.
- Wybierz pozycję TodoContext (TodoApi.Models) w klasie Kontekst danych.
- Wybierz Dodaj.
Jeśli operacja tworzenia szkieletu nie powiedzie się, wybierz pozycję Dodaj , aby spróbować utworzyć szkielet po raz drugi.
Wygenerowany kod:
- Oznacza klasę za pomocą atrybutu
[ApiController]
. Ten atrybut wskazuje, że kontroler odpowiada na żądania internetowego interfejsu API. Aby uzyskać informacje o konkretnych zachowaniach, które włącza atrybut, zobacz Tworzenie internetowych interfejsów API za pomocą ASP.NET Core. - Używa DI do wstrzykiwania kontekstu bazy danych (
TodoContext
) do kontrolera. Kontekst bazy danych jest używany w każdej z metod CRUD w kontrolerze.
Szablony ASP.NET Core dla:
- Kontrolery z widokami zawierają
[action]
w szablonie trasy. - Kontrolery interfejsów API nie uwzględniają
[action]
w szablonie trasy.
[action]
Jeśli token nie znajduje się w szablonie trasy, nazwa akcji (nazwa metody) nie jest uwzględniona w punkcie końcowym. Oznacza to, że skojarzona nazwa metody akcji nie jest używana w pasującej ścieżce.
Aktualizowanie metody PostTodoItem create
Zaktualizuj instrukcję return w elemencie PostTodoItem
, aby użyć operatora nameof:
[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);
}
Kod wyżej jest metodą HTTP POST
, co jest wskazane przez atrybut [HttpPost]
. Metoda pobiera wartość TodoItem
z treści żądania HTTP.
Aby uzyskać więcej informacji, zobacz Routing za pomocą atrybutów Http[Verb].
Metoda CreatedAtAction:
-
Zwraca kod stanu HTTP 201, jeśli się powiedzie.
HTTP 201
to standardowa odpowiedź dlaHTTP POST
metody, która tworzy nowy zasób na serwerze. -
Dodaje nagłówek Location do odpowiedzi. Nagłówek
Location
określa identyfikator URI nowo utworzonego elementu do wykonania. Aby uzyskać więcej informacji, zobacz 10.2.2 201 Utworzono. - Odwołuje się do akcji
GetTodoItem
w celu utworzenia identyfikatora URI nagłówkaLocation
. Słowo kluczowe języka C#nameof
służy do unikania kodowania na stałe nazwy akcji w wywołaniuCreatedAtAction
.
Test PostTodoItem
Naciśnij Ctrl+F5, aby uruchomić aplikację.
W oknie przeglądarki struktury Swagger wybierz pozycję POST /api/TodoItems, a następnie wybierz pozycję Wypróbuj.
W oknie Request body zaktualizuj kod JSON. Na przykład:
{ "name": "walk dog", "isComplete": true }
Wybierz przycisk Wykonaj.
Przetestuj identyfikator URI nagłówka lokalizacji
W poprzednim wpisie interfejs użytkownika Swagger pokazuje nagłówek lokalizacji w sekcji nagłówków odpowiedzi. Na przykład location: https://localhost:7260/api/TodoItems/1
. Nagłówek lokalizacji zawiera identyfikator URI utworzonego zasobu.
Aby przetestować nagłówek lokalizacji:
W oknie Swagger wybierz GET /api/TodoItems/{id}, a następnie wybierz Wypróbuj to.
Wprowadź
1
w polu wejściowymid
, a następnie wybierz pozycję Wykonaj.
Analiza metod GET
Zaimplementowano dwa punkty końcowe GET:
GET /api/todoitems
GET /api/todoitems/{id}
W poprzedniej sekcji przedstawiono przykład /api/todoitems/{id}
trasy.
Postępuj zgodnie z instrukcjami POST, aby dodać kolejne zadanie do wykonania, a następnie przetestuj /api/todoitems
ścieżkę przy użyciu Swagger.
Ta aplikacja używa bazy danych w pamięci. Jeśli aplikacja zostanie zatrzymana i uruchomiona, powyższe żądanie GET nie zwraca żadnych danych. Jeśli żadne dane nie są zwracane, zgłoś dane za pomocą POST do aplikacji.
Routing i ścieżki URL
Atrybut [HttpGet]
określa metodę, która odpowiada na HTTP GET
żądanie. Ścieżka adresu URL dla każdej metody jest skonstruowana w następujący sposób:
Zacznij od ciągu szablonu w atrybucie kontrolera
Route
:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase
Zastąp
[controller]
nazwą kontrolera, która zgodnie z konwencją jest nazwą klasy kontrolera bez przyrostka "Kontroler". W tym przykładzie nazwa klasy kontrolera to TodoItemsController, więc nazwa kontrolera to "TodoItems". Trasowanie w ASP.NET Core jest niewrażliwe na wielkość liter.[HttpGet]
Jeśli atrybut ma szablon trasy (na przykład[HttpGet("products")]
), dołącz go do ścieżki. Ten przykład nie używa szablonu. Aby uzyskać więcej informacji, zobacz Routing atrybutów z użyciem atrybutów Http[Verb].
W poniższej metodzie GetTodoItem
zmienna "{id}"
jest zastępcza dla unikalnego identyfikatora zadania do wykonania. Gdy GetTodoItem
jest wywoływane, wartość "{id}"
w adresie URL jest udostępniana metodzie w parametrze id
.
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
Wartości zwracane
Typ zwracany metod GetTodoItems
oraz GetTodoItem
to ActionResult<T>. ASP.NET Core automatycznie serializuje obiekt w formacie JSON i zapisuje kod JSON w treści komunikatu odpowiedzi. Kod odpowiedzi dla tego typu zwracanego to 200 OK, zakładając, że nie ma żadnych nieobsługiwanych wyjątków. Nieobsługiwane wyjątki są tłumaczone na błędy 5xx.
ActionResult
typy zwracane mogą reprezentować szeroką gamę kodów stanu HTTP. Na przykład GetTodoItem
może zwrócić dwie różne wartości stanu:
- Jeśli żaden element nie pasuje do żądanego identyfikatora, metoda zwraca kod błędu stanuNotFound 404.
- W przeciwnym razie metoda zwraca kod 200 z treścią odpowiedzi JSON. Zwracanie wyników
item
powoduje odpowiedźHTTP 200
.
Metoda PutTodoItem
Przeanalizuj metodę PutTodoItem
:
[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();
}
PutTodoItem
jest podobny do PostTodoItem
, z wyjątkiem tego, że używa HTTP PUT
. Odpowiedź to 204 (brak zawartości). Zgodnie ze specyfikacją PUT
PROTOKOŁU HTTP żądanie wymaga od klienta wysłania całej zaktualizowanej jednostki, a nie tylko zmian. Aby obsługiwać aktualizacje częściowe, użyj poprawki HTTP PATCH.
Testowanie metody PutTodoItem
W tym przykładzie użyto bazy danych w pamięci, która musi zostać zainicjowana przy każdym uruchomieniu aplikacji. Przed wykonaniem wywołania PUT musi istnieć element w bazie danych. Wywołaj metodę GET, aby upewnić się, że istnieje element w bazie danych przed wykonaniem wywołania PUT.
Korzystając z interfejsu Swagger UI, użyj przycisku PUT, aby zaktualizować TodoItem
o Id = 1 i ustawić jego nazwę na "feed fish"
. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
Metoda DeleteTodoItem
Przeanalizuj metodę DeleteTodoItem
:
[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();
}
Testowanie metody DeleteTodoItem
Użyj interfejsu użytkownika Swagger UI, aby usunąć TodoItem
o Id = 1. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
Testowanie za pomocą innych narzędzi
Istnieje wiele innych narzędzi, których można użyć do testowania internetowych interfejsów API, na przykład:
- Eksplorator punktów końcowych programu Visual Studio i pliki HTTP
- http-repl
-
curl. Narzędzie Swagger używa
curl
i pokazuje, jakie poleceniacurl
wysyła. - Fiddler
Aby uzyskać więcej informacji, zobacz:
- Samouczek dotyczący minimalnego interfejsu API: testowanie przy użyciu plików HTTP i Eksploratora punktów końcowych
-
Instalowanie i testowanie interfejsów API za pomocą polecenia
http-repl
Zapobieganie nadmiernemu publikowaniu
Obecnie przykładowa aplikacja uwidacznia cały TodoItem
obiekt. Aplikacje produkcyjne zwykle ograniczają dane wejściowe i zwracane przy użyciu podzestawu modelu. Istnieje wiele powodów stojących za tym, a jednym z głównych jest bezpieczeństwo. Podzbiór modelu jest zwykle nazywany obiektem transferu danych (DTO), modelem wejściowym lub modelem widoku.
DTO jest używany w tym samouczku.
DTO może służyć do:
- Zapobiegaj nadmiernemu publikowaniu.
- Ukryj właściwości, których klienci nie powinni wyświetlać.
- Pomiń niektóre właściwości, aby zmniejszyć rozmiar ładunku.
- Spłaszczane wykresy obiektów zawierające zagnieżdżone obiekty. Spłaszczone grafy obiektów mogą być wygodniejsze dla klientów.
Aby zademonstrować podejście DTO, zaktualizuj klasę TodoItem
tak, aby zawierała tajne pole.
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; }
}
}
Tajne pole musi być ukryte przed tą aplikacją, ale aplikacja administracyjna może je ujawnić.
Sprawdź, czy możesz wysłać i pobrać pole sekretne.
Tworzenie modelu DTO:
namespace TodoApi.Models;
public class TodoItemDTO
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Zaktualizuj TodoItemsController
, aby używał TodoItemDTO
.
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
};
}
Sprawdź, czy nie możesz publikować ani pobierać pola wpisu tajnego.
Wywoływanie internetowego interfejsu API za pomocą języka JavaScript
Seria wideo internetowego interfejsu API
Zobacz Wideo: Seria dla początkujących o: API sieciowych.
Wzorce aplikacji internetowej dla przedsiębiorstw
Aby uzyskać wskazówki dotyczące tworzenia niezawodnej, bezpiecznej, wydajnej, testowalnej i skalowalnej aplikacji ASP.NET Core, zobacz wzorce aplikacji internetowych Enterprise. Dostępna jest kompletna przykładowa aplikacja internetowa jakości produkcyjnej, która implementuje wzorce.
Dodawanie obsługi uwierzytelniania do internetowego interfejsu API
ASP.NET Core Identity dodaje funkcje logowania interfejsu użytkownika do aplikacji internetowych platformy ASP.NET Core. Aby zabezpieczyć webowe interfejsy API i SPA, użyj jednego z następujących:
Duende Identity Server to platforma OpenID Connect i OAuth 2.0 dla platformy ASP.NET Core. Serwer Duende Identity umożliwia korzystanie z następujących funkcji zabezpieczeń:
- Uwierzytelnianie jako usługa (AaaS)
- Logowanie jednokrotne/wylogowanie jednokrotne dla różnych typów aplikacji
- Kontrola dostępu dla interfejsów API
- Brama federacyjna
Ważne
Oprogramowanie Duende może wymagać zapłacenia opłaty licencyjnej za korzystanie z serwera Duende Identity Server w środowisku produkcyjnym. Aby uzyskać więcej informacji, zobacz Migracja z platformy ASP.NET Core w wersji 5.0 do wersji 6.0.
Aby uzyskać więcej informacji, zobacz dokumentację serwera Duende (witryna internetowa Duende Identity Software).
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Szybki start: wdrażanie aplikacji internetowej ASP.NET.
Dodatkowe zasoby
Wyświetl lub pobierz przykładowy kod dla tego samouczka. Zobacz , jak pobrać.
Aby uzyskać więcej informacji, zobacz następujące zasoby:
- Tworzenie internetowych interfejsów API za pomocą platformy ASP.NET Core
- Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core
- Dokumentacja ASP.NET Core web API ze Swagger / OpenAPI
- Razor Strony z użyciem Entity Framework Core w ASP.NET Core — przewodnik 1 z 8
- Routing do akcji kontrolera na platformie ASP.NET Core
- Zwracane typy akcji kontrolera w API sieciowej platformy ASP.NET Core
- Wdrażanie aplikacji ASP.NET Core w usłudze Azure App Service
- Hostowanie i wdrażanie ASP.NET Core
- Tworzenie internetowego interfejsu API przy użyciu platformy ASP.NET Core
W tym samouczku nauczysz się podstaw tworzenia interfejsu API sieci opartego na kontrolerze, który używa bazy danych. Innym podejściem do tworzenia interfejsów API w środowisku ASP.NET Core jest utworzenie minimalnych interfejsów API. Aby uzyskać pomoc dotyczącą wybierania między minimalnymi interfejsami API i interfejsami API opartymi na kontrolerach, zobacz Omówienie interfejsów API. Aby zapoznać się z samouczkiem dotyczącym tworzenia minimalnego interfejsu API, zobacz Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core.
Omówienie
Ten samouczek tworzy następujący interfejs API:
Interfejs API | opis | Treść żądania | Treść odpowiedzi |
---|---|---|---|
GET /api/todoitems |
Uzyskaj wszystkie zadania do wykonania | Brak | Tablica elementów do wykonania |
GET /api/todoitems/{id} |
Pobieranie elementu według identyfikatora | Brak | Element do wykonania |
POST /api/todoitems |
Dodawanie nowego elementu | Element do wykonania | Element do wykonania |
PUT /api/todoitems/{id} |
Aktualizowanie istniejącego elementu | Element do wykonania | Brak |
DELETE /api/todoitems/{id} |
Usuwanie elementu | Brak | Brak |
Na poniższym diagramie przedstawiono projekt aplikacji.
Wymagania wstępne
Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych.
Tworzenie projektu internetowego
- W menu Plik wybierz pozycję Nowy>projekt.
- Wprowadź Web API w polu wyszukiwania.
- Wybierz szablon internetowego interfejsu API platformy ASP.NET Core i wybierz pozycję Dalej.
- W oknie dialogowym Konfigurowanie nowego projektu nadaj projektowi nazwę TodoApi i wybierz pozycję Dalej.
-
W oknie dialogowym Dodatkowe informacje:
- Upewnij się, że platforma .NET 8.0 (obsługa długoterminowa).
- Upewnij się, że pole wyboru Użyj kontrolerów (usuń zaznaczenie pola wyboru, aby używać minimalnych interfejsów API) jest zaznaczone.
- Upewnij się, że zaznaczono pole wyboru Włącz obsługę interfejsu OpenAPI.
- Wybierz pozycję Utwórz.
Dodawanie pakietu NuGet
Aby zapewnić obsługę bazy danych używanej w tym samouczku, należy dodać pakiet NuGet.
- W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów > Zarządzaj pakietami NuGet dla rozwiązania.
- Wybierz kartę Przeglądaj.
- Wprowadź ciąg Microsoft.EntityFrameworkCore.InMemory w polu wyszukiwania, a następnie wybierz pozycję
Microsoft.EntityFrameworkCore.InMemory
. - Zaznacz pole wyboru Projekt w okienku po prawej stronie, a następnie wybierz pozycję Zainstaluj.
Uwaga
Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.
Testowanie projektu
Szablon projektu tworzy interfejs API z obsługą Swaggera.
Naciśnij Ctrl+F5, aby uruchomić bez debugera.
Program Visual Studio wyświetla następujące okno dialogowe, gdy projekt nie jest jeszcze skonfigurowany do używania protokołu SSL:
Wybierz pozycję Tak , jeśli ufasz certyfikatowi SSL usług IIS Express.
Zostanie wyświetlone następujące okno dialogowe:
Wybierz pozycję Tak, jeśli wyrażasz zgodę na zaufanie certyfikatowi programistycznemu.
Aby uzyskać informacje na temat zaufania przeglądarce Firefox, zobacz Błąd certyfikatu przeglądarki Firefox SEC_ERROR_INADEQUATE_KEY_USAGE.
Program Visual Studio uruchamia domyślną przeglądarkę i przechodzi do https://localhost:<port>/swagger/index.html
, gdzie <port>
jest losowo wybranym numerem portu ustawionym podczas tworzenia projektu.
Strona /swagger/index.html
Swagger jest wyświetlana. Wybierz GET>Wypróbuj>Wykonaj. Strona wyświetla:
- Polecenie Curl w celu przetestowania interfejsu API WeatherForecast.
- Adres URL do przetestowania interfejsu API WeatherForecast.
- Kod odpowiedzi, treść i nagłówki.
- Pole listy rozwijanej z typami multimediów oraz przykładową wartością i schematem.
Jeśli strona Swagger nie pojawia się, zobacz ten problem na GitHubie.
Narzędzie Swagger służy do generowania przydatnej dokumentacji i stron pomocy dla internetowych interfejsów API. Ten samouczek wykorzystuje Swagger do testowania aplikacji. Aby uzyskać więcej informacji na temat struktury Swagger, zobacz dokumentację internetowego interfejsu API platformy ASP.NET Core za pomocą programu Swagger/OpenAPI.
Skopiuj i wklej adres URL żądania w przeglądarce: https://localhost:<port>/weatherforecast
Zwracany jest kod JSON podobny do następującego przykładu:
[
{
"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"
}
]
Dodawanie klasy modelu
Model to zestaw klas reprezentujących dane, którymi zarządza aplikacja. Model dla tej aplikacji jest klasą TodoItem
.
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt. Wybierz pozycję Dodaj>nowy folder. Nadaj folderowi
Models
nazwę . - Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoItem i wybierz pozycję Dodaj. - Zastąp kod szablonu następującym kodem:
namespace TodoApi.Models;
public class TodoItem
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Właściwość Id
działa jako unikatowy klucz w relacyjnej bazie danych.
Klasy modeli mogą znajdować się w dowolnym miejscu w projekcie, ale Models
folder jest używany zgodnie z konwencją.
Dodawanie kontekstu bazy danych
Kontekst bazy danych jest klasą główną, która koordynuje funkcje programu Entity Framework dla modelu danych. Ta klasa jest tworzona przez wyprowadzanie z Microsoft.EntityFrameworkCore.DbContext klasy .
- Kliknij prawym przyciskiem
Models
myszy folder i wybierz polecenie Dodaj>klasę. Nadaj klasie nazwę TodoContext i kliknij przycisk Dodaj.
Wprowadź następujące kod:
using Microsoft.EntityFrameworkCore; namespace TodoApi.Models; public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } = null!; }
Rejestrowanie kontekstu bazy danych
W ASP.NET Core usługi, takie jak kontekst bazy danych, muszą być zarejestrowane w kontenerze do wstrzykiwania zależności (DI). Kontener udostępnia usługę kontrolerom.
Zaktualizuj Program.cs
za pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(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();
Powyższy kod:
- Dodaje
using
dyrektywy. - Dodaje kontekst bazy danych do kontenera DI.
- Określa, że kontekst bazy danych będzie używać bazy danych w pamięci.
Tworzenie szkieletu kontrolera
Kliknij folder
Controllers
prawym przyciskiem myszy.Wybierz Dodaj>New Scaffolded Item.
Wybierz pozycję Kontroler interfejsu API z akcjami przy użyciu platformy Entity Framework, a następnie wybierz pozycję Dodaj.
W oknie dialogowym 'Dodaj kontroler interfejsu API z akcjami przy użyciu programu Entity Framework':
- Wybierz TodoItem (TodoApi.Models) w klasie Model.
- Wybierz pozycję TodoContext (TodoApi.Models) w klasie Kontekst danych.
- Wybierz Dodaj.
Jeśli operacja tworzenia szkieletu nie powiedzie się, wybierz pozycję Dodaj , aby spróbować utworzyć szkielet po raz drugi.
Wygenerowany kod:
- Oznacza klasę za pomocą atrybutu
[ApiController]
. Ten atrybut wskazuje, że kontroler odpowiada na żądania internetowego interfejsu API. Aby uzyskać informacje o konkretnych zachowaniach, które włącza atrybut, zobacz Tworzenie internetowych interfejsów API za pomocą ASP.NET Core. - Używa DI do wstrzykiwania kontekstu bazy danych (
TodoContext
) do kontrolera. Kontekst bazy danych jest używany w każdej z metod CRUD w kontrolerze.
Szablony ASP.NET Core dla:
- Kontrolery z widokami zawierają
[action]
w szablonie trasy. - W kontrolerach interfejsów API nie uwzględnia się
[action]
w szablonie trasy.
Jeśli token [action]
nie znajduje się w szablonie trasy, nazwa akcji (nazwa metody) nie jest uwzględniana w punkcie końcowym. Oznacza to, że skojarzona nazwa metody akcji nie jest używana w odpowiedniej trasie.
Aktualizowanie metody PostTodoItem create
Zaktualizuj instrukcję return w elemencie PostTodoItem
, aby użyć operatora nameof.
[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);
}
Powyższy kod jest metodą, co wskazuje atrybut HTTP POST
[HttpPost]
. Metoda pobiera wartość TodoItem
z treści żądania HTTP.
Aby uzyskać więcej informacji, zobacz Routing atrybutów z wykorzystaniem atrybutów Http[Verb].
Metoda CreatedAtAction:
-
Zwraca kod stanu HTTP 201, jeśli się powiedzie.
HTTP 201
to standardowa odpowiedź dlaHTTP POST
metody, która tworzy nowy zasób na serwerze. -
Dodaje nagłówek Location do odpowiedzi. Nagłówek
Location
określa identyfikator URI nowo utworzonego elementu do wykonania. Aby uzyskać więcej informacji, zobacz 10.2.2 201 Created (Utworzono). - Odwołuje się do akcji
GetTodoItem
w celu utworzenia identyfikatora URI nagłówkaLocation
. Słowo kluczowe języka C#nameof
służy do unikania kodowania na stałe nazwy akcji w wywołaniuCreatedAtAction
.
Test PostTodoItem
Naciśnij Ctrl+F5, aby uruchomić aplikację.
W oknie Swagger wybierz POST /api/TodoItems, a następnie wybierz Wypróbuj.
W oknie wejściowym treści żądania zaktualizuj kod JSON. Na przykład:
{ "name": "walk dog", "isComplete": true }
Wybierz przycisk Wykonaj.
Przetestuj URI nagłówka lokalizacji
W poprzednim wpisie interfejs użytkownika struktury Swagger wyświetla nagłówek lokalizacji w sekcji Nagłówki odpowiedzi. Na przykład location: https://localhost:7260/api/TodoItems/1
. Nagłówek lokalizacji zawiera identyfikator URI utworzonego zasobu.
Aby przetestować nagłówek lokalizacji:
W oknie przeglądarki Swagger wybierz GET /api/TodoItems/{id}, a następnie Wypróbuj to.
Wprowadź
1
w polu wejściowymid
, a następnie wybierz pozycję Wykonaj.
Przegląd metod GET
Zaimplementowano dwa punkty końcowe GET:
GET /api/todoitems
GET /api/todoitems/{id}
W poprzedniej sekcji przedstawiono przykład /api/todoitems/{id}
trasy.
Postępuj zgodnie z instrukcjami POST, aby dodać kolejny element listy zadań, a następnie przetestuj /api/todoitems
ścieżkę za pomocą Swaggera.
Ta aplikacja używa bazy danych w pamięci. Jeśli aplikacja zostanie zatrzymana i uruchomiona, powyższe żądanie GET nie zwraca żadnych danych. Jeśli żadne dane nie są zwracane, wyślij dane metodą POST do aplikacji.
Routing i ścieżki adresów URL
Atrybut [HttpGet]
określa metodę, która odpowiada na HTTP GET
żądanie. Ścieżka adresu URL dla każdej metody jest skonstruowana w następujący sposób:
Zacznij od ciągu szablonu w atrybucie kontrolera
Route
:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase
Zastąp
[controller]
nazwą kontrolera, która zgodnie z konwencją jest nazwą klasy kontrolera bez sufiksu "Kontroler". W tym przykładzie nazwa klasy kontrolera to TodoItemsController, więc nazwa kontrolera to "TodoItems". ASP.NET Core routing jest niewrażliwy na wielkość liter.[HttpGet]
Jeśli atrybut ma szablon trasy (na przykład[HttpGet("products")]
), dołącz go do ścieżki. Ten przykład nie używa szablonu. Aby uzyskać więcej informacji, zapoznaj się z routingiem atrybutów za pomocą atrybutów Http[Verb].
W poniższej GetTodoItem
metodzie "{id}"
jest zmienną zastępczą unikatowego identyfikatora elementu do wykonania. Po wywołaniu GetTodoItem
wartość "{id}"
w adresie URL jest przekazywana do metody w parametrze id
.
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
Wartości zwracane
Zwracany typ metod GetTodoItems
i GetTodoItem
to typ ActionResult<T>. ASP.NET Core automatycznie serializuje obiekt w formacie JSON i zapisuje kod JSON w treści komunikatu odpowiedzi. Kod odpowiedzi dla tego typu zwrotnego to 200 OK, zakładając, że nie ma żadnych nieobsługiwanych wyjątków. Nieobsługiwane wyjątki są tłumaczone na błędy 5xx.
ActionResult
typy zwracane mogą reprezentować szeroką gamę kodów stanu HTTP. Na przykład GetTodoItem
może zwrócić dwie różne wartości stanu:
- Jeśli żaden element nie pasuje do żądanego identyfikatora, metoda zwraca kod błędu stanuNotFound 404.
- W przeciwnym razie metoda zwraca wartość 200 z treścią odpowiedzi JSON. Zwrócenie
item
skutkuje odpowiedziąHTTP 200
.
Metoda PutTodoItem
Przeanalizuj metodę PutTodoItem
:
[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();
}
PutTodoItem
jest podobny do PostTodoItem
, z wyjątkiem tego, że używa HTTP PUT
. Odpowiedź to 204 (brak zawartości). Zgodnie ze specyfikacją PUT
PROTOKOŁU HTTP żądanie wymaga od klienta wysłania całej zaktualizowanej jednostki, a nie tylko zmian. Aby obsługiwać aktualizacje częściowe, użyj poprawki HTTP PATCH.
Testowanie metody PutTodoItem
W tym przykładzie użyto bazy danych w pamięci, która musi zostać zainicjowana przy każdym uruchomieniu aplikacji. Przed wykonaniem wywołania PUT musi istnieć element w bazie danych. Wywołaj metodę GET, aby upewnić się, że istnieje element w bazie danych przed wykonaniem wywołania PUT.
Za pomocą Swagger UI użyj przycisku PUT, aby zaktualizować element o Id = 1 i ustawić jego nazwę na "feed fish"
. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
Metoda DeleteTodoItem
Przeanalizuj metodę DeleteTodoItem
:
[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();
}
Testowanie metody DeleteTodoItem
Użyj interfejsu użytkownika struktury Swagger, aby usunąć identyfikator TodoItem
o identyfikatorze = 1. Zwróć uwagę, że odpowiedź to HTTP 204 No Content
.
Testowanie za pomocą innych narzędzi
Istnieje wiele innych narzędzi, których można użyć do testowania internetowych interfejsów API, na przykład:
- Eksplorator punktów końcowych programu Visual Studio i pliki HTTP
- http-repl
-
curl. Narzędzie Swagger używa
curl
i wyświetla polecenia, które przesyłacurl
. - Fiddler
Aby uzyskać więcej informacji, zobacz:
- Samouczek dotyczący minimalnego interfejsu API: testowanie przy użyciu plików HTTP i Eksploratora punktów końcowych
-
Instalowanie i testowanie interfejsów API za pomocą polecenia
http-repl
Zapobieganie nadmiernemu publikowaniu
Obecnie przykładowa aplikacja uwidacznia cały TodoItem
obiekt. Aplikacje produkcyjne zwykle ograniczają dane wejściowe i zwracane przy użyciu podzestawu modelu. Istnieje wiele powodów stojących za tym, a bezpieczeństwo jest jednym z głównych. Podzbiór modelu jest zwykle nazywany obiektem transferu danych (DTO), modelem wejściowym lub modelem widoku.
DTO jest używany w tym samouczku.
DTO może służyć do:
- Zapobiegaj nadmiernemu publikowaniu.
- Ukryj właściwości, których klienci nie powinni wyświetlać.
- Pomiń niektóre właściwości, aby zmniejszyć rozmiar ładunku.
- Spłaszcz grafy obiektów zawierające zagnieżdżone obiekty. Spłaszczone grafy obiektów mogą być wygodniejsze dla klientów.
Aby zademonstrować podejście DTO, zaktualizuj klasę TodoItem
tak, aby zawierała pole tajne:
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; }
}
}
Pole tajne musi być ukryte w tej aplikacji, ale aplikacja administracyjna może je uwidocznić.
Sprawdź, czy możesz opublikować i uzyskać dostęp do tajnego pola.
Tworzenie modelu DTO:
namespace TodoApi.Models;
public class TodoItemDTO
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
Zaktualizuj TodoItemsController
do użycia TodoItemDTO
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
};
}
Sprawdź, czy nie możesz zamieszczać ani pobierać tajnego pola.
Wywoływanie internetowego interfejsu API za pomocą języka JavaScript
Seria filmów wideo o API sieciowym
Zobacz Wideo: Seria dla początkujących: interfejsy Web API.
Wzorce aplikacji internetowej dla przedsiębiorstw
Aby uzyskać wskazówki dotyczące tworzenia niezawodnej, bezpiecznej, wydajnej, testowalnej i skalowalnej aplikacji ASP.NET Core, zobacz wzorce aplikacji internetowych Enterprise. Dostępna jest kompletna przykładowa aplikacja internetowa jakości produkcyjnej, która implementuje wzorce.
Dodawanie obsługi uwierzytelniania do internetowego interfejsu API
ASP.NET Core Identity dodaje funkcjonalność logowania przez interfejs użytkownika w aplikacjach internetowych platformy ASP.NET Core. Aby zabezpieczyć webowe interfejsy API i SPA, użyj jednego z poniższych.
Duende Identity Server to platforma OpenID Connect i OAuth 2.0 dla platformy ASP.NET Core. Serwer Duende Identity umożliwia korzystanie z następujących funkcji zabezpieczeń:
- Uwierzytelnianie jako usługa (AaaS)
- Logowanie jednokrotne/wyłączanie logowania jednokrotnego w wielu typach aplikacji
- Kontrola dostępu dla interfejsów API
- Brama federacyjna
Ważne
Oprogramowanie Duende może wymagać zapłacenia opłaty licencyjnej za korzystanie z serwera Duende Identity Server w środowisku produkcyjnym. Aby uzyskać więcej informacji, zobacz Migracja z platformy ASP.NET Core w wersji 5.0 do wersji 6.0.
Aby uzyskać więcej informacji, zobacz dokumentację serwera Duende (witryna internetowa Duende Identity Software).
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Szybki start: wdrażanie aplikacji internetowej ASP.NET.
Dodatkowe zasoby
Wyświetl lub pobierz przykładowy kod dla tego samouczka. Zobacz , jak pobrać.
Aby uzyskać więcej informacji, zobacz następujące zasoby:
- Tworzenie internetowych interfejsów API za pomocą platformy ASP.NET Core
- Samouczek: tworzenie minimalnego interfejsu API przy użyciu platformy ASP.NET Core
- Dokumentacja interfejsu API platformy ASP.NET Core z Swagger/OpenAPI
- Razor Strony z frameworkiem Entity Framework Core w ASP.NET Core — Samouczek 1 z 8
- Routing do akcji kontrolera na platformie ASP.NET Core
- Zwracane typy akcji kontrolera w internetowym interfejsie API platformy ASP.NET Core
- Wdrażanie aplikacji ASP.NET Core w usłudze Azure App Service
- Hostowanie i wdrażanie ASP.NET Core
- Tworzenie internetowego interfejsu API przy użyciu platformy ASP.NET Core