Laden...

ASP.NET Web API: Wie spezielle Actions aufrufen mit der ID aufrufen?

Erstellt von GambaJo vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.260 Views
GambaJo Themenstarter:in
105 Beiträge seit 2006
vor 8 Jahren
ASP.NET Web API: Wie spezielle Actions aufrufen mit der ID aufrufen?

Wir experimentieren noch herum.
Momentan versuchen wir einen Lizenz-Service zu schreiben, mit dem man Lizenzen verwalten kann und auf die man auch einige Methoden anwenden können soll.

Wir haben folgenden Fall:
Unser Lizenz-Service verwaltet Lizenzen von verschiedenen Produkten.
Vereinfacht gesagt:

  • /api/licenses ruft alle Lizenzen ab
  • /api/licenses/1 ruft die Lizenz mit der ID 1 ab

So weit so gut.

Nun müssen wir aber auch Actions durchführen, die über die üblichen Verben GET, PUT, POST, DELETE gehen, wie z.B. beim Aktivieren einer Lizenz.

  • /api/licenses/1/activate
    oder
  • /api/licenses/activate/1

Das Problem ist nun, dass das System nicht unterscheiden kann, welches URL-Element die ID und welches Element die Action ist.

Ich habe bereits recherchiert, und das hier kommt dem Problem, welches wir haben, schon recht nahe.
Aber auch das fühlt sich nicht wirklich elegant an.

Wie ist das standardmäßig vorgesehen, also wie ist der best practice Fall? Oder ist die Web API lediglich für CRUD-Opertionen gedacht?

A
350 Beiträge seit 2010
vor 8 Jahren

Arbeite mit der WebAPI RESTFul.
Es ist im heutigem Web Standard geworden.
Wenn du deine APIs NICHT öffentlich amchst, kannst du jeden Murks nutzen, sobald es um klare dokumentierte APIs geht bleibe beim RESTful way über die Verben.

Sschau dir mal folgenden Link an, der erklärt dir zB Attribute Routing

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

EDIT: Du "Steuerst" deine Actions nur über die Verbs.
Es zwingt dich keiner dazu, zB Put für das "einfügen" eines Datensatzes sondern zur aktivierung zur nutzen 😉

Nicht schön aber möglich

Grüße

16.807 Beiträge seit 2008
vor 8 Jahren

Ich hab dazu neulich einen Blogeintrag geschriebem Eine moderne WebAPI – die OData Basics.

Odata gibt einem ganz gewisse Regeln, wie eine API umzusetzen ist. Auch wenn OData auf RESTful basiert, ist es nochmals eine ganze Ecke strenger.
Wenn man Odata nicht nutzen will (alle großen APIs gehen aber in diese Richtung bzw sind es schon, da ein Standard einfach notwendig ist), kann man sich zumindest die Funktionsweise abschauen.

In OData wird alles, was dem eigentlichen, Ressourcen gebundenen Zweck im Sinne von REST nicht dient, mit Functions gelöst.
Actions and Functions in OData v4 Using ASP.NET Web API 2.2
Hier wäre es
/api/Licenses/LicenseService.ActivateLicense(1)
oder die Kurzfassung
/api/Licenses/ActivateLicense(1)

742 Beiträge seit 2005
vor 8 Jahren

Ich finde auch, dass das von REST nicht so richtig beantwortet wird.

Du hast ja mehrere Möglichkeiten:

  1. Eigenes Verb, wäre eigentlich die sauberste Lösung, man bekommt aber mit den Clients und tlw. auch den Web Servern bisschen Stress.

  2. PUT oder BATCH mit Urls wie du es vorgeschlagen hast: Nutze ich auch, finde ich aber ein bisschen hässlich, weil die URLs ja eher resourcen beschreiben...also user/1/licenses/123

  3. Komplexere Bodies. Man könnte ja beschreiben, was du bearbeiten willst. Wird leider von WebAPI nicht direkt unterstützt und wäre auch bisschen komplexer was die Deserialisierung betrifft.

Ich würde einfach Attribute Routing verwenden, wenn du auch die Reihenfolge achtest, hast du eigentlich kein Problem mit Mehrdeutigkeiten. Außerdem kann man parameter ja noch weiter eingrenzen:

users/{id:number}/