0

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?

1
  • 1
    Your route config is wrong for your needs. you need to specify the api/{controller}/{action}/{id} before api/{controller}/{id} also to use attribute routing, you need this config.MapHttpAttributeRoutes(); Commented Dec 16, 2016 at 11:20

3 Answers 3

4

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

Sign up to request clarification or add additional context in comments.

Comments

2

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);
    }
}

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.