1

I try to something on Web Api. First I will share my WebApiConfig

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"^[0-9]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiCategory",
            routeTemplate: "api/tales/{category}/{id}",
            defaults: new { controller = "Tales", id = RouteParameter.Optional},
            constraints: new { category = @"^[a-z]+$" }
        );

I read this issue and I fix my apiconfig file. My purpose like this:

  1. List GetAllTales() = api/tales/ -> 404 Not Found
  2. Tale GetTale(int id) = api/tales/1 -> Ok!
  3. List GetAllTalesByCategory(string categoryName) = api/tales/kids -> Ok!
  4. Tale GetTalesByCategoryAndId(string categoryName, int id) = api/tales/kids/1 -> Ok!

İf u wonder my ApiController

[HttpGet]
    public Tale GetAllTalesByCategoryAndId(string category, int id){}

    [HttpGet]
    public IEnumerable<Tale> GetAllTalesByCategory(string category){}

    [HttpGet]
    public IEnumerable<Tale> GetAllTales(){}

    [HttpGet]
    public Tale GetTale(int id){}

Thanks for all replies.

2
  • Put your custom route before the default one or the default one will pick up your requests. Commented Dec 13, 2013 at 22:16
  • Actually I dont get it. İf I put costum route /api/tales/kids gives an error. Because this send a request GetTale(int id). Commented Dec 13, 2013 at 22:24

1 Answer 1

1

You need to switch the route order. Default route will handle the request when you don't specify an id (api/tales) so you need to place your custom route before that.

config.Routes.MapHttpRoute(
        name: "ApiCategory",
        routeTemplate: "api/tales/{category}/{id}",
        defaults: new { controller = "Tales", 
                        id = RouteParameter.Optional, 
                        category = RouteParameter.Optional});

config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
        constraints: new { id = @"^[0-9]+$" }
    );
Sign up to request clarification or add additional context in comments.

9 Comments

I got it. How can I switch the routes? As u said I didn't use constraint for default route. But if I can do it(delete constraint) /api/tales/kids send a request GetTale(int id). I dont know how can I fix it.
Actually I dont have custom route. I have two route and it's here :/
@BerdaN ApiCategory is the custom route.
Hocam kusura bakma 2 saattir uğraşıyorum kafam döndü. Senin dediğin gibi yaptım ApiCategory üstte onun altında DefaultApi var ama yine /api/tales/ 404 dönüyor.
@BerdaN İlginç. Bende aynı route'larla /api/tales cevap veriyor. Sadece api/tales/kids hata veriyor, o da id nullable olmadığı için.
|

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.