Suraj K. Mad.
Suraj K. Mad.

Reputation: 31

Multiple Get function in WEB API Controller

I am creating a Web Api Controller. I want to create multiple Get function in the single Controller. See the below:

    // GET api/User/5
    [ResponseType(typeof(UserModel))]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

Below is my WebApi Route Config

 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Controllers with Actions
        // To handle routes like `/api/VTRouting/route`
        config.Routes.MapHttpRoute(
            name: "DefaultApiwithActionID",
            routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional } 
        );
    }

Below is my API Controller

       // GET api/User/5
    [ResponseType(typeof(UserModel))]
    [Route("api/UserApi/GetUser")]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/5
    [ResponseType(typeof(TanentDocumentsModel))]
    [Route("api/UserApi/GetUserDocuments")]
    public IHttpActionResult GetUserDocuments(Guid id)
    {
        var item = repository.GetUserDocuments(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    [Route("api/UserApi/GetCities")]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(StateModel))]
    [Route("api/UserApi/GetStates")]
    public IHttpActionResult GetStates(int id)
    {
        var item = repository.GetStates(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

How can I do this, so that I can call both function through URL?

Upvotes: 0

Views: 1661

Answers (3)

Aakash Prajapati
Aakash Prajapati

Reputation: 41

The easiest way, to update webapiconfig file.

// GET api/User/5
[HttpGet]    
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);    
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
    var item = repository.GetCities(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

You also have to assign that into Area API Folder ApiAreaRegistration.cs File

context.Routes.MapHttpRoute(
"Api_default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { area = "Api", id = RouteParameter.Optional }
);

like this, you have to assign according to your project

Upvotes: 0

Lalji Dhameliya
Lalji Dhameliya

Reputation: 1769

using route specified on method and in webapiconfig file.

like On method

[ResponseType(typeof(UserModel))]
[HttpGet]
[Route("api/getusers/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}
like others
[Route("api/getcities/{id}")]

or you can specified in file

       config.Routes.MapHttpRoute(
        name: "users",
        routeTemplate: "api/getusers/{id}",
        defaults: new { action = "GetUser", controller = "Users" }
        );

like this you can specified others

Upvotes: 4

Marcus Höglund
Marcus Höglund

Reputation: 16801

The easiest way, IMO, would be to do this with attribute routing. Add the route parameter infront of each method where you can specify the methods route.

// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
    var item = repository.GetCities(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

Upvotes: 2

Related Questions