WebApi V2 Routing

  • C# (ASP)
  • Web API

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    WebApi V2 Routing

    Hallo zusammen,

    ich bin gerade dabei mich in WebApi V2 einzuarbeiten. Ich bastle mir derzeit eine kleine API, um Aufträge in unserer Warenwirtschaft zum Verpacken freizugeben.

    Nun habe ich aber ein Problem mit dem Routing, da die Arten der Parameter sich unterscheiden.

    Folgende Methoden sollen mithilfe der API ausführbar sein:

    C#-Quellcode

    1. int GetAnzahlFreizugebeneAufträge()
    2. [HttpGet]
    3. ResponseListAuftrag GetList(int offset, int size)
    4. [HttpGet]
    5. List<ResponseFreigabeAuftrag> GetFreigegebeneAufträge()
    6. [HttpPost]
    7. string Auftragfreigeben(int auftragsnummer)
    8. [HttpPost]
    9. string Auftragfreigeben(int auftragsnummer, DateTime date)
    10. [HttpDelete]
    11. string Delete(int auftragsnummer)


    Zuzüglich dazu gibt es noch folgende Methoden, die nur von der API genutzt werden sollen.

    C#-Quellcode

    1. List<int> GetFreizugebeneAufträgeNummern(int offset, int size)
    2. void CheckAuftrag(int auftragsnummer)
    3. void CheckPermissions()



    Meine Routingregel habe ich wie folgt definiert:

    C#-Quellcode

    1. RouteTable.Routes.MapHttpRoute(
    2. name: "Auftragsfreigabe",
    3. routeTemplate: "api/auftragsfreigabe/{action}/{auftragsnummer}/{date}",
    4. defaults: new { controller = "auftragsfreigabe", auftragsnummer = System.Web.Http.RouteParameter.Optional, date = System.Web.Http.RouteParameter.Optional, size = System.Web.Http.RouteParameter.Optional, offset = System.Web.Http.RouteParameter.Optional }
    5. );


    Nun weiß ich leider nicht, wie ich die Regel am besten definieren soll.

    Die Funktionen sollen wie folgt später aufgerufen werden:
    api/auftragsfreigabe/freigegeben -> List<ResponseFreigabeAuftrag> GetFreigegebeneAufträge()
    api/auftragsfreigabe/freigabe/anzahl -> GetAnzahlFreizugebeneAufträge()
    api/auftragsfreigabe/freigabe/10000 -> Auftragfreigeben(int auftragsnummer)
    api/auftragsfreigabe/freigabe/10000/2020-02-21 -> Auftragfreigeben(int auftragsnummer, DateTime date)
    api/auftragsfreigabe/freigabe/0/10 -> GetList(int offset, int size)
    api/auftragsfreigabe/delete/10000 -> Delete(int auftragsnummer)

    Weiß jemand, wie ich dass entsprechend bewerkstelligen kann? Aus der MSDN Seite werde ich nicht wirklich schlau, da ich hier kein Beispiel für gleiche Actions mit unterschiedlichen Parametern finden konnte.

    -Marvin
    Hi,

    das schaut mir danach aus als würdest du eine REST API designen wollen

    also ich würde dir empfehlen dafür nicht WebApi V2 zu nehmen, sondern asp.net core mvc.

    Grundsätzlich solltest du dir als erstes den Aufbau deiner REST Api überlegen. Bei REST spricht man von Resourcen und über REST Aufrufe kann man deren State transferieren.
    Dabei gilt mal als Grundkonzept:
    - Resourcen sind immer Substantive, also Freigaben zum Beispiel
    - Es gibt im Normalfall eine Liste: /api/Freigaben und eine einzelne Resource (Detail) /api/Freigaben/{id}
    - Manipulation an den Resourcen laufen über HTTP Methoden: GET -> Abfrage, DELETE -> löschen, POST -> neu Anlegen, PUT -> Updaten(Austauschen), (PATCH -> partielles Update)
    - Resourcen können hierarchisch aufgebaut -> api/Freigaben/{id}/Aufräge/{id} usw sein
    - Ein GET sollte nichts manipulieren. Wenn ich 3 mal GET Aufrufe sollte ich 3 mal hintereinander das gleiche Ergebnis haben

    "freigeben" oder "delete" sind Verben und daher zu vermeiden. Es gibt seltene Fälle wo man vll mal einer Methode aufruft, aber im Grunde sollte man das vermeiden.
    Die Methoden sind immer GET/POST/PUT/DELETE.

    Außerdem hat sich bewährt, Filter oder ähnliche Dinge am besten als Query Parameter zu implementieren.

    Desweiteren würde ich dir auch empfehlen Attribut Based Routing zu verwenden.

    Hoffe das hilft dir etwas weiter.
    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo @Mono

    erstmal vielen Dank für deine Antwort. ASP.NET Core MVC ist leider keine Option, da die API bereits in ein WebForms Projekt eingebunden ist.
    Resourcen können hierarchisch aufgebaut -> api/Freigaben/{id}/Aufräge/{id} usw sein


    Mir ist noch nicht klar, wie ich jetzt hier zwischen den Parametern unterscheiden soll. Trägt er jetzt bei beiden den selben Wert ein? Wie sieht es aus, wenn die Datentypen unterschiedlich sind, wie in meinem Beispiel?

    api/auftragsfreigabe/freigabe/10000/2020-02-21 -> Auftragfreigeben(int auftragsnummer, DateTime date)
    api/auftragsfreigabe/freigabe/0/10 -> GetList(int offset, int size)

    Was ist der Unterschied zwischen einer REST API und einer Web API V2?

    Außerdem hat sich bewährt, Filter oder ähnliche Dinge am besten als Query Parameter zu implementieren.


    Diese kann ich ja wie gehabt in der API mittels Request. aufrufen, korrekt?

    LG Marvin
    Schau dir mal das hier näher an:

    docs.microsoft.com/en-us/aspne…bute-routing-in-web-api-2

    Ich würde dein Vorhaben wenn es geht vermeiden. Ich bin jetzt bei WebAPI nicht mehr so drin, aber das liesse sich vermutlich nur über eine eigene implementierung des IHttpActionSelector machen.

    Ich empfehle die Attribute Routing zu verwenden, das ist klarer und flexibler, da du die Routen direkt an die Methoden über Attribute hängst.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!