A ile yanıt veren en temel sürüm JsonResult
:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Ancak, kendi yanıt kodunuzla açık bir şekilde ilgilenemeyeceğiniz için bu sorununuzu çözmeyecektir.
Durum sonuçları üzerinde kontrol sahibi olmanın yolu, daha ActionResult
sonra StatusCodeResult
türden yararlanabileceğiniz bir yer döndürmeniz gerektiğidir .
Örneğin:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
Yukarıdaki örneklerin her ikisinin de Microsoft Belgeler'den edinilebilen harika bir kılavuzdan geldiğini unutmayın: Yanıt Verilerini Biçimlendirme
Ekstra Şeyler
Sık karşılaştığım sorun, VS'deki "Yeni Proje" şablonundaki varsayılan yapılandırma ile gitmek yerine WebAPI'm üzerinde daha ayrıntılı bir kontrol istememdi.
Bazı temel bilgileri edindiğinizden emin olalım ...
1. Adım: Hizmetinizi yapılandırın
ASP.NET Core WebAPI'nizin durum kodunun tam denetimi boyunca bir JSON Seri Nesnesi ile yanıt vermesini sağlamak için, AddMvc()
hizmeti ConfigureServices
genellikle bulunan yönteminize dahil ettiğinizden emin olarak başlamalısınız Startup.cs
.
AddMvc()
Diğer istek türlerine yanıt vermenin yanı sıra JSON için Giriş / Çıkış Biçimlendiriciyi otomatik olarak içereceğini unutmayın .
Projeniz tam kontrol gerektiriyorsa ve WebAPI'nizin application/json
diğer istek türlerini (standart tarayıcı isteği gibi) içeren ve bunlara yanıt vermeyecek çeşitli istek türlerine nasıl davranacağı gibi hizmetlerinizi kesin olarak tanımlamak istiyorsanız, bunu manuel olarak tanımlayabilirsiniz. aşağıdaki kod:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
Başka bir serileştirme biçimine (protobuf, tasarruf, vb.) Yanıt vermek isteyebiliyorsanız, kendi özel Giriş / Çıkış biçimlendiricilerinizi eklemenin bir yolunu da eklediğimi fark edeceksiniz.
Yukarıdaki kod dizisi çoğunlukla AddMvc()
yöntemin bir kopyasıdır . Bununla birlikte, her "varsayılan" hizmeti, önceden gönderilen şablonla gitmek yerine her bir hizmeti tanımlayarak kendi başımıza uygularız. Kod bloğundaki havuz bağlantısını ekledim veya AddMvc()
GitHub havuzundan kontrol edebilirsiniz . .
Unutmayın, sadece ilk etapta uygulamak yerine, varsayılanları "geri alarak" çözmeye çalışacak bazı kılavuzlar vardır ... , kötü kod ve açıkçası yakında kaybolacak eski bir alışkanlık.
2. Adım: Bir Denetleyici Oluşturun
Sorunuzu sıralamak için size gerçekten basit bir soru göstereceğim.
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
3. Adım: Content-Type
veAccept
İsteğinizdeki başlıklarınızın Content-Type
ve Accept
başlıklarınızın doğru ayarlandığından emin olmanız gerekir . Sizin durumunuzda (JSON), bunu ayarlamak istersiniz .application/json
WebAPI'nızın varsayılan olarak JSON olarak yanıt vermesini istiyorsanız, istek üstbilgisinin belirttiklerinden bağımsız olarak bunu birkaç şekilde yapabilirsiniz .
Yol 1
Daha önce önerdiğim makalede gösterildiği gibi ( Yanıt Verilerini Biçimlendirme ) belirli bir biçimi Denetleyici / Eylem düzeyinde zorlayabilirsiniz. Şahsen bu yaklaşımı sevmiyorum ... ama burada tamlık için:
Belirli Bir Biçimi Zorlama Belirli bir eylem için yanıt biçimlerini kısıtlamak isterseniz, [Üretir] filtresini uygulayabilirsiniz. [Üretir] filtresi, belirli bir eylem (veya denetleyici) için yanıt biçimlerini belirtir. Çoğu Filtre gibi, bu işlem, denetleyici veya genel kapsamda uygulanabilir.
[Produces("application/json")]
public class AuthorsController
[Produces]
Filtre içinde tüm işlemleri zorlar
AuthorsController
diğer biçemleyicileri uygulama için yapılandırılmış ve istemci temin edilmiş olsa bile, JSON biçimli yanıtları dönmek için Accept
farklı, mevcut biçimi talep başlık.
Yol 2
Tercih ettiğim yöntem, WebAPI'nin tüm isteklere istenen biçimde yanıt vermesidir. Ancak, istenen biçimi kabul etmemesi durumunda varsayılana geri dönme (örn. JSON)
İlk olarak, seçeneklerinize kaydetmeniz gerekir (daha önce belirtildiği gibi varsayılan davranışı yeniden işlememiz gerekir)
options.RespectBrowserAcceptHeader = true; // false by default
Son olarak, hizmet oluşturucuda tanımlanan biçimlendiricilerin listesini yeniden sıralayarak, web barındırıcısı varsayılan olarak listenin en üstüne yerleştirdiğiniz biçimlendiriciye (yani 0 konumu) ayarlanacaktır.
Daha fazla bilgi bu .NET Web Geliştirme ve Araçlar Blog girişinde bulunabilir
CreatedAtRoute
yöntem vb.