Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC4 Web API Rest interface with Multiple Parameters

I have a controller named LoginController with a Get method with a signature of:

public string Get(string Key, string Code, string UserID, string Password)

I want to be be able to invoke it with a call similar to:

http://localhost:1234/api/Login/KeyValue/CodeValue/UserValue/PasswordValue

I cannot get this to work. If I invoke the call with:

http://localhost:1234/api/Login?Key=KeyValue&Code=CodeValueUserID=UserValue&Password=PasswordValue 

The call is successful.

I've tried adding routes such as below to Global.asax

 routes.MapHttpRoute(name: "Login", routeTemplate: "api/{controller}/{action}/{Key}/{Code}/{UserID}/{Password}",
                defaults: new { Key = UrlParameter.Optional, Code = UrlParameter.Optional, UserID = UrlParameter.Optional, Password = UrlParameter.Optional });

or

 routes.MapHttpRoute(name: "Login", routeTemplate: "api/{controller}/{Key}/{Code}/{UserID}/{Password}",
                defaults: new { Key = UrlParameter.Optional, Code = UrlParameter.Optional, UserID = UrlParameter.Optional, Password = UrlParameter.Optional });

These do not seem to work. Where am I going wrong or is this even possible? I was able to do this in the RC version of WebApi with MVC3.

like image 324
keitn Avatar asked Oct 11 '12 08:10

keitn


People also ask

How do I pass multiple parameters to Web API?

Step1: Create a Blank Solution called WebAPI-Multiple-Objects as shown below. Add a new class library project (Model) into it and create two classes named Product, Supplier. Now, on the API controller side, you will get your complex types as shown below.

Can we declare FromBody attribute on multiple parameters?

The [FromBody] attribute can be applied on only one primitive parameter of an action method. It cannot be applied to multiple primitive parameters of the same action method.

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

It seems you are missing the action in your request (/api/Login/KeyValue/CodeValue/UserValue/PasswordValue). Try /api/Login/Get/KeyValue/CodeValue/UserValue/PasswordValue instead, if you intend to use the first route.

If you want to be able to call it without the action specified and default to "Get", you have to specify a default action:

defaults: new { Key = UrlParameter.Optional, Code = UrlParameter.Optional, UserID = UrlParameter.Optional, Password = UrlParameter.Optional, Action = "Get" }

I have successfully tried this in an ASP.NET MVC 4 project (Visual Studio 2012 RC):

Creating a LoginController with action:

public string Get(string Key, string Code, string UserID, string Password)
{
    return Key + Code + UserID + Password;
}

And mapping the route in Global.asax.cs:

 RouteTable.Routes.MapHttpRoute(null, "api/{controller}/{Key}/{Code}/{UserID}/{Password}",
            new { Key = UrlParameter.Optional, Code = UrlParameter.Optional, UserID = UrlParameter.Optional, Password = UrlParameter.Optional, Action = "Get"});

If it is not working for you, maybe another route is catching the request or the route is not being registered.

like image 152
strmstn Avatar answered Oct 27 '22 00:10

strmstn