Öğretici: ASP.NET Core ile web API'si oluşturma
Rick Anderson ve Rick Larkin
Bu öğreticide, ASP.NET Core ile web API'si ASP.NET Core.
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Web API'si projesi oluşturun.
- Model sınıfı ve veritabanı bağlamı ekleyin.
- CRUD yöntemleriyle bir denetleyicinin iskelesi.
- Yönlendirmeyi, URL yollarını ve dönüş değerlerini yapılandırma.
- Postman ile web API'sini çağırma.
Sonunda, veritabanında depolanan "to-do" öğelerini yönetecek bir web API'niz vardır.
Genel Bakış
Bu öğretici aşağıdaki API'yi oluşturur:
| API | Açıklama | İstek gövdesi | Yanıt gövdesi |
|---|---|---|---|
GET /api/todoitems |
Tüm iş öğelerini al | Hiçbiri | Yapacaklar öğeleri dizisi |
GET /api/todoitems/{id} |
Kimliğine göre öğe al | Hiçbiri | To-do öğesi |
POST /api/todoitems |
Yeni öğe ekleme | To-do öğesi | To-do öğesi |
PUT /api/todoitems/{id} |
Mevcut öğeyi güncelleştirme | To-do öğesi | Hiçbiri |
DELETE /api/todoitems/{id} |
Öğe silme | Hiçbiri | Hiçbiri |
Aşağıdaki diyagramda uygulamanın tasarımı gösterildi.

Önkoşullar
- ASP.NET ve web geliştirme iş yüküyle Visual Studio 2022 .
Web projesi oluşturma
- Dosya menüsünden Yeni dosya'Project. >
- Arama kutusuna Web API'si yazın.
- Web API ASP.NET Core şablonunu ve ardından Sonraki'yi seçin.
- Yeni projenizi yapılandır iletişim kutusunda projeyi TodoApi olarak ad girin ve Sonraki'yi seçin.
- Ek bilgiler iletişim kutusunda Framework'in .NET 6.0 (Önizleme) olduğunu onaylayın ve Oluştur'a tıklayın.
Projeyi test etme
Proje şablonu WeatherForecast Swaggerdesteğine sahip bir API oluşturur.
Hata ayıklayıcı olmadan çalıştırmak için Ctrl+F5 tuşlarına basın.
Visual Studio bir proje SSL kullanmak için henüz yapılandırılmadığında aşağıdaki iletişim kutusunu görüntüler:

IIS Express SSL sertifikasına güveniyorsanız evet ' i seçin.
Aşağıdaki iletişim kutusu görüntülenir:

