Menjelajahi perutean di API Web

ASP.Net Web API adalah kerangka kerja ringan yang digunakan untuk membangun layanan HTTP tanpa negara. Anda dapat menggunakan API Web untuk merancang dan mengimplementasikan layanan RESTful yang berjalan di HTTP. REST adalah gaya arsitektur - serangkaian batasan yang digunakan untuk mengimplementasikan layanan stateless. API Web telah menjadi teknologi pilihan untuk membangun layanan HTTP yang ringan. Dalam posting ini, saya akan menyajikan diskusi tentang cara kerja perutean di API Web.

Ketika Anda membuat proyek API Web di Visual Studio, Anda akan mengamati bahwa proyek MVC dibuat juga. Mirip dengan ASP.Net MVC, konfigurasi perutean dalam proyek API Web dipanggil dari file Global.asax. Proyek API Web menyimpan informasi konfigurasi di kelas RouteConfig dan WebApiConfig - keduanya ada di folder Application_Start. Mirip dengan proyek MVC, Anda akan mengamati file RouteConfig.cs yang dibuat di folder App_Start dalam solusi Anda.

Pengontrol di Web API bertanggung jawab untuk menangani permintaan HTTP. Metode publik dari pengontrol dikenal sebagai metode aksi. Segera setelah permintaan diterima, runtime API Web mengarahkan permintaan ke tindakan yang sesuai untuk menangani permintaan. Sekarang, untuk menentukan tindakan mana yang harus dipanggil, runtime API Web memanfaatkan tabel perutean. Berbeda dengan aplikasi ASP.Net MVC yang khas, runtime API Web merutekan permintaan masuk ke pengontrol yang sesuai dengan mencocokkan kata kerja HTTP dari permintaan tersebut ke metode tindakan yang sesuai.

Dengan ASP.Net 5 (akan dirilis segera sebagai bagian dari Visual Studio 2015), ada kerangka inti terpadu - Anda memiliki kerangka kerja tamasya tunggal, kerangka kerja pengikatan model tunggal, dan pipa satu filter. Anda sekarang memiliki satu inti terpadu untuk ASP.Net MVC, ASP.Net Web API, dan ASP.Net Web Pages. Jadi, sekarang hanya ada satu jenis pengontrol untuk menangani permintaan: itu umum untuk aplikasi ASP.Net MVC, ASP.Net Web API, dan ASP.Net Anda.

Template rute MVC default terlihat seperti ini:

{controller} / {action} / {id}

Sebaliknya, rute API Web default terlihat seperti ini:

api/{controller}/{id}

The default route created when you create a new Web API project in Visual Studio looks like this:

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Note how the default route is prefixed by "api". It is a good practice to define the routes of your Web API application by prefixing them with "api" to make them distinct from the standard MVC route. On a different note, when you look at the default route for a Web API project, you wouldn't see the "{action}" route parameter -- the Web API runtime maps requests to the appropriate actions based on the HTTP verb of the requests.

However, you can modify the Web API route definition to include an "{action}" parameter. The following code snippet illustrates how the modified WebApiConfig class looks like.

public static class WebApiConfig

{

public static void Register(HttpConfiguration config)

{

config.Routes.MapHttpRoute(

name: "DefaultApi",

routeTemplate: "api/{controller}/{action}/{id}",

defaults: new { id = RouteParameter.Optional }

);

}

}

Now that you have specified "{action}" as part of the route, you need to specify the action when invoking the WebAPI method. Consider the following URL: //idgservice/authors/1

In this URL, idgservice is the name of the domain where the WebAPI has been hosted, authors is the controller name, and 1 is passed as a parameter. However, this wouldn't work if you have defined "{action}" in your route definition. You would need to explicitly mention the action name when calling your WebAPI this this case. Here's the correct URL that includes the action name as part of the URL: //idgservice/authors/GetAuthorDetails/

Note that the action name in the above URL is GetAuthorDetails and has been mentioned as part of the modified URL.

You can also specify the HTTP method for an action using the HttpGet, HttpPut, HttpPost, or HttpDelete attribute. The code snippet given below illustrates how this can be achieved:

public class AuthorsController : ApiController

{

[HttpGet]

public Author GetAuthor(id) {}

}

If you would like to allow multiple HTTP methods for an action, you can take advantage of the AcceptVerbs attribute as shown below:

public class ProductsController : ApiController

{

[AcceptVerbs("GET", "HEAD")]

public Author GetAuthor(id) { }

}

You can also override the action using the ActionName attribute as shown in the code snippet given below:

public class AuthorsController : ApiController

{

[HttpGet]

[ActionName("AuthorDetails")]

public Author GetAuthor(id) {}

}

Note that you can also prevent a method from being invoked as an action by leveraging the NonAction attribute as shown below.

public class AuthorsController : ApiController

{

[HttpGet]

[NonAction]

public Boolean ValidateLogin(id) {}

}