Saya menggunakan .Net MVC4 Web API untuk (semoga) mengimplementasikan RESTful api. Saya perlu meneruskan beberapa parameter ke sistem dan membuatnya melakukan beberapa tindakan, lalu mengembalikan daftar objek sebagai hasilnya. Secara khusus saya melewati dua tanggal dan mengembalikan catatan yang ada di antara mereka. Saya juga melacak catatan yang dikembalikan sehingga panggilan berikutnya tidak diproses ulang di sistem.
Saya telah mempertimbangkan beberapa pendekatan:
Menyerialkan params ke dalam satu string JSON dan memisahkannya di API. http://forums.asp.net/t/1807316.aspx/1
Teruskan params dalam string kueri.
Apa cara terbaik untuk meneruskan beberapa parameter kueri ke restful api?Mendefinisikan params dalam rute: api / controller / date1 / date2
Menggunakan POST yang secara inheren memungkinkan saya meneruskan objek dengan params.
Meneliti ODATA sejak Web API (saat ini) mendukungnya. Saya belum melakukan banyak hal dengan ini jadi saya tidak terlalu terbiasa dengannya.
Tampaknya praktik REST yang tepat menunjukkan saat data ditarik, Anda harus menggunakan GET. Namun, GET juga harus nullipotent (tidak menghasilkan efek samping), dan saya bertanya-tanya apakah penerapan khusus saya melanggar itu karena saya menandai catatan dalam sistem API, maka saya menghasilkan efek samping.
Itu juga membawa saya ke pertanyaan tentang parameter variabel pendukung. Jika daftar parameter masukan berubah, akan membosankan jika harus menentukan ulang rute Anda untuk Pilihan 3 jika itu sering terjadi. Dan apa yang mungkin terjadi jika parameter ditentukan pada waktu proses ...
Bagaimanapun, untuk penerapan spesifik saya, pilihan mana (jika ada) yang paling baik?
sumber
Menurut saya cara termudah adalah dengan menggunakan
AttributeRouting
.Sudah jelas dalam pengontrol Anda, mengapa Anda menginginkan ini di
WebApiConfig
file Global Anda ?Contoh:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")] public string Get(int paramOne, int paramTwo) { return "The [Route] with multiple params worked"; }
The
{}
nama harus mencocokkan parameter Anda.Sesederhana itu, sekarang Anda memiliki pemisah
GET
yang menangani beberapa parameter dalam contoh ini.sumber
WebApiConfig
file tersebut, tetapi ini memang lebih bagus.Route
parameter bernama (misalnya parameter kueri)?Cukup tambahkan rute baru ke
WebApiConfig
entri.Misalnya, untuk memanggil:
public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..
Menambahkan:
config.Routes.MapHttpRoute( name: "GetPagedData", routeTemplate: "api/{controller}/{pageNumber}/{pageSize}" );
Kemudian tambahkan parameter ke panggilan HTTP:
GET //<service address>/Api/Data/2/10
sumber
api/controller?start=date1&end=date2
URI gaya.Saya hanya perlu menerapkan RESTfull api di mana saya harus meneruskan parameter. Saya melakukan ini dengan meneruskan parameter dalam string kueri dengan gaya yang sama seperti yang dijelaskan oleh contoh pertama Mark "api / controller? Start = date1 & end = date2"
Di pengontrol saya menggunakan tip dari perpecahan URL di C #?
// uri: /api/courses public IEnumerable<Course> Get() { NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query); var system = nvc["System"]; // BL comes here return _courses; }
Dalam kasus saya, saya memanggil WebApi melalui Ajax dengan tampilan seperti:
$.ajax({ url: '/api/DbMetaData', type: 'GET', data: { system : 'My System', searchString: '123' }, dataType: 'json', success: function (data) { $.each(data, function (index, v) { alert(index + ': ' + v.name); }); }, statusCode: { 404: function () { alert('Failed'); } } });
Saya harap ini membantu...
sumber
Saya menemukan solusi yang sangat baik di http://habrahabr.ru/post/164945/
public class ResourceQuery { public string Param1 { get; set; } public int OptionalParam2 { get; set; } } public class SampleResourceController : ApiController { public SampleResourceModel Get([FromUri] ResourceQuery query) { // action } }
sumber
Get
), apakah Anda masih dapat menggunakan[FromUri]
? Saya tidak bisa membuatnya bekerja.Menggunakan GET atau POST dijelaskan dengan jelas oleh @LukLed . Mengenai cara Anda dapat menyampaikan parameter, saya sarankan untuk menggunakan pendekatan kedua (saya juga tidak tahu banyak tentang ODATA ).
Ini tidak ramah pengguna dan ramah SEO
Ini adalah pendekatan yang lebih disukai biasa.
Ini jelas bukan pendekatan yang baik. Hal ini membuat seseorang merasa bahwa seseorang
date2
adalah sub sumber daridate1
dan bukan itu masalahnya. Baikdate1
dandate2
parameter query dan datang dalam tingkat yang sama.Dalam kasus sederhana, saya akan menyarankan URI seperti ini,
Tetapi saya pribadi menyukai pola URI di bawah ini tetapi dalam hal ini kita harus menulis beberapa kode khusus untuk memetakan parameter.
sumber
Gunakan Binding Parameter seperti yang dijelaskan sepenuhnya di sini: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
sumber
[Route("api/controller/{one}/{two}")] public string Get(int One, int Two) { return "both params of the root link({one},{two}) and Get function parameters (one, two) should be same "; }
Kedua parameter dari tautan root ({one}, {two}) dan Get function parameter (satu, dua) harus sama
sumber
Saya tahu ini sangat tua, tetapi saya menginginkan hal yang sama baru-baru ini dan inilah yang saya temukan ...
public HttpResponseMessage Get([FromUri] string var, [FromUri] string test) { var retStr = new HttpResponseMessage(HttpStatusCode.OK); if (var.ToLower() == "getnew" && test.ToLower() == "test") { retStr.Content = new StringContent("Found Test", System.Text.Encoding.UTF8, "text/plain"); } else { retStr.Content = new StringContent("Couldn't Find that test", System.Text.Encoding.UTF8, "text/plain"); } return retStr; }
Jadi sekarang di alamat Anda / URI / ...
http (s): // myURL / api / myController /? var = getnew & test = test
Hasil: "Found Test"
http (s): // myURL / api / myController /? var = getnew & test = apa saja
Hasil: "Can't Find that test"
sumber
Sekarang Anda dapat melakukan ini hanya dengan menggunakan
public string Get(int id, int abc) { return "value: " + id + " " + abc; }
ini akan menghasilkan: "value: 5 10"
jika Anda menyebutnya dengan https: // yourdomain / api / yourcontroller? id = 5 & abc = 10
sumber
public HttpResponseMessage Get(int id,string numb) { //this will differ according to your entity name using (MarketEntities entities = new MarketEntities()) { var ent= entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb); if (ent != null) { return Request.CreateResponse(HttpStatusCode.OK, ent); } else { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system"); } } }
sumber