Geliştirme sertifikasına güvenmeyi kabul ediyorsanız Evet ' i seçin.
Firefox tarayıcısına güvenme hakkında bilgi için bkz. Firefox SEC_ERROR_INADEQUATE_KEY_USAGE hatası.
Visual Studio tarayıcıyı başlatıyor ve 'a https://localhost:<port>/swagger/index.html gidiliyor, <port> burada rastgele seçilen bağlantı noktası numarası.
Swagger /swagger/index.html sayfası görüntülenir. GET Try > it out Execute seçeneğini > seçin. Sayfa şunları görüntüler:
- WeatherForecast API'sini test etmek için Curl komutu.
- WeatherForecast API'sini test etmek için URL.
- Yanıt kodu, gövdesi ve üst bilgileri.
- Medya türlerinin ve örnek değerin ve şemanın yer alan bir açılan liste kutusu.
Swagger sayfası görünmüyorsa bu soruna GitHub bakın.
Swagger, web API'leri için yararlı belgeler ve yardım sayfaları oluşturmak için kullanılır. Bu öğretici bir web API'si oluşturmaya odaklanır. Swagger hakkında daha fazla bilgi için bkz. Swagger/openapı ile web apı 'si belgelerini ASP.NET Core .
İstek URL'sini kopyalayıp tarayıcıya yapıştırın: https://localhost:<port>/WeatherForecast
Aşağıdaki örnekte olduğu gibi JSON döndürülür:
[
{
"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"
}
]
launchUrl'i güncelleştirme
Properties\launchSettings.json içinde, konumundan launchUrl olarak "swagger" "api/todoitems" güncelleştirin:
"launchUrl": "api/todoitems",
Swagger kaldırılacak olduğundan, önceki işaretleme aşağıdaki bölümlerde eklenen denetleyicinin GET yöntemine başlatılan URL'yi değiştirir.
Model sınıfı ekleme
Model, uygulamanın yönettir olduğu verileri temsil eden bir sınıf kümesidir. Bu uygulamanın modeli tek bir TodoItem sınıftır.
Bu Çözüm Gezgini projeye sağ tıklayın. Yeni Klasör > Ekle'yi seçin. Klasöre adını Models girin.
Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoItem adını girin ve Ekle'yi seçin.
Şablon kodunu aşağıdakiyle değiştirin:
namespace TodoApi.Models
{
public class TodoItem
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
}
özelliği, Id ilişkisel veritabanında benzersiz anahtar olarak işlev gösterir.
Model sınıfları projenin herhangi bir yerine gidebilir, ancak Models klasör kural tarafından kullanılır.
Veritabanı bağlamı ekleme
Veritabanı bağlamı, bir veri modeli için Entity Framework koordine olan ana sınıftır. Bu sınıf, sınıfından türeterek Microsoft.EntityFrameworkCore.DbContext oluşturulur.
NuGet paketlerini ekleme
- Araçlar menüsünden Çözüm için NuGet Paket Yöneticisi > Paketlerini NuGet'ı seçin.
- Gözat sekmesini seçin ve arama
Microsoft.EntityFrameworkCore.InMemorykutusuna yazın. - Sol
Microsoft.EntityFrameworkCore.InMemorybölmede öğesini seçin. - Sağ bölmede Project onay kutusunu ve ardından Yükle'yi seçin.
TodoContext veritabanı bağlamını ekleme
- Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoContext adını girin ve Ekle'ye tıklayın.
Aşağıdaki kodu girin:
using Microsoft.EntityFrameworkCore; using System.Diagnostics.CodeAnalysis; namespace TodoApi.Models { public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } = null!; } }
Veritabanı bağlamını kaydetme
Bu ASP.NET Core veritabanı bağlamı gibi hizmetlerin bağımlılık ekleme (DI) kapsayıcısı ile kayıtlı olması gerekir. Kapsayıcı, denetleyicilere hizmeti sağlar.
Program.cs'yi aşağıdaki kodla güncelleştirin:
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
//builder.Services.AddSwaggerGen(c =>
//{
// c.SwaggerDoc("v1", new() { Title = "TodoApi", Version = "v1" });
//});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (builder.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//app.UseSwagger();
//app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TodoApi v1"));
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Yukarıdaki kod:
- Swagger çağrılarını kaldırır.
- Kullanılmayan yönergeleri
usingkaldırır. - Di kapsayıcısı için veritabanı bağlamını ekler.
- Veritabanı bağlamının bellek içinde bir veritabanı kullanmayacaklarını belirtir.
Bir denetleyicinin iskelesi
Denetleyiciler klasörüne sağ tıklayın.
Yeni > İskeleLi Öğe Ekle'yi seçin.
api Controller with actions (eylemlerle API Denetleyicisi) seçeneğini Entity Framework ve ardından Ekle'yi seçin.
Eylemlerle API Denetleyicisi Ekle'de, Entity Framework kullanın:
- Model sınıfında TodoItem (TodoApi. Models ) öğesini seçin.
- Veri bağlam sınıfında TodoContext (TodoApi. Models ) öğesini seçin.
- Add (Ekle) seçeneğini belirleyin.
Yapı iskelesi işlemi başarısız olursa ekle'yi seçerek iskeleyi yeniden deneyin.
Oluşturulan kod:
- sınıfını özniteliğiyle
[ApiController]işaretler. Bu öznitelik, denetleyicinin web API'si isteklerine yanıt verir. Özniteliğin olanaklı olduğu belirli davranışlar hakkında bilgi için ASP.NET Core ile web API’leri oluşturma bkz. . - Veritabanı bağlamını ( ) denetleyiciye ekleme için DI
TodoContextkullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.
Aşağıdaki ASP.NET Core şablonlarını içerir:
- Görünümlere sahip denetleyiciler
[action]yol şablonuna dahildir. - API denetleyicileri yol
[action]şablonuna dahil değil.
Belirteç [action] yol şablonunda değilse eylem adı yol dışında bırakılacaktır. Başka bir ifadeyle, eylemin ilişkili yöntem adı eşleşen yolda kullanılmaz.
PostTodoItem oluşturma yöntemini güncelleştirme
içinde return deyimini PostTodoItem nameof işlecini kullanmak için güncelleştirin:
[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);
}
Yukarıdaki kod, özniteliğiyle belirtilen bir HTTP POST [HttpPost] yöntemidir. yöntemi, HTTP isteğinin gövdesinde yapılacaklar öğesinin değerini alır.
Daha fazla bilgi için bkz. Http[Fiil] öznitelikleriyle öznitelik yönlendirme.
CreatedAtActionyöntemi:
- Başarılı olursa bir HTTP 201 durum kodu döndürür. HTTP 201, sunucuda yeni bir kaynak oluşturan HTTP POST yönteminin standart yanıtıdır.
- Yanıta bir Konum üst bilgisi ekler. üst
Locationbilgisi, yeni oluşturulan to-do öğesinin URI'lerini belirtir. Daha fazla bilgi için bkz. 10.2.2 201 Oluşturuldu. - Üst bilgi
GetTodoItemLocationURI'si oluşturmak için eyleme başvurur. C#nameofanahtar sözcüğü, çağrıda eylem adının sabit kodlamasını önlemek içinCreatedAtActionkullanılır.
http-repl yükleme
Bu öğreticide web API'sini test etmek için http-repl kullanılır.
Komut isteminde aşağıdaki komutu çalıştırın:
dotnet tool install -g Microsoft.dotnet-httprepl.NET 5.0 SDK'sı veya çalışma zamanı yüklü değilse , .NET 5.0 çalışma zamanı yükleyin.
Test PostTodoItem
Uygulamayı çalıştırmak için Ctrl+F5 tuşlarına basın.
Yeni bir terminal penceresi açın ve aşağıdaki komutları çalıştırın. Uygulamanız farklı bir bağlantı noktası numarası kullanıyorsa httprepl komutunda 5001 yerine bağlantı noktası numaranızı yazın.
httprepl https://localhost:5001/api/todoitems post -h Content-Type=application/json -c "{"name":"walk dog","isComplete":true}"Aşağıda komutun çıktısının bir örneğini inceleyebilirsiniz:
HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Tue, 07 Sep 2021 20:39:47 GMT Location: https://localhost:5001/api/TodoItems/1 Server: Kestrel Transfer-Encoding: chunked { "id": 1, "name": "walk dog", "isComplete": true }
Konum üst bilgisi URI'lerini test etmek
Konum üst bilgilerini test etmek için kopyalayın ve bir httprepl komutuna get yapıştırın.
Aşağıdaki örnek, hala bir httprepl oturumunda olduğunu varsayıyor. Önceki httprepl oturumunu sonladıysanız, aşağıdaki connect httprepl komutlarda yerine yazın:
connect https://localhost:5001/api/todoitems/1
get
Aşağıda komutun çıktısının bir örneğini inceleyebilirsiniz:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Tue, 07 Sep 2021 20:48:10 GMT
Server: Kestrel
Transfer-Encoding: chunked
{
"id": 1,
"name": "walk dog",
"isComplete": true
}
GET yöntemlerini inceleme
İki GET uç noktası uygulanır:
GET /api/todoitemsGET /api/todoitems/{id}
Yalnızca yola bir örnek gördünüz /api/todoitems/{id} . Rotayı test etme /api/todoitems :
connect https://localhost:5001/api/todoitems
get
Aşağıda komutun çıktısının bir örneğini inceleyebilirsiniz:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Tue, 07 Sep 2021 20:59:21 GMT
Server: Kestrel
Transfer-Encoding: chunked
[
{
"id": 1,
"name": "walk dog",
"isComplete": true
}
]
Bu kez, döndürülen JSON bir öğe dizisidir.
Bu uygulama, bellek içi bir veritabanını kullanır. Uygulama durdurulup başlatılırsa, önceki GET isteği herhangi bir veri döndürmez. Hiçbir veri döndürülmezse, verileri uygulamaya gönderin .
Yönlendirme ve URL yolları
[HttpGet]Öznitelik, BIR HTTP GET isteğine yanıt veren bir yöntemi gösterir. Her yöntemin URL yolu şu şekilde oluşturulur:
Denetleyicinin özniteliğinde şablon dizesiyle başlayın
Route:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase[controller]Denetleyicinin adıyla değiştirin; bu kural, denetleyici sınıf adı "denetleyici" sonekidir. Bu örnek için denetleyici sınıfı adı todoıtems denetleyicisidir, bu nedenle denetleyicinin adı "todoıtems" olur. ASP.NET Core yönlendirme büyük/küçük harfe duyarlıdır.[HttpGet]Özniteliğin bir yol şablonu varsa (örneğin,[HttpGet("products")]), yola ekleyin. Bu örnek, bir şablon kullanmaz. Daha fazla bilgi için bkz. http [fiil] öznitelikleriyle öznitelik yönlendirme.
Aşağıdaki GetTodoItem yöntemde, yapılacaklar "{id}" öğesinin benzersiz tanımlayıcısı için bir yer tutucu değişkenidir. GetTodoItemÇağrıldığında, "{id}" URL 'deki değeri, yönteminin parametresindeki yöntemine sağlanır 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;
}
Dönüş değerleri
GetTodoItemsVe yöntemlerinin dönüş türü GetTodoItem ActionResult <T> türüdür. ASP.NET Core nesneyi json 'a otomatik olarak serileştirir ve yanıt iletisinin gövdesine json yazar. Bu dönüş türü için yanıt kodu, işlenmemiş özel durum olmadığı varsayılarak 200 Tamamolur. İşlenmemiş özel durumlar 5 xx hataya çevrilir.
ActionResult dönüş türleri, geniş bir HTTP durum kodu aralığını temsil edebilir. Örneğin, GetTodoItem iki farklı durum değeri döndürebilir:
- İstenen KIMLIKLE eşleşen hiçbir öğe yoksa, yöntem 404 durum NotFound hata kodu döndürür.
- Aksi takdirde, yöntemi bir JSON yanıt gövdesi ile 200 döndürür.
itemSonuçları BIR HTTP 200 yanıtına döndürme.
PutTodoItem yöntemi
PutTodoItem yöntemini inceleyin:
[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``PostTodoItem, http put kullanması dışında öğesine benzerdir. Yanıt 204 ' dir (Içerik yok). HTTP belirtimine göre bir PUT isteği, istemcinin yalnızca değişiklikleri değil, tüm güncelleştirilmiş varlığı göndermesini gerektirir. Kısmi güncelleştirmeleri desteklemek için http Patchkullanın.
Aşağıdaki bölümde çağrılırken bir hata alırsanız PutTodoItem , GET veritabanında bir öğe olduğundan emin olmak için çağırın.
PutTodoItem yöntemini test etme
Bu örnek, uygulama her başlatıldığında başlatılmış olması gereken bellek içi bir veritabanını kullanır. Bir PUT çağrısı yapmadan önce veritabanında bir öğe olmalıdır. PUT çağrısı yapmadan önce veritabanında bir öğe olduğundan emin olmak için GET çağrısı yapın.
Kimlik = 1 olan Yapılacaklar öğesini güncelleştirin ve adını şu şekilde ayarlayın "feed fish" :
connect https://localhost:5001/api/todoitems/1
put -h Content-Type=application/json -c "{"id":1,"name":"feed fish","isComplete":true}"
Aşağıda komutun çıktısının bir örneğini inceleyebilirsiniz:
HTTP/1.1 204 No Content
Date: Tue, 07 Sep 2021 21:20:47 GMT
Server: Kestrel
DeleteTodoItem yöntemi
DeleteTodoItem yöntemini inceleyin:
[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();
}
DeleteTodoItem yöntemini test etme
Kimliği = 1 olan Yapılacaklar öğesini silin:
connect https://localhost:5001/api/todoitems/1
delete
Aşağıda komutun çıktısının bir örneğini inceleyebilirsiniz:
HTTP/1.1 204 No Content
Date: Tue, 07 Sep 2021 21:43:00 GMT
Server: Kestrel
Fazla nakletmeyi engelle
Şu anda örnek uygulama tüm nesneyi kullanıma sunar TodoItem . Üretim uygulamaları tipik olarak, bir modelin alt kümesini kullanarak girdi ve döndürülen verileri sınırlandırır. Bunun arkasında birden çok neden vardır ve güvenlik önemli bir değer. Bir modelin alt kümesi genellikle Veri Aktarımı nesnesi (DTO), giriş modeli veya görünüm modeli olarak adlandırılır. DTO Bu öğreticide kullanılır.
Bir DTO için kullanılabilir:
- Fazla nakletmeyi önleyin.
- İstemcilerin görüntülemesi beklenen özellikleri gizleyin.
- Yük boyutunu azaltmak için bazı özellikleri atlayın.
- İç içe geçmiş nesneler içeren nesne grafiklerini düzleştirin. Düzleştirilmiş nesne grafikleri istemciler için daha uygun olabilir.
DTO yaklaşımını göstermek için, TodoItem sınıfı gizli bir alan içerecek şekilde güncelleştirin:
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; }
}
}
Gizli alanın bu uygulamadan gizlenmesi gerekir, ancak bir yönetim uygulaması onu kullanıma sunmayı seçebilir.
Gizli dizi alanını nakledebildiğinizi ve alabilirim.
Bir DTO modeli oluşturun:
namespace TodoApi.Models
{
public class TodoItemDTO
{
public long Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
}
TodoItemsControllerKullanmak için öğesini güncelleştirin 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
[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);
}
// PUT: api/TodoItems/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> UpdateTodoItem(long id, TodoItemDTO todoItemDTO)
{
if (id != todoItemDTO.Id)
{
return BadRequest();
}
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
todoItem.Name = todoItemDTO.Name;
todoItem.IsComplete = todoItemDTO.IsComplete;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
{
return NotFound();
}
return NoContent();
}
// POST: api/TodoItems
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<TodoItemDTO>> CreateTodoItem(TodoItemDTO todoItemDTO)
{
var todoItem = new TodoItem
{
IsComplete = todoItemDTO.IsComplete,
Name = todoItemDTO.Name
};
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction(
nameof(GetTodoItem),
new { id = todoItem.Id },
ItemToDTO(todoItem));
}
// 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
};
}
}
Gizli dizi alanını nakledemeyeceğinizi veya alamazsınız.
JavaScript ile Web API 'sini çağırma
bkz. öğretici: JavaScript ile ASP.NET Core web apı 'si çağırma.
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Bir Web API projesi oluşturun.
- Bir model sınıfı ve bir veritabanı bağlamı ekleyin.
- CRUD yöntemleriyle bir denetleyiciyi dolandırın.
- Yönlendirmeyi, URL yollarını ve dönüş değerlerini yapılandırın.
- Postman ile Web API 'sini çağırın.
Sonunda, bir veritabanında depolanan "yapılacaklar" öğelerini yönetebilmek için bir Web API 'SI vardır.
Genel Bakış
Bu öğretici aşağıdaki API 'YI oluşturur:
| API | Açıklama | İstek gövdesi | Yanıt gövdesi |
|---|---|---|---|
GET /api/todoitems |
Tüm yapılacaklar öğelerini Al | Hiçbiri | Yapılacaklar öğeleri dizisi |
GET /api/todoitems/{id} |
KIMLIĞE göre öğe al | Hiçbiri | Yapılacaklar öğesi |
POST /api/todoitems |
Yeni öğe Ekle | Yapılacaklar öğesi | Yapılacaklar öğesi |
PUT /api/todoitems/{id} |
Mevcut bir öğeyi güncelleştir | Yapılacaklar öğesi | Hiçbiri |
DELETE /api/todoitems/{id} |
Öğe silme | Hiçbiri | Hiçbiri |
Aşağıdaki diyagramda uygulamanın tasarımı gösterilmektedir.

