Saya mencari cara yang benar untuk mengembalikan JSON dengan kode status HTTP di pengontrol .NET Core Web API saya. Saya menggunakan untuk menggunakannya seperti ini:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
Ini adalah dalam aplikasi 4.6 MVC tapi sekarang dengan NET Inti Saya tampaknya tidak memiliki ini IHttpActionResult
aku punya ActionResult
dan menggunakan seperti ini:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Tetapi respon dari server aneh, seperti pada gambar di bawah ini:
Saya hanya ingin pengontrol Web API mengembalikan JSON dengan kode status HTTP seperti yang saya lakukan di Web API 2.
c#
json
asp.net-core
asp.net-core-webapi
Rossco
sumber
sumber
CreatedAtRoute
metode dll.Jawaban:
Versi paling dasar merespons dengan
JsonResult
:Namun, ini tidak akan membantu masalah Anda karena Anda tidak dapat secara eksplisit menangani kode respons Anda sendiri.
sebagai contoh:
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 dalamConfigureServices
metode yang biasanya Anda temukan diStartup.cs
.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: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 memeriksaAddMvc()
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.
Langkah 3: Periksa
Content-Type
danAccept
Anda perlu memastikan bahwa Anda
Content-Type
danAccept
header dalam permintaan Anda diatur dengan benar. Dalam kasus Anda (JSON), Anda ingin mengaturnya menjadiapplication/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:
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)
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
sumber
IActionResult
denganreturn Ok(new {response = "123"});
Ceria!RespectBrowserAcceptHeader
sangat penting ketika menerapkan penggunaan serializer alternatif atau lebih umum, ketika Anda ingin memastikan bahwa klien Anda tidak mengirimkan permintaan cacat. Oleh karena itu, saya menekankan "Jika proyek Anda membutuhkan kontrol penuh dan Anda ingin secara tegas mendefinisikan layanan Anda" dan perhatikan kutipan blok yang disorot di atas pernyataan itu juga.Anda memiliki metode yang telah ditentukan sebelumnya untuk kode status paling umum.
Ok(result)
kembali200
dengan responsCreatedAtRoute
mengembalikan201
+ URL sumber daya baruNotFound
kembali404
BadRequest
kembali400
dllLihat
BaseController.cs
danController.cs
untuk daftar semua metode.Tetapi jika Anda benar-benar bersikeras Anda dapat menggunakan
StatusCode
untuk mengatur kode khusus, tetapi Anda benar-benar tidak boleh karena membuat kode kurang dibaca dan Anda harus mengulang kode untuk mengatur header (seperti untukCreatedAtRoute
).sumber
JSON
dalamActionResult
yang diciptakan olehJson()
metode. Itu tidak termasuk string "123" secara langsung.Json(...)
dan berikan string keStatusCode
Dengan ASP.NET Core 2.0 , cara ideal untuk mengembalikan objek dari
Web API
(yang disatukan dengan MVC dan menggunakan kelas dasar yang samaController
) adalahPerhatikan itu
200 OK
kode status (ini adalahOk
jenisObjectResult
)Accept
header dalam permintaan. JikaAccept: application/xml
dikirim dalam permintaan, itu akan kembali sebagaiXML
. Jika tidak ada yang dikirim,JSON
default.Jika perlu mengirim dengan kode status tertentu , gunakan
ObjectResult
atauStatusCode
sebagai gantinya. Keduanya melakukan hal yang sama, dan mendukung negosiasi konten.atau bahkan lebih berbutir halus dengan ObjectResult:
Jika Anda secara khusus ingin kembali sebagai JSON , ada beberapa cara
Perhatikan itu
JSON
dalam dua cara yang berbeda.Json(object)
.Produces()
atribut (yang aResultFilter
) dengancontentType = application/json
Baca lebih lanjut tentang mereka di dokumen resmi . Pelajari tentang filter di sini .
Kelas model sederhana yang digunakan dalam sampel
sumber
Cara termudah yang saya lakukan adalah:
sumber
Ini solusi termudah saya:
atau
sumber
Alih-alih menggunakan 404/201 kode status menggunakan enum
sumber
Jawaban luar biasa yang saya temukan di sini dan saya juga mencoba pernyataan pengembalian ini
StatusCode(whatever code you wish)
dan berhasil !!!sumber
Silakan merujuk kode di bawah ini, Anda dapat mengelola beberapa kode status dengan tipe JSON yang berbeda
sumber
Apa yang saya lakukan di aplikasi Asp Net Core Api saya adalah membuat kelas yang memanjang dari ObjectResult dan menyediakan banyak konstruktor untuk menyesuaikan konten dan kode status. Maka semua tindakan Controller saya menggunakan salah satu costructors sebagai tepat. Anda dapat melihat implementasi saya di: https://github.com/melardev/AspNetCoreApiPaginatedCrud
dan
https://github.com/melardev/ApiAspCoreEcommerce
di sini adalah bagaimana kelasnya terlihat (buka repo saya untuk kode lengkap):
Perhatikan basis (dto) yang Anda gantikan dto oleh objek Anda dan Anda harus baik-baik saja.
sumber
Saya mendapatkan ini untuk bekerja. Masalah besar saya adalah json saya adalah string (dalam database saya ... dan bukan tipe tertentu / dikenal).
Ok, akhirnya saya berhasil.
Saya kebetulan berada di asp.net core 3.1
Saya mendapat petunjuk dari sini :: https://www.jianshu.com/p/7b3e92c42b61
sumber