Angenommen, ich habe viel über die Versionierung einer erholsamen API gelesen und mich entschieden, den Dienst nicht über die URL zu versionieren, sondern Medientypen (Format und Schema in die Anfrage accept header):Implementieren der Versionsverwaltung einer RESTful-API mit WCF oder ASP.Net Web Api
Was wäre der beste Weg, um einen WCF-Service oder einen Web-API-Dienst zu implementieren, um Anfragen zu beantworten, die die angeforderte Ressource in der URI, dem Format (zB application/json) und dem Schema/Version (zB player-v2) im Accept-Header?
WCF ermöglicht es mir, basierend auf der URI zu routen, aber nicht basierend auf Kopfzeilen. Also kann ich nicht richtig routen.
Web Api ermöglicht mir benutzerdefinierte Mediatypeformatters zu definieren, Routing für das angeforderte Format, aber nicht das Schema (z. B. Rückgabetyp PlayerV1 oder PlayerV2).
Ich mag würde einen Service implementieren (entweder mit WCF oder Web-Api), die für diese Anforderung (Pseudo-Code):
api.myservice.com/players/123 Accept format=application/json; schema=player-v1
gibt eine PlayerV1 Einheit, im JSON-Format
und für diese Anforderung lautet:
api.myservice.com/players/123 Accept format=application/json; schema=player-v2
gibt eine PlayerV2-Entität im JSON-Format zurück.
Irgendwelche Tipps zur Umsetzung?
BEARBEITEN: Um zu klären, warum ich Content Negotiation verwenden, um mit Versionen umzugehen, siehe hier: REST API Design: Put the “Type” in “Content-Type”.
Beginnen wir nicht mit einer Diskussion darüber, welcher Weg besser ist (Version in URI oder nicht), da das hier nicht der Punkt ist. Ich könnte die Frage umformulieren: "Implementierung von Content-Negotiation in einer RESTful-API ..", die Implementierungsherausforderung wäre immer noch die gleiche, oder? – codeclash
@kardinal Ich habe aktualisiert. – Aliostad
Der Wertanbieter würde mir Zugriff auf das angeforderte Schema geben, aber in jedem Fall wäre der Rückgabetyp in Ihrem Beispiel Player, während ich tatsächlich je nach dem angeforderten Schema entweder einen Player oder PlayerV2, ... zurückgeben müsste. Fehle ich etwas? – codeclash