Önkoşullar
- Visual Studio ve web geliştirme iş yüküyle 2019 16.8 ASP.NET sonraki bir 2019
- .NET 5.0 SDK
Web projesi oluşturma
- Dosya menüsünden Yeni dosya'Project. >
- Web API ASP.NET Core seçin ve Ardından'ya tıklayın.
- Projeye TodoApi adını girin ve Oluştur'a tıklayın.
- Web Uygulaması için yeni ASP.NET Core iletişim kutusunda .NET Core ve ASP.NET Core 5.0'ın seçili olduğunu onaylayın. API şablonunu seçin ve Oluştur'a tıklayın.

Projeyi test etme
Proje şablonu WeatherForecast Swaggerdesteğine sahip bir API oluşturur.
Hata ayıklayıcı olmadan çalıştırmak için Ctrl+F5 tuşlarına basın.
Visual Studio bir proje SSL kullanmak için henüz yapılandırılmadığında aşağıdaki iletişim kutusunu görüntüler:

IIS Express SSL sertifikasına güveniyorsanız evet ' i seçin.
Aşağıdaki iletişim kutusu görüntülenir:

Geliştirme sertifikasına güvenmeyi kabul ediyorsanız Evet ' i seçin.
Firefox tarayıcısına güvenme hakkında bilgi için bkz. Firefox SEC_ERROR_INADEQUATE_KEY_USAGE hatası.
Visual Studio başlatmaları:
- Web IIS Express sunucusu.
- Varsayılan tarayıcıda ve yerine
https://localhost:<port>/swagger/index.htmlgidiliyor.<port>Burada, rastgele seçilen bağlantı noktası numarasıdır.
Swagger /swagger/index.html sayfası görüntülenir. GET Try > it out Execute seçeneğini > seçin. Sayfa şunları görüntüler:
- WeatherForecast API'sini test etmek için Curl komutu.
- WeatherForecast API'sini test etmek için URL.
- Yanıt kodu, gövdesi ve üst bilgileri.
- Medya türlerinin ve örnek değerin ve şemanın yer alan bir açılan liste kutusu.
Swagger sayfası görünmüyorsa bu soruna GitHub bakın.
Swagger, web API'leri için yararlı belgeler ve yardım sayfaları oluşturmak için kullanılır. Bu öğretici bir web API'si oluşturmaya odaklanır. Swagger hakkında daha fazla bilgi için bkz. Swagger/openapı ile web apı 'si belgelerini ASP.NET Core .
İstek URL'sini kopyalayıp tarayıcıya yapıştırın: https://localhost:<port>/WeatherForecast
Aşağıdakine benzer JSON döndürülür:
[
{
"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"
}
]
launchUrl'i güncelleştirme
Properties\launchSettings.json içinde, konumundan launchUrl olarak "swagger" "api/todoitems" güncelleştirin:
"launchUrl": "api/todoitems",
Swagger kaldırılacak olduğundan, önceki işaretleme aşağıdaki bölümlerde eklenen denetleyicinin GET yöntemine başlatılan URL'yi değiştirir.
Model sınıfı ekleme
Model, uygulamanın yönettir olduğu verileri temsil eden bir sınıf kümesidir. Bu uygulamanın modeli tek bir TodoItem sınıftır.
Bu Çözüm Gezgini, projeye sağ tıklayın. Yeni Klasör > Ekle'yi seçin. Klasöre adını Models girin.
Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoItem adını girin ve Ekle'yi seçin.
Şablon kodunu aşağıdakiyle değiştirin:
namespace TodoApi.Models
{
public class TodoItem
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
}
özelliği, Id ilişkisel veritabanında benzersiz anahtar olarak işlev gösterir.
Model sınıfları projenin herhangi bir yerine gidebilir, ancak Models klasör kural tarafından kullanılır.
Veritabanı bağlamı ekleme
Veritabanı bağlamı, bir veri modeli için Entity Framework koordine olan ana sınıftır. Bu sınıf, sınıfından türeterek Microsoft.EntityFrameworkCore.DbContext oluşturulur.
NuGet paketlerini ekleme
- Araçlar menüsünden Çözüm için NuGet Paket Yöneticisi >'NuGet Yönet'i seçin.
- Gözat sekmesini seçin ve arama
Microsoft.EntityFrameworkCore.InMemorykutusuna yazın. - Sol
Microsoft.EntityFrameworkCore.InMemorybölmede öğesini seçin. - Sağ bölmede Project onay kutusunu ve ardından Yükle'yi seçin.

