Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Api controller declaring more than one Get statement

Using the new Api Controller in MVC4, and I've found a problem. If I have the following methods:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

This will work. However, if I want to retrieve some different data of a different type, it defaults to the GetAll method, even though the $.getJSON is set to the GetAllIntegers method:

public IEnumberable<int> GetAllIntergers()

(bad naming conventions)

Is it possible for me to be able to do this?

Can I only have a single GetAll method in the Web API controller?

I think it's easier to visualise what I'm trying to achieve. Here is a snippet of code to show what I'd like to be able to do, in a single ApiController:

public IEnumerable<string> GetClients() { // Get data }  public IEnumerable<string> GetClient(int id) { // Get data }  public IEnumerable<string> GetStaffMember(int id) { // Get data }  public IEnumerable<string> GetStaffMembers() { // Get data } 
like image 767
Neil Knight Avatar asked Apr 12 '12 09:04

Neil Knight


People also ask

Can a controller have multiple get methods?

Usually a Web API controller has maximum of five actions - Get(), Get(id), Post(), Put(), and Delete(). However, if required you can have additional actions in the Web API controller.

Can we have multiple get methods in Web API?

As mentioned, Web API controller can include multiple Get methods with different parameters and types. Let's add following action methods in StudentController to demonstrate how Web API handles multiple HTTP GET requests.


1 Answers

This is all in the routing. The default Web API route looks like this:

config.Routes.MapHttpRoute(      name: "API Default",      routeTemplate: "api/{controller}/{id}",      defaults: new { id = RouteParameter.Optional }  ); 

With the default routing template, Web API uses the HTTP method to select the action. In result it will map a GET request with no parameters to first GetAll it can find. To work around this you need to define a route where the action name is included:

config.Routes.MapHttpRoute(     name: "ActionApi",     routeTemplate: "api/{controller}/{action}/{id}",     defaults: new { id = RouteParameter.Optional }  ); 

After that you can star making requests with following URL's:

  • api/yourapicontroller/GetClients
  • api/yourapicontroller/GetStaffMembers

This way you can have multiple GetAll in Controller.

One more important thing here is that with this style of routing, you must use attributes to specify the allowed HTTP methods (like [HttpGet]).

There is also an option of mixing the default Web API verb based routing with traditional approach, it is very well described here:

  • Web API: Mixing Traditional & Verb-Based Routing
like image 147
tpeczek Avatar answered Sep 27 '22 01:09

tpeczek