Versi paling dasar merespons dengan JsonResult
:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Namun, ini tidak akan membantu masalah Anda karena Anda tidak dapat secara eksplisit menangani kode respons Anda sendiri.
Cara untuk mendapatkan kontrol atas hasil status, adalah Anda harus mengembalikan ActionResult
yang mana Anda dapat mengambil keuntungan dari StatusCodeResult
jenis.
sebagai contoh:
// 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);
}
Perhatikan kedua contoh di atas berasal dari panduan hebat yang tersedia dari Dokumentasi Microsoft: Memformat Data Tanggapan
Barang ekstra
Masalah yang sering saya temui adalah bahwa saya ingin lebih banyak kontrol granular atas WebAPI saya daripada hanya pergi dengan konfigurasi default dari template "Proyek Baru" di VS.
Mari kita pastikan Anda memiliki beberapa dasar-dasarnya ...
Langkah 1: Konfigurasikan Layanan Anda
Untuk mendapatkan ASP.NET Core WebAPI Anda untuk merespons dengan Obyek Serialisasi JSON bersama kontrol penuh dari kode status, Anda harus memulai dengan memastikan bahwa Anda telah memasukkan AddMvc()
layanan dalam ConfigureServices
metode yang biasanya Anda temukan di Startup.cs
.
Penting untuk dicatat bahwa AddMvc()
akan secara otomatis menyertakan Input / Output Formatter untuk JSON bersama dengan menanggapi jenis permintaan lainnya.
Jika proyek Anda memerlukan kontrol penuh dan Anda ingin mendefinisikan layanan Anda secara ketat, seperti bagaimana WebAPI Anda akan berperilaku terhadap berbagai jenis permintaan termasuk application/json
dan tidak menanggapi jenis permintaan lain (seperti permintaan browser standar), Anda dapat menentukannya secara manual dengan kode berikut:
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)
}
Anda akan melihat bahwa saya juga menyertakan cara bagi Anda untuk menambahkan format Input / Output kustom Anda sendiri, jika Anda ingin menanggapi format serialisasi lain (protobuf, penghematan, dll).
Potongan kode di atas sebagian besar merupakan duplikat dari AddMvc()
metode ini. Namun, kami menerapkan masing-masing layanan "default" dengan menetapkan masing-masing dan setiap layanan alih-alih menggunakan yang sudah dikirim sebelumnya dengan templat. Saya telah menambahkan tautan repositori di blok kode, atau Anda dapat memeriksa AddMvc()
dari repositori GitHub. .
Perhatikan bahwa ada beberapa panduan yang akan mencoba menyelesaikan ini dengan "membatalkan" defaultnya, daripada tidak mengimplementasikannya sejak awal ... Jika Anda memperhitungkan bahwa kami sekarang bekerja dengan Open Source, ini adalah pekerjaan yang berlebihan , kode buruk dan terus terang kebiasaan lama yang akan segera menghilang.
Langkah 2: Buat Pengendali
Saya akan menunjukkan kepada Anda yang benar-benar mudah hanya untuk mendapatkan pertanyaan Anda diurutkan.
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();
}
}
Langkah 3: Periksa Content-Type
danAccept
Anda perlu memastikan bahwa Anda Content-Type
dan Accept
header dalam permintaan Anda diatur dengan benar. Dalam kasus Anda (JSON), Anda ingin mengaturnya menjadi application/json
.
Jika Anda ingin WebAPI Anda merespons sebagai JSON sebagai default, terlepas dari apa yang ditentukan header permintaan Anda dapat melakukannya dalam beberapa cara .
Cara 1
Seperti yang ditunjukkan pada artikel yang saya rekomendasikan sebelumnya ( Memformat Data Respons ) Anda bisa memaksa format tertentu pada level Controller / Action. Saya pribadi tidak suka pendekatan ini ... tapi ini untuk kelengkapan:
Memaksa Format Tertentu Jika Anda ingin membatasi format respons untuk tindakan spesifik yang Anda bisa, Anda dapat menerapkan filter [Menghasilkan]. Filter [Produces] menetapkan format respons untuk tindakan tertentu (atau pengontrol). Seperti kebanyakan Filter, ini dapat diterapkan pada action, controller, atau lingkup global.
[Produces("application/json")]
public class AuthorsController
The [Produces]
filter akan memaksa semua tindakan dalam
AuthorsController
mengembalikan tanggapan JSON-diformat, bahkan jika formatters lain dikonfigurasi untuk aplikasi dan klien memberikan Accept
sundulan meminta, format yang berbeda tersedia.
Cara 2
Metode yang saya sukai adalah agar WebAPI menanggapi semua permintaan dengan format yang diminta. Namun, jika tidak menerima format yang diminta, maka kembali ke default (mis. JSON)
Pertama, Anda harus mendaftarkannya di opsi Anda (kami perlu memperbaiki perilaku default, seperti disebutkan sebelumnya)
options.RespectBrowserAcceptHeader = true; // false by default
Akhirnya, dengan hanya memesan ulang daftar formatters yang ditentukan dalam pembuat layanan, host web akan secara default ke formatter Anda posisi di bagian atas daftar (yaitu posisi 0).
Informasi lebih lanjut dapat ditemukan di entri Blog .NET Web Development dan Tools ini
CreatedAtRoute
metode dll.