TodoContext veritabanı bağlamını ekleme
- Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoContext adını girin ve Ekle'ye tıklayın.
Aşağıdaki kodu girin:
using Microsoft.EntityFrameworkCore; namespace TodoApi.Models { public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } } }
Veritabanı bağlamını kaydetme
ASP.NET Core, veritabanı bağlamı gibi hizmetlerin bağımlılık ekleme (dı) kapsayıcısına kayıtlı olması gerekir. Kapsayıcı hizmeti denetleyicilere sağlar.
Başlangıç. cs öğesini aşağıdaki kodla güncelleştirin:
// Unused usings removed
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
namespace TodoApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
//services.AddSwaggerGen(c =>
//{
// c.SwaggerDoc("v1", new OpenApiInfo { Title = "TodoApi", Version = "v1" });
//});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//app.UseSwagger();
//app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TodoApi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Yukarıdaki kod:
- Swagger çağrılarını kaldırır.
- Kullanılmayan
usingbildirimleri kaldırır. - Veritabanı bağlamını dı kapsayıcısına ekler.
- Veritabanı bağlamının bellek içi bir veritabanını kullanacağı belirtir.
Denetleyiciyi bir denetleyiciye katlama
Denetleyiciler klasörüne sağ tıklayın.
-
Yeni yapı iskelesi öğesi Ekle öğesini seçin.
Entity Framework kullanarak ve eylemler Içeren API denetleyicisi' ni seçin ve ardından Ekle' yi seçin.
API denetleyiciyi eylemler Ile Ekle ' de Entity Framework iletişim kutusunu kullanarak:
- Model sınıfında TodoItem (TodoApi. Models ) öğesini seçin.
- Veri bağlamı sınıfında TodoContext (TodoApi. Models ) öğesini seçin.
- Add (Ekle) seçeneğini belirleyin.
Oluşturulan kod:
- Sınıfını
[ApiController]özniteliğiyle işaretler. Bu öznitelik, denetleyicinin Web API isteklerine yanıt verdiğini belirtir. Özniteliğin izin aldığı belirli davranışlar hakkında daha fazla bilgi için bkz ASP.NET Core ile web API’leri oluşturma .. - Veritabanı bağlamını () denetleyiciye eklemek için DI kullanır
TodoContext. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinde her birinde kullanılır.
için ASP.NET Core şablonları:
- Görünümleri olan denetleyiciler
[action]yol şablonuna dahildir. - API denetleyicileri
[action]yol şablonuna dahil değildir.
[action]Belirteç yol şablonunda olmadığında, eylem adı rotadan çıkarılır. Diğer bir deyişle, eylemin ilişkili Yöntem adı eşleşen rotada kullanılmaz.
PostTodoItem Create metodunu güncelleştirme
İçindeki return ifadesini, PostTodoItem NameOf işlecini kullanacak şekilde güncelleştirin:
// POST: api/TodoItems
[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);
}
Yukarıdaki kod, özniteliğiyle gösterildiği gibi bir HTTP POST yöntemidir [HttpPost] . Yöntemi, HTTP isteğinin gövdesinden Yapılacaklar öğesinin değerini alır.
Daha fazla bilgi için bkz. http [fiil] öznitelikleriyle öznitelik yönlendirme.
CreatedAtActionYöntemi:
- Başarılı olursa bir HTTP 201 durum kodu döndürür. HTTP 201, sunucuda yeni bir kaynak oluşturan HTTP POST yöntemi için standart yanıttır.
- Yanıta bir konum üst bilgisi ekler.
LocationÜst bilgi, yeni oluşturulan Yapılacaklar öğesinin URI 'sini belirtir. Daha fazla bilgi için bkz. 10.2.2 201 oluşturma. GetTodoItemÜSTBILGININ URI 'sini oluşturma eylemine başvururLocation. C#nameofanahtar sözcüğü, çağrıda eylem adının sabit kodlanmasını önlemek için kullanılırCreatedAtAction.
Postman yükleme
Bu öğretici, Web API 'sini test etmek için Postman kullanır.
- Postman yükleme
- Web uygulamasını başlatın.
- Postman 'ı başlatın.
- SSL sertifikası doğrulamasını devre dışı bırak
- dosya > Ayarlar (genel sekmesinden), SSL sertifikası doğrulamasını devre dışı bırakın.
Uyarı
Denetleyiciyi test ettikten sonra SSL sertifikası doğrulamasını yeniden etkinleştirin.
- dosya > Ayarlar (genel sekmesinden), SSL sertifikası doğrulamasını devre dışı bırakın.
Postman ile test PostTodoItem
Yeni bir istek oluşturun.
HTTP yöntemini olarak ayarlayın
POST.URI değerini olarak ayarlayın
https://localhost:<port>/api/todoitems. Örneğin,https://localhost:5001/api/todoitems.Gövde sekmesini seçin.
Ham radyo düğmesini seçin.
Türü JSON (Application/JSON) olarak ayarlayın.
İstek gövdesinde, bir yapılacaklar öğesi için JSON girin:
{ "name":"walk dog", "isComplete":true }Gönder’i seçin.

