2012-02-08 24 views
10

Sto cercando di sviluppare un'applicazione in ASP.NET MVC 3 e vorrei fornire un'API pubblica allo stesso tempo.Versioning REST API di un'applicazione ASP.NET MVC

Dal guardarsi intorno, sembra che ci siano 2 modi per farlo. Creare un'area API e disporre di controller che restituiscano json/xml. Oppure utilizzare i filtri azione e un singolo set di controller front-end e restituire json/xml/html in base alle intestazioni delle richieste.

Mi piacerebbe fare il dopo, ma mi stavo chiedendo come si può andare sulla versione della propria API se si è andati questa rotta?

Se si passa al primo percorso, è possibile creare semplicemente un controller v1/v2, ma se lo si fa in un secondo momento, come è possibile farlo?

risposta

3

È possibile percorrere uno dei due percorsi: è possibile includere l'API nel percorso (anziché http://app.lication/category/1 si avrà qualcosa come http://app.lication/api/v1/category/1) oppure è possibile includere uno custom HTTP header.

In entrambi i casi è possibile discriminare quale versione viene chiamata.

+0

Riguardo all'opzione 1 - puoi elaborare? Non è ovvio come farlo quando si fa ciò che l'OP vuole fare - un singolo set di controller che restituisce json/xml/html a seconda delle intestazioni delle richieste. Poiché presumibilmente non vuole il '/ v1' nei suoi URL html. –

+0

@GabeMoothart - si utilizzerà il routing ASP.Net (http://msdn.microsoft.com/en-us/library/cc668201.aspx) per definire/estrarre i parametri URL. Rendere la parte API del percorso non significa che è necessario disporre di un controller per API (e non lo preclude, se le API sono radicalmente divergenti). – 48klocs

10

Il controllo delle versioni è un problema piuttosto complesso. Qui ci sono modi che ho guardato prima:

  1. URL. In questo caso si presume che https://api.example.com/v1/projects sia una risorsa diversa da http://api.example.com/v2/projects, anche se non è il caso. Basecamp sembra fare questo. Seguendo questo approccio, supponi che dovrai sempre supportare le vecchie API.
  2. Intestazioni. Gli URL rimangono gli stessi, tuttavia, il client passa un'intestazione HTTP aggiuntiva, ad esempio X-MYAPI-VERSION con ogni richiesta con un valore che identifica la versione dell'API da utilizzare. Lo Google Documents List API fa questo. Un potenziale problema con questo approccio è che le intestazioni HTTP possono essere rimosse dagli intermediari tra il client e il server.
  3. Parametri. Per aggirare il problema con l'opzione 2, è possibile passare la versione dell'API da utilizzare come parametro (ad esempio https://api.example.com/projects?v=3).
  4. Tipi di supporto. Qui gli URL rimangono invariati, tuttavia, gli utenti sono tenuti a specificare la rappresentazione delle risorse utilizzando le intestazioni di tipo Accetto e Contenuto. Ad esempio, un "progetto" può essere presentato utilizzando "application/vnd.mycompany.resource [-version] [+ format]" fornendo le rappresentazioni di "application/vnd.mycompany.project-v1 + json" per v1 json o " application/vnd.mycompany.project-v1 + xml "per v1 xml. Quando hai bisogno di una nuova versione di un progetto, il tipo mime può apparire come segue "application/vnd.mycompany.project-v2 + xml". Github sembra supportarlo.
  5. Parte del carico utile. In questo caso il carico utile della richiesta contiene il numero di versione da utilizzare. Ad esempio, quando viene passato XML, è possibile esaminare lo spazio dei nomi per determinare quale versione dell'API viene utilizzata. Per JSON, è possibile utilizzare una proprietà "$ version" o "_version" per specificare la versione.
  6. Chiave cliente. Quando l'applicazione è registrata, specifica quale versione dell'API vuole utilizzare. Quando si autentica il client, si garantisce di emulare la versione che desidera utilizzare.
  7. Nessun controllo delle versioni esplicito Esiste sempre l'opzione di non eseguire la versione dell'API e provare a gestire le modifiche in modo trasparente rendendo tutti i campi opzionali e gestendoli in modo appropriato quando mancano. È probabile che lo farai comunque per rendere le versioni future della tua API compatibili con la versione che stai sviluppando oggi.

Molti consigliano l'opzione 4, sebbene non sia sempre pratica. Molte di queste opzioni richiedono un lavoro aggiuntivo per lavorare con ASP.NET MVC.

+2

Se sei interessato all'approccio n. 1 (mia preferenza), controlla questo pacchetto NuGet e il codice/esempi corrispondenti su GitHub: https://www.nuget.org/packages/VersionedRestApi/1.0.0.2 – jakejgordon

+0

Per l'approccio # 2 (la mia preferenza), User-Agent sarebbe l'intestazione giusta per questo approccio (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43). "Il campo può contenere più gettoni di prodotto (punto 3.8) e commenti che identificano l'agente e gli eventuali sottoprodotti, che costituiscono una parte significativa della user agent" esempio potrebbe essere: User-Agent: YOUR_API_ID/2.0 –

+1

non lo faccio concorda con l'utilizzo di User-Agent per le API di versione. La specifica si riferisce al prodotto client. Ad esempio, il browser che si sta connettendo al server HTTP. Ha molto più beneficio quando lo sviluppatore dell'applicazione del client utilizza l'User-Agent per specificare il proprio client, in modo da poter tracciare l'utilizzo dell'API dal punto di vista del cliente. Molto utile quando AppX/1.1 non riesce su alcune chiamate a MyAPI v1.1, ma AppX/1.2 no. Perderai quel tipo di tracciamento. – bloudraak