Saya mengubah dari WCF Web API ke ASP.NET MVC 4 Web API baru. Saya memiliki UsersController, dan saya ingin memiliki metode bernama Authenticate. Saya melihat contoh bagaimana melakukan GetAll, GetOne, Post, dan Delete, namun bagaimana jika saya ingin menambahkan metode ekstra ke dalam layanan ini? Misalnya, UsersService saya harus memiliki metode yang disebut Autentikasi di mana mereka meneruskan nama pengguna dan kata sandi, namun itu tidak berhasil.
public class UsersController : BaseApiController
{
public string GetAll()
{
return "getall!";
}
public string Get(int id)
{
return "get 1! " + id;
}
public User GetAuthenticate(string userName, string password, string applicationName)
{
LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
userName, password, applicationName));
//check if valid leapfrog login.
var decodedUsername = userName.Replace("%40", "@");
var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);
if (leapFrogUsers.Count > 0)
{
return new User
{
Id = (uint)leapFrogUsers[0].Id,
Guid = leapFrogUsers[0].Guid
};
}
else
throw new HttpResponseException("Invalid login credentials");
}
}
Saya dapat mengakses myapi / api / users / dan itu akan memanggil GetAll dan saya dapat menjelajah ke myapi / api / users / 1 dan itu akan memanggil Get, namun jika saya memanggil myapi / api / users / authenticate? Username = {0} & password = {1} maka itu akan memanggil Get (NOT Authenticate) dan kesalahan:
Kamus parameter berisi entri null untuk parameter 'id' tipe non-nullable 'System.Int32' untuk metode 'System.String Get (Int32)' di 'Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController'. Parameter opsional harus berupa tipe referensi, tipe nullable, atau dideklarasikan sebagai parameter opsional.
Bagaimana cara memanggil nama metode kustom seperti Autentikasi?
Jawaban:
Secara default konfigurasi rute mengikuti konvensi RESTFul yang berarti hanya akan menerima nama aksi Get, Post, Put dan Delete (lihat rute di global.asax => secara default tidak memungkinkan Anda untuk menentukan nama aksi => itu menggunakan kata kerja HTTP untuk mengirimkan). Jadi, ketika Anda mengirim permintaan GET kepada
/api/users/authenticate
Anda pada dasarnya memanggilGet(int id)
tindakan dan passingid=authenticate
yang jelas macet karena tindakan Get Anda mengharapkan integer.Jika Anda ingin memiliki nama tindakan yang berbeda dari yang standar, Anda dapat mengubah definisi rute Anda di
global.asax
:Sekarang Anda dapat menavigasi
/api/values/getauthenticate
untuk mengautentikasi pengguna.sumber
{action}
itu memiliki batasan{id}
sehingga apa pun selainint
atauGuid
(atau apa pun) tidak akan cocok. Maka itu harus bisa jatuh ke yang disarankan oleh DarinIni adalah metode terbaik yang sejauh ini saya temukan untuk memasukkan metode GET tambahan sambil mendukung metode REST normal juga. Tambahkan rute berikut ke WebApiConfig Anda:
Saya memverifikasi solusi ini dengan kelas pengujian di bawah. Saya berhasil mencapai setiap metode di pengontrol saya di bawah ini:
Saya memverifikasi bahwa itu mendukung permintaan berikut:
Catatan Jika tindakan GET ekstra Anda tidak dimulai dengan 'Get', Anda mungkin ingin menambahkan atribut HttpGet ke metode tersebut.
sumber
put
anddelete
seperti yang Anda lakukanget
danpost
, akan berfungsi dengan baik juga?put
ataudelete
kata kerja karena permintaan tersebut biasanya akan menyertai parameter id untuk mengidentifikasi sumber daya yang ingin Anda terapkan operasi itu. Sebuahdelete
panggilan untuk/api/foo
harus melempar kesalahan karena yang foo yang Anda mencoba untuk menghapus? Oleh karena itu, rute DefaultApiWithId harus menangani kasus tersebut dengan baik.Saya hari-hari ke dunia MVC4.
Untuk apa nilainya, saya memiliki SitesAPIController, dan saya membutuhkan metode khusus, yang bisa disebut seperti:
Dengan nilai yang berbeda untuk parameter terakhir mendapatkan record dengan disposisi yang berbeda.
Apa yang Akhirnya berhasil untuk saya adalah:
Metode di SitesAPIController:
Dan ini di WebApiConfig.cs
Selama saya menamai {disposition} sebagai {id} yang saya temui:
Ketika saya mengganti namanya menjadi {disposition}, itu mulai bekerja. Jadi ternyata nama parameter tersebut cocok dengan nilai di placeholder.
Jangan ragu untuk mengedit jawaban ini agar lebih akurat / jelas.
sumber
Api Web secara default mengharapkan URL dalam bentuk api / {controller} / {id}, untuk mengganti perutean default ini. Anda dapat mengatur perutean dengan salah satu dari dua cara di bawah ini.
Pilihan pertama:
Tambahkan di bawah pendaftaran rute di WebApiConfig.cs
Hiasi metode tindakan Anda dengan HttpGet dan parameter seperti di bawah ini
untuk memanggil url metode di atas akan seperti di bawah ini
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = nilai1 & param2 = nilai2 & param3 = nilai3
Opsi kedua Tambahkan awalan rute ke kelas Controller dan Hiasi metode tindakan Anda dengan HttpGet seperti di bawah ini. Dalam hal ini, WebApiConfig.cs tidak perlu diubah. Itu dapat memiliki perutean default.
untuk memanggil url metode di atas akan seperti di bawah ini
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = nilai1 & param2 = nilai2 & param3 = nilai3
sumber
Jika Anda menggunakan ASP.NET 5 dengan ASP.NET MVC 6 , sebagian besar jawaban ini tidak akan berfungsi karena Anda biasanya akan membiarkan MVC membuat kumpulan rute yang sesuai untuk Anda (menggunakan konvensi RESTful default), yang berarti bahwa Anda tidak akan menemukan
Routes.MapRoute()
panggilan untuk mengedit sesuka Anda.The
ConfigureServices()
metode dipanggil olehStartup.cs
file yang akan mendaftarkan MVC dengan kerangka Injeksi Ketergantungan dibangun ke ASP.NET 5: dengan cara itu, ketika Anda meneleponApplicationBuilder.UseMvc()
kemudian di kelas itu, kerangka MVC secara otomatis akan menambahkan rute default ini untuk aplikasi Anda. Kita dapat melihat apa yang terjadi di balik kap mesin dengan melihatUseMvc()
penerapan metode dalam kode sumber kerangka kerja:Hal yang baik tentang ini adalah bahwa kerangka sekarang menangani semua kerja keras, mengulangi semua Tindakan Pengontrol dan mengatur rute default mereka, sehingga menghemat beberapa pekerjaan yang berlebihan.
Hal buruknya adalah, ada sedikit atau tidak ada dokumentasi tentang bagaimana Anda dapat menambahkan rute Anda sendiri. Untungnya, Anda dapat dengan mudah melakukannya dengan menggunakan pendekatan Berbasis Konvensi dan / atau Berbasis Atribut (alias Perutean Atribut ).
Berbasis Konvensi
Di kelas Startup.cs Anda, ganti ini:
dengan ini:
Berbasis Atribut
Hal yang hebat tentang MVC6 adalah Anda juga dapat menentukan rute pada basis per-pengontrol dengan menghias
Controller
kelas dan / atauAction
metode dengan parameter templatRouteAttribute
dan / atauHttpGet
/ yang sesuaiHttpPost
, seperti berikut ini:Pengontrol ini akan menangani permintaan berikut:
Perhatikan juga bahwa jika Anda menggunakan dua pendekatan togheter, rute berbasis atribut (ketika ditentukan) akan menimpa rute berbasis konvensi, dan keduanya akan menimpa rute default yang ditentukan oleh
UseMvc()
.Untuk info lebih lanjut bisa juga baca postingan berikut di blog saya.
sumber
public IActionResult Patch(int id, [FromQuery] Person person)
, semua properti yang masuk adalah nol!Lihat artikel ini untuk diskusi yang lebih panjang tentang tindakan bernama. Ini juga menunjukkan bahwa Anda dapat menggunakan atribut [HttpGet] daripada mengawali nama tindakan dengan "get".
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
sumber
Ubah saja WebAPIConfig.cs Anda seperti di bawah ini
Kemudian terapkan API Anda seperti di bawah ini
sumber
Web APi 2 dan versi yang lebih baru mendukung jenis perutean baru, yang disebut perutean atribut. Sesuai dengan namanya, atribut routing menggunakan atribut untuk mendefinisikan rute. Perutean atribut memberi Anda lebih banyak kontrol atas URI di API web Anda. Misalnya, Anda bisa dengan mudah membuat URI yang mendeskripsikan hierarki resource.
Sebagai contoh:
Akan sempurna dan Anda tidak memerlukan kode tambahan misalnya di WebApiConfig.cs. Hanya saja Anda harus memastikan perutean api web aktif atau tidak di WebApiConfig.cs, jika tidak Anda dapat mengaktifkan seperti di bawah ini:
Anda tidak perlu melakukan sesuatu lebih atau mengubah sesuatu di WebApiConfig.cs. Untuk lebih jelasnya Anda dapat melihat artikel ini .
sumber