Konum üst bilgisi URI 'sini test etme
Konum üst bilgisi URI 'SI tarayıcıda test edilebilir. Konum üst bilgisi URI 'sini kopyalayıp tarayıcıya yapıştırın.
Postman 'da test etmek için:
Yanıt bölmesinde üstbilgiler sekmesini seçin.
Konum üst bilgisi değerini kopyalayın:

HTTP yöntemini olarak ayarlayın
GET.URI değerini olarak ayarlayın
https://localhost:<port>/api/todoitems/1. Örneğin,https://localhost:5001/api/todoitems/1.Gönder’i seçin.
GET yöntemlerini inceleyin
İki uç nokta al uygulandı:
GET /api/todoitemsGET /api/todoitems/{id}
Tarayıcıdan veya Postman 'dan iki uç noktayı çağırarak uygulamayı test edin. Örnek:
https://localhost:5001/api/todoitemshttps://localhost:5001/api/todoitems/1
Şuna benzer bir yanıt, şu çağrı tarafından üretilir GetTodoItems :
[
{
"id": 1,
"name": "Item1",
"isComplete": false
}
]
Postman ile test al
- Yeni bir istek oluşturun.
- Almak için http yöntemini ayarlayın.
- İstek URI 'sini olarak ayarlayın
https://localhost:<port>/api/todoitems. Örneğin,https://localhost:5001/api/todoitems. - Postman 'da iki bölme görünümü ayarlayın.
- Gönder’i seçin.
Bu uygulama, bellek içi bir veritabanını kullanır. Uygulama durdurulup başlatılırsa, önceki GET isteği herhangi bir veri döndürmez. Hiçbir veri döndürülmezse, verileri uygulamaya gönderin .
Yönlendirme ve URL yolları
[HttpGet]Öznitelik, BIR HTTP GET isteğine yanıt veren bir yöntemi gösterir. Her yöntemin URL yolu şu şekilde oluşturulur:
Denetleyicinin özniteliğinde şablon dizesiyle başlayın
Route:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase { private readonly TodoContext _context; public TodoItemsController(TodoContext context) { _context = context; }[controller]Denetleyicinin adıyla değiştirin; bu kural, denetleyici sınıf adı "denetleyici" sonekidir. Bu örnek için denetleyici sınıfı adı TodoItems Controller' olduğu için denetleyici adı "TodoItems" olur. ASP.NET Core büyük/büyük/büyük harfe duyarlı değildir.Özniteliğin
[HttpGet]bir yol şablonu varsa (örneğin, ), bunu yola[HttpGet("products")]ekler. Bu örnek şablon kullanmaz. Daha fazla bilgi için bkz. Http[Fiil] öznitelikleriyle öznitelik yönlendirme.
Aşağıdaki GetTodoItem yöntemde, "{id}" yapılacaklar öğesinin benzersiz tanımlayıcısı için bir yer tutucu değişkenidir. GetTodoItemÇağrıldığında, "{id}" URL'de değeri yöntemine parametresinde id sağlanır.
// GET: api/TodoItems/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
Dönüş değerleri
ve yöntemlerinin dönüş GetTodoItems GetTodoItem türü ActionResult t <T> t tür. ASP.NET Core JSON'a otomatik olarak seri hale getirmez ve JSON'u yanıt iletisi gövdesine yazar. bu dönüş türü için yanıt kodu 200 Tamam'dır.İşlenemeyen özel durumlar olmadığını varsayarak. İşlenemeyen özel durumlar 5xx hatalarına çevrilir.
ActionResult dönüş türleri çok çeşitli HTTP durum kodlarını temsil ediyor olabilir. Örneğin, GetTodoItem iki farklı durum değeri dönüşebilirsiniz:
- İstenen kimlikle eşleşen bir öğe yoksa yöntem 404 durum hata kodunu NotFound döndürür.
- Aksi takdirde, yöntem bir JSON yanıt gövdesi ile 200 döndürür. Http
item200 yanıtı döndüren sonuçlar.
PutTodoItem yöntemi
PutTodoItem yöntemini inceleyin:
// PUT: api/TodoItems/5
[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 , ile PostTodoItem benzerdir, ancak HTTP PUT kullanır. Yanıt: 204 (İçerik Yok). HTTP belirtimına göre PUT isteği, istemcinin yalnızca değişiklikleri değil güncelleştirilmiş varlığın tamamını göndermesini gerektirir. Kısmi güncelleştirmeleri desteklemek için HTTP PATCH kullanın.
çağrısında bir hata PutTodoItem alırsanız, veritabanında bir öğe olduğundan emin olmak için öğesini GET arayın.
PutTodoItem yöntemini test etmek
Bu örnek, uygulama her başlatıcıda başlatılması gereken bir bellek içinde veritabanı kullanır. PUT çağrısı öncesinde veritabanında bir öğe olmalıdır. PUT çağrısı yapmadan önce veritabanında bir öğe olduğundan emin olmak için GET çağrısı yapma.
Id = 1 olan to-do öğesini güncelleştirin ve adını olarak "feed fish" ayarlayın:
{
"Id":1,
"name":"feed fish",
"isComplete":true
}
Aşağıdaki görüntüde Postman güncelleştirmesi yer amektedir:

DeleteTodoItem yöntemi
DeleteTodoItem yöntemini inceleyin:
// 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();
}
DeleteTodoItem yöntemini test etmek
Postman kullanarak bir to-do öğesini silin:
- yöntemini olarak
DELETEayarlayın. - Silinecek nesnenin URI'lerini ayarlayın
https://localhost:5001/api/todoitems/1(örneğin). - Gönder’i seçin.
Fazla gönderiyi engelleme
Şu anda örnek uygulama nesnenin tamamını TodoItem gösterir. Üretim uygulamaları genellikle girişi yapılan ve modelin bir alt kümesi kullanılarak döndürülen verileri sınırlandırr. Bunun birden çok nedeni vardır ve güvenlik önemli bir nedendir. Modelin alt kümesi genellikle Veri Aktarım Nesnesi (DTO), giriş modeli veya görünüm modeli olarak adlandırılır. Bu makalede DTO kullanılmıştır.
DTO aşağıdakiler için kullanılabilir:
- Fazla gönderiyi önle.
- İstemcilerin görüntülemesi gereken özellikleri gizle.
- Yük boyutunu azaltmak için bazı özellikleri atla.
- İç içe nesneleri içeren nesne grafiklerini düzlük. Düzmüş nesne grafları istemciler için daha kullanışlı olabilir.
DTO yaklaşımını göstermek için sınıfını TodoItem gizli bir alan içerecek şekilde güncelleştirin:
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; }
}
}
Gizli alan bu uygulamanın gizli olması gerekir, ancak bir yönetim uygulaması bunu açığa çıkarmayı seçebilir.
Gizli alan yayınlaya ve alacı 2.000.000'e kadar olan tüm bilgileri girin.
DTO modeli oluşturma:
public class TodoItemDTO
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
kullanmak TodoItemsController için 'i TodoItemDTO güncelleştirin:
// GET: api/TodoItems
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItemDTO>>> GetTodoItems()
{
return await _context.TodoItems
.Select(x => ItemToDTO(x))
.ToListAsync();
}
[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);
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateTodoItem(long id, TodoItemDTO todoItemDTO)
{
if (id != todoItemDTO.Id)
{
return BadRequest();
}
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
todoItem.Name = todoItemDTO.Name;
todoItem.IsComplete = todoItemDTO.IsComplete;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
{
return NotFound();
}
return NoContent();
}
[HttpPost]
public async Task<ActionResult<TodoItemDTO>> CreateTodoItem(TodoItemDTO todoItemDTO)
{
var todoItem = new TodoItem
{
IsComplete = todoItemDTO.IsComplete,
Name = todoItemDTO.Name
};
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction(
nameof(GetTodoItem),
new { id = todoItem.Id },
ItemToDTO(todoItem));
}
[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) =>
_context.TodoItems.Any(e => e.Id == id);
private static TodoItemDTO ItemToDTO(TodoItem todoItem) =>
new TodoItemDTO
{
Id = todoItem.Id,
Name = todoItem.Name,
IsComplete = todoItem.IsComplete
};
Gizli alan gönderileye veya alana alamayayı doğrulayın.
JavaScript ile web API'sini çağırma
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Web API'si projesi oluşturun.
- Model sınıfı ve veritabanı bağlamı ekleyin.
- CRUD yöntemleriyle bir denetleyicinin iskelesi.
- Yönlendirmeyi, URL yollarını ve dönüş değerlerini yapılandırma.
- Postman ile web API'sini çağırma.
Sonunda, veritabanında depolanan "to-do" öğelerini yönetecek bir web API'niz vardır.
Genel Bakış
Bu öğretici aşağıdaki API'yi oluşturur:
| API | Açıklama | İstek gövdesi | Yanıt gövdesi |
|---|---|---|---|
GET /api/todoitems |
Tüm iş öğelerini al | Hiçbiri | Yapacaklar öğeleri dizisi |
GET /api/todoitems/{id} |
Kimliğine göre öğe al | Hiçbiri | To-do öğesi |
POST /api/todoitems |
Yeni öğe ekleme | To-do öğesi | To-do öğesi |
PUT /api/todoitems/{id} |
Mevcut öğeyi güncelleştirme | To-do öğesi | Hiçbiri |
DELETE /api/todoitems/{id} |
Öğe silme | Hiçbiri | Hiçbiri |
Aşağıdaki diyagramda uygulamanın tasarımı gösterildi.

