wake-up-neo.net

So ordnen Sie Web-API-Routen korrekt zu

Ich erstelle eine API für eine Twitter-ähnliche Site mithilfe der Web-API und habe Probleme beim Zuordnen der Routen

Ich habe die folgenden Aktionen für den Benutzer-Controller:

public User Get(string firstname, string lastname)
public User Get(Guid id)
public User Friends(Guid id)
public User Followers(Guid id)
public User Favorites(Guid id)

Die gewünschten Routen und die generierte Dokumentation sollten sein:

api/users?firstname={firstname}&lastname={lastname}
api/users/{id}
api/users/{id}/friends
api/users/{id}/followers
api/users/{id}/favorites

In WebApiConfig.cs habe ich:

config.Routes.MapHttpRoute(
    "2",
    "api/{controller}/{id}",
    new { action = "get", id = RouteParameter.Optional }
);


config.Routes.MapHttpRoute(
     "1",
     "api/{controller}/{id}/{action}"
);

Wie kann ich WebAPI-Routen korrekt zuordnen?

17
Donny

Angesichts der gewünschten Flexibilität sollten Sie einen Blick darauf werfen

Attribut-Routing in ASP.NET Web API 2

Aktivieren Sie in WebApiConfig.cs das Attribut-Routing wie

// Web API routes
config.MapHttpAttributeRoutes();

In UserController

Hinweis mit den Namen der Aktionen Friends, Followers and Favorites Sie implizieren die Rückgabe von Sammlungen und nicht von Einzelbenutzern

[RoutePrefix("api/users")]
public class UserController: ApiController {

    //eg: GET api/users?firstname={firstname}&lastname={lastname}
    [HttpGet]
    [Route("")]
    public User Get([FromUri]string firstname,[FromUri] string lastname) {...}

    //eg: GET api/users/{id}
    [HttpGet]
    [Route("{id:guid}")]
    public User Get(Guid id){...}

    //eg: GET api/users/{id}/friends
    [HttpGet]
    [Route("{id:guid}/friends")]
    public IEnumerable<User> Friends(Guid id){...}

    //eg: GET api/users/{id}/followers
    [HttpGet]
    [Route("{id:guid}/followers")]
    public IEnumerable<User> Followers(Guid id){...}

    //eg: GET api/users/{id}/favorites
    [HttpGet]
    [Route("{id:guid}/favorites")]
    public IEnumerable<User> Favorites(Guid id){...}
}
34
Nkosi

Das Routing ist auftragsabhängig. Das erste Match gewinnt immer. Daher ist es wichtig, dass Sie Ihre Routen von den spezifischsten zu den am wenigsten spezifischen bestellen.

// All parameters are required, or it won't match.
// So it will only match URLs 4 segments in length
// starting with /api.
config.Routes.MapHttpRoute(
     "1",
     "api/{controller}/{id}/{action}"
);

// Controller is required, id is optional.
// So it will match any URL starting with
// /api that is 2 or 3 segments in length.
config.Routes.MapHttpRoute(
    "2",
    "api/{controller}/{id}",
    new { action = "get", id = RouteParameter.Optional }
);

Wenn Ihre Routen auf diese Weise bestellt werden, erhalten Sie das Verhalten, das Sie erwarten.

5
NightOwl888

Zu diesem Thema gibt es eine Vielzahl nützlicher Referenzmaterialien, z.

Haben Sie sich diese angesehen?

Update ..

Es ist besser, explizit anzugeben, welcher Parameter welcher ist, dh:

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

    config.Routes.MapHttpRoute(
        name: "1",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: null
    );

Hauptsache, ich konnte falsch sehen, dass Sie Aktion/ID in der falschen Reihenfolge in Route "1" hatten.

1
MikeDub