Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ASP.NET Web API: Wie spezielle Actions aufrufen mit der ID aufrufen?
GambaJo
myCSharp.de - Member

Avatar #avatar-4143.jpg


Dabei seit:
Beiträge: 101

Themenstarter:

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

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Ahrimaan
myCSharp.de - Member



Dabei seit:
Beiträge: 363
Herkunft: Thorn

beantworten | zitieren | melden

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
Dieser Beitrag wurde 7 mal editiert, zum letzten Mal von Ahrimaan am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16152

beantworten | zitieren | melden

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)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
malignate
myCSharp.de - Member

Avatar #avatar-3206.png


Dabei seit:
Beiträge: 751

beantworten | zitieren | melden

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}/
private Nachricht | Beiträge des Benutzers