Önkoşullar
Visual Studio ve web geliştirme iş yüküyle 2019 16.4 ASP.NET sonraki bir 2019
Web projesi oluşturma
- Dosya menüsünden Yeni dosya'Project. >
- Web Uygulaması ASP.NET Core seçin ve Ardından'ya tıklayın.
- Projeye TodoApi adını girin ve Oluştur'a tıklayın.
- Web Uygulaması için yeni ASP.NET Core iletişim kutusunda .NET Core ve ASP.NET Core 3.1'in seçili olduğunu onaylayın. API şablonunu seçin ve Oluştur'a tıklayın.

API’yi test etme
Proje şablonu bir WeatherForecast API oluşturur. Uygulamayı Get test etmek için tarayıcıdan yöntemini çağırma.
Uygulamayı çalıştırmak için Ctrl+F5 tuşlarına basın. Visual Studio tarayıcıyı başlatıyor ve 'a https://localhost:<port>/WeatherForecast gidiliyor. <port> Burada, rastgele seçilen bağlantı noktası numarasıdır.
Sertifika sertifikasına güvenmeli olup IIS Express alıyorsanız Evet'i seçin. Daha sonra görüntülenen Güvenlik Uyarısı iletişim kutusunda Evet'i seçin.
Aşağıdakine benzer JSON döndürülür:
[
{
"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"
}
]
Model sınıfı ekleme
Model, uygulamanın yönettir olduğu verileri temsil eden bir sınıf kümesidir. Bu uygulamanın modeli tek bir TodoItem sınıftır.
Bu Çözüm Gezgini, projeye sağ tıklayın. Yeni Klasör > Ekle'yi seçin. Klasöre adını Models girin.
Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoItem adını girin ve Ekle'yi seçin.
Şablon kodunu aşağıdaki kodla değiştirin:
public class TodoItem
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
özelliği, Id ilişkisel veritabanında benzersiz anahtar olarak işlev gösterir.
Model sınıfları projenin herhangi bir yerine gidebilir, ancak Models klasör kural tarafından kullanılır.
Veritabanı bağlamı ekleme
Veritabanı bağlamı, bir veri modeli için Entity Framework koordine olan ana sınıftır. Bu sınıf, sınıfından türeterek Microsoft.EntityFrameworkCore.DbContext oluşturulur.
NuGet paketlerini ekleme
- Araçlar menüsünden Çözüm için NuGet Paket Yöneticisi > Paketlerini NuGet'ı seçin.
- Gözat sekmesini seçin ve arama kutusuna Microsoft.EntityFrameworkCore.InMemory girin.
- Sol bölmede Microsoft.EntityFrameworkCore.InMemory öğesini seçin.
- Sağ bölmede Project onay kutusunu ve ardından Yükle'yi seçin.

TodoContext veritabanı bağlamını ekleme
- Klasöre sağ tıklayın Models ve Sınıf Ekle'yi > seçin. Sınıfa TodoContext adını girin ve Ekle'ye tıklayın.
Aşağıdaki kodu girin:
using Microsoft.EntityFrameworkCore; namespace TodoApi.Models { public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } } }
Veritabanı bağlamını kaydetme
Bu ASP.NET Core veritabanı bağlamı gibi hizmetlerin bağımlılık ekleme (DI) kapsayıcısı ile kayıtlı olması gerekir. Kapsayıcı, denetleyicilere hizmeti sağlar.
Startup.cs'yi aşağıdaki vurgulanmış kodla güncelleştirin:
// Unused usings removed
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;
namespace TodoApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Yukarıdaki kod:
- Kullanılmayan bildirimleri
usingkaldırır. - Di kapsayıcısı için veritabanı bağlamını ekler.
- Veritabanı bağlamının bellek içinde bir veritabanı kullanmayacaklarını belirtir.
Bir denetleyicinin iskelesi
Denetleyiciler klasörüne sağ tıklayın.
Yeni > İskeleLi Öğe Ekle'yi seçin.
api Controller with actions (eylemlerle API Denetleyicisi) seçeneğini Entity Framework ve ardından Ekle'yi seçin.
Eylemlerle API Denetleyicisi Ekle'de, Entity Framework kullanın:
- Model sınıfında TodoItem (TodoApi. Models ) öğesini seçin.
- Veri bağlam sınıfında TodoContext (TodoApi. Models ) öğesini seçin.
- Add (Ekle) seçeneğini belirleyin.
Oluşturulan kod:
- sınıfını özniteliğiyle
[ApiController]işaretler. Bu öznitelik, denetleyicinin web API'si isteklerine yanıt verir. Özniteliğin olanaklı olduğu belirli davranışlar hakkında bilgi için bkz. ASP.NET Core ile web API’leri oluşturma . - Veritabanı bağlamını ( ) denetleyiciye ekleme için DI
TodoContextkullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.
Aşağıdaki ASP.NET Core şablonlarını içerir:
- Görünümlere sahip denetleyiciler
[action]yol şablonuna dahildir. - API denetleyicileri yol
[action]şablonuna dahil değil.
Belirteç [action] yol şablonunda değilse eylem adı yol dışında bırakılacaktır. Başka bir ifadeyle, eylemin ilişkili yöntem adı eşleşen yolda kullanılmaz.
PostTodoItem create yöntemini inceleme
nameof işleci kullanmak için içinde return PostTodoItem deyimini değiştirin:
// POST: api/TodoItems
[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);
}
Yukarıdaki kod, özniteliğiyle belirtilen bir HTTP POST [HttpPost] yöntemidir. yöntemi, HTTP isteğinin gövdesinde yapılacaklar öğesinin değerini alır.
Daha fazla bilgi için bkz. Http[Fiil] öznitelikleriyle öznitelik yönlendirme.
CreatedAtActionyöntemi:
- Başarılı olursa bir HTTP 201 durum kodu döndürür. HTTP 201, sunucuda yeni bir kaynak oluşturan HTTP POST yönteminin standart yanıtıdır.
- Yanıta bir Konum üst bilgisi ekler. üst
Locationbilgisi, yeni oluşturulan to-do öğesinin URI'lerini belirtir. Daha fazla bilgi için bkz. 10.2.2 201 Oluşturuldu. - Üst bilgi
GetTodoItemLocationURI'si oluşturmak için eyleme başvurur. C#nameofanahtar sözcüğü, çağrıda eylem adının sabit kodlamasını önlemek içinCreatedAtActionkullanılır.
Postman'i yükleme
Bu öğreticide web API'sini test etmek için Postman kullanılır.
- Postman'i yükleme
- Web uygulamasını başlatma.
- Postman'i başlatma.
- SSL sertifikası doğrulamayı devre dışı bırakma
- Dosya Ayarlar ( > Genel sekmesinde), SSL sertifikası doğrulamasını devre dışı bırakma.
Uyarı
Denetleyiciyi test ettikten sonra SSL sertifikası doğrulamasını yeniden etkinleştirin.
- Dosya Ayarlar ( > Genel sekmesinde), SSL sertifikası doğrulamasını devre dışı bırakma.
PostTodoItem'ı Postman ile test etmek
Yeni bir istek oluşturun.
HTTP yöntemini olarak
POSTayarlayın.URI'yi olarak
https://localhost:<port>/api/todoitemsayarlayın. Örneğin,https://localhost:5001/api/todoitems.Gövde sekmesini seçin.
Ham radyo düğmesini seçin.
Türü JSON (application/json) olarak ayarlayın.
İstek gövdesine, bir yap-yap öğesi için JSON girin:
{ "name":"walk dog", "isComplete":true }Gönder’i seçin.

Postman ile konum üst bilgisi URI'sinde test
Yanıt bölmesinde Üst Bilgiler sekmesini seçin.
Konum üst bilgisi değerini kopyalayın:

HTTP yöntemini olarak
GETayarlayın.URI'yi olarak
https://localhost:<port>/api/todoitems/1ayarlayın. Örneğin,https://localhost:5001/api/todoitems/1.Gönder’i seçin.
GET yöntemlerini inceleme
Bu yöntemler iki GET uç noktası kullanır:
GET /api/todoitemsGET /api/todoitems/{id}
Tarayıcıdan veya Postman'den iki uç noktayı çağırarak uygulamayı test edin. Örnek:
https://localhost:5001/api/todoitemshttps://localhost:5001/api/todoitems/1
çağrısı tarafından aşağıdakine benzer bir yanıt GetTodoItems üretir:
[
{
"id": 1,
"name": "Item1",
"isComplete": false
}
]
Postman ile Get testi
- Yeni bir istek oluşturun.
- HTTP yöntemini GET olarak ayarlayın.
- İstek URI'si olarak
https://localhost:<port>/api/todoitemsayarlayın. Örneğin,https://localhost:5001/api/todoitems. - Postman'de İki bölmeli görünümü ayarlayın.
- Gönder’i seçin.
Bu uygulama bir bellek içinde veritabanı kullanır. Uygulama durdurulur ve başlatıldıktan sonra önceki GET isteği herhangi bir veri vermez. Hiçbir veri döndürülzse, uygulamaya POST verileri.
Yönlendirme ve URL yolları
özniteliği, [HttpGet] bir HTTP GET isteğine yanıt veren bir yöntemi ifade ediyor. Her yöntemin URL yolu aşağıdaki gibi oluşturulur:
Denetleyicinin özniteliğinde şablon dizesiyle
Routeçalışmaya başlama:[Route("api/[controller]")] [ApiController] public class TodoItemsController : ControllerBase { private readonly TodoContext _context; public TodoItemsController(TodoContext context) { _context = context; }yerine denetleyicinin adını yazın; kurala göre denetleyici sınıfı adı
[controller]eksi "Denetleyici" soneki olur. Bu örnek için denetleyici sınıfı adı TodoItems Controller' olduğu için denetleyici adı "TodoItems" olur. ASP.NET Core büyük/büyük/büyük harfe duyarlı değildir.Özniteliğin
[HttpGet]bir yol şablonu varsa (örneğin, ), bunu yola[HttpGet("products")]ekler. Bu örnek şablon kullanmaz. Daha fazla bilgi için bkz. Http[Fiil] öznitelikleriyle öznitelik yönlendirme.
Aşağıdaki GetTodoItem yöntemde, "{id}" yapılacaklar öğesinin benzersiz tanımlayıcısı için bir yer tutucu değişkenidir. GetTodoItemÇağrıldığında, "{id}" URL'de değeri yöntemine parametresinde id sağlanır.
// GET: api/TodoItems/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
return todoItem;
}
Dönüş değerleri
ve yöntemlerinin dönüş GetTodoItems GetTodoItem türü ActionResult t <T> t tür. ASP.NET Core nesnesini otomatik olarak JSON'a seri hale getirmez ve JSON'u yanıt iletisi gövdesine yazar. İşsiz özel durumların olmadığını varsayarak, bu dönüş türü için yanıt kodu 200'tir. İşlenemeyen özel durumlar 5xx hatalarına çevrilir.
ActionResult dönüş türleri çok çeşitli HTTP durum kodlarını temsil ediyor olabilir. Örneğin, GetTodoItem iki farklı durum değeri getirebilirsiniz:
- İstenen kimlikle eşleşen bir öğe yoksa yöntem 404 hata NotFound kodunu döndürür.
- Aksi takdirde, yöntem bir JSON yanıt gövdesi ile 200 döndürür. Http
item200 yanıtı döndüren sonuçlar.
PutTodoItem yöntemi
PutTodoItem yöntemini inceleyin:
// PUT: api/TodoItems/5
[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 , ile PostTodoItem benzerdir, ancak HTTP PUT kullanır. Yanıt: 204 (İçerik Yok). HTTP belirtimına göre PUT isteği, istemcinin yalnızca değişiklikleri değil güncelleştirilmiş varlığın tamamını göndermesini gerektirir. Kısmi güncelleştirmeleri desteklemek için HTTP PATCH kullanın.
çağrısında bir hata PutTodoItem alırsanız, veritabanında bir öğe olduğundan emin olmak için öğesini GET arayın.
PutTodoItem yöntemini test etmek
Bu örnek, uygulama her başlatıcıda başlatılması gereken bir bellek içinde veritabanı kullanır. PUT çağrısı öncesinde veritabanında bir öğe olmalıdır. PUT çağrısı yapmadan önce veritabanında bir öğe olduğundan emin olmak için GET çağrısı yapma.
Id = 1 olan to-do öğesini güncelleştirin ve adını "akış yemi" olarak ayarlayın:
{
"id":1,
"name":"feed fish",
"isComplete":true
}
Aşağıdaki görüntüde Postman güncelleştirmesi yer amektedir:

DeleteTodoItem yöntemi
DeleteTodoItem yöntemini inceleyin:
// DELETE: api/TodoItems/5
[HttpDelete("{id}")]
public async Task<ActionResult<TodoItem>> DeleteTodoItem(long id)
{
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
_context.TodoItems.Remove(todoItem);
await _context.SaveChangesAsync();
return todoItem;
}
DeleteTodoItem yöntemini test etmek
Postman kullanarak bir to-do öğesini silin:
- yöntemini olarak
DELETEayarlayın. - Silinecek nesnenin URI'lerini ayarlayın
https://localhost:5001/api/todoitems/1(örneğin). - Gönder’i seçin.
Fazla gönderiyi engelleme
Şu anda örnek uygulama nesnenin tamamını TodoItem gösterir. Üretim uygulamaları genellikle girişi yapılan ve modelin bir alt kümesi kullanılarak döndürülen verileri sınırlandırr. Bunun birden çok nedeni vardır ve güvenlik önemli bir nedendir. Modelin alt kümesi genellikle Veri Aktarım Nesnesi (DTO), giriş modeli veya görünüm modeli olarak adlandırılır. Bu makalede DTO kullanılmıştır.
DTO aşağıdakiler için kullanılabilir:
- Fazla gönderiyi önle.
- İstemcilerin görüntülemesi gereken özellikleri gizle.
- Yük boyutunu azaltmak için bazı özellikleri atla.
- İç içe nesneleri içeren nesne grafiklerini düzlük. Düz nesne grafları istemciler için daha kullanışlı olabilir.
DTO yaklaşımını göstermek için sınıfını TodoItem gizli bir alan içerecek şekilde güncelleştirin:
public class TodoItem
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
public string Secret { get; set; }
}
Gizli alan bu uygulamadan gizlenir, ancak bir yönetim uygulaması bunu açığa çıkarmayı seçebilir.
Gizli alan yayınlaya ve alacı 2.000.000'e kadar olan tüm bilgileri girin.
DTO modeli oluşturma:
public class TodoItemDTO
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
kullanmak TodoItemsController için 'i TodoItemDTO güncelleştirin:
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItemDTO>>> GetTodoItems()
{
return await _context.TodoItems
.Select(x => ItemToDTO(x))
.ToListAsync();
}
[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);
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateTodoItem(long id, TodoItemDTO todoItemDTO)
{
if (id != todoItemDTO.Id)
{
return BadRequest();
}
var todoItem = await _context.TodoItems.FindAsync(id);
if (todoItem == null)
{
return NotFound();
}
todoItem.Name = todoItemDTO.Name;
todoItem.IsComplete = todoItemDTO.IsComplete;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
{
return NotFound();
}
return NoContent();
}
[HttpPost]
public async Task<ActionResult<TodoItemDTO>> CreateTodoItem(TodoItemDTO todoItemDTO)
{
var todoItem = new TodoItem
{
IsComplete = todoItemDTO.IsComplete,
Name = todoItemDTO.Name
};
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction(
nameof(GetTodoItem),
new { id = todoItem.Id },
ItemToDTO(todoItem));
}
[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) =>
_context.TodoItems.Any(e => e.Id == id);
private static TodoItemDTO ItemToDTO(TodoItem todoItem) =>
new TodoItemDTO
{
Id = todoItem.Id,
Name = todoItem.Name,
IsComplete = todoItem.IsComplete
};
}
Gizli alan gönderileye veya alana alamayanı doğrulayın.
JavaScript ile web API'sini çağırma
Web API'sini kimlik doğrulaması desteği ekleme
ASP.NET Core Identityweb uygulamalarına kullanıcı arabirimi (UI) ASP.NET Core işlevselliği ekler. Web API'lerinin ve SPA'ların güvenliğini sağlamak için aşağıdakilerden birini kullanın:
- Azure Active Directory
- Azure Active Directory B2C (Azure AD B2C)
- IdentitySunucu4
IdentityServer4, bir OpenID Bağlan ve OAuth 2.0 çerçevesidir ASP.NET Core. IdentityServer4 aşağıdaki güvenlik özelliklerini sağlar:
- Hizmet Olarak Kimlik Doğrulaması (AaaS)
- Birden çok uygulama türü üzerinde çoklu oturum açma/kapatma (SSO)
- API'ler için erişim denetimi
- Federasyon Ağ Geçidi
Daha fazla bilgi için bkz. Identity Server4'e Hoş Geldiniz.
Ek kaynaklar
Bu öğretici için örnek kodu görüntüleme veya indirme. Bkz. indirme.
Daha fazla bilgi için aşağıdaki kaynaklara bakın:
- ASP.NET Core ile web API’leri oluşturma
- Swagger/openapı ile web apı 'si belgelerini ASP.NET Core
- Razor ASP.NET Core Entity Framework Core olan sayfalar-öğretici 1/8
- ASP.NET Core denetleyici eylemlerine yönlendirme
- Web API'sinde denetleyici eylemi ASP.NET Core türleri
- ASP.NET Core uygulamalarını Azure App Service dağıtma
- Konak ve dağıtım ASP.NET Core
- Microsoft Learn: ASP.NET Core ile web API'si oluşturma



