2012-09-05 18 views
19

Sono curioso di sapere come altri hanno affrontato il problema della generazione di collegamenti ipermediali per le loro API Web? In particolare, sto usando l'API Web ASP.NET e sono diviso tra il fatto che le operazioni restituiscano tipi correlati all'ipermedia, o che restituiscano la risorsa stessa, e che le cose ipermedia avvengano più tardi nella pipeline. Cioè, le persone tendono a fare le cose come:Generazione di collegamenti Hypermedia in un'API Web

public Resource<Order> GetOrder(int id) { 
    return new Resource<Order>() { 
     Content = new Order(), 
     Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()} 
    } 

O qualcosa di più simile a

public Order GetOrder(int id) { return new Order(); } 

E poi aggiungere collegamenti ipermediali all'interno di un HttpOperationHandler o personalizzato formattatore o qualcosa del genere?

Se l'approccio è più simile a # 2, come fai a sapere quali link generare? Hai solo un set standard di link che vengono generati per tutti gli oggetti Order? Attributi che decorano varie operazioni in OrderController?

+0

Addendum: Ho letto il post di Glenn Block su hypermedia in Web API (http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and -samples /) e mentre sembra preferire la generazione dei collegamenti in funzione (simile all'esempio 1 sopra), mi sembra che il percorso del "middleware" che egli menziona verso la fine sia più naturale. – Jordan0Day

+1

guarda la presentazione di ammy su newzealand teched http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305 la sua soluzione è promettente per hypermedia con web api guarda anche qui github codice di esempio – Gomes

risposta

24

Preferisco l'opzione due (aggiungendo i collegamenti ipermediali più avanti nella pipeline) e blogged about doing this yesterday.

La soluzione era quella di "arricchire" le mie risorse con collegamenti ipermediali prima che vengano restituite al client utilizzando un gestore di messaggi.

+0

Questo è davvero fantastico, grazie per averlo condiviso. Abbiamo utilizzato i metodi di estensione e si trattava più del codice cookie cutter che rappresentava una riga di codice nel metodo action. Mi piace che tu abbia la risorsa che viene restituita e puoi aggiungere o non aggiungere hypermedia in base al contesto. – suing

9

È possibile utilizzare il Hyprlinkr da github

Sto pensando di usarlo nel mio prossimo progetto come seens essere bello e facile da fare e si può ottenere tramite package NuGet.

+3

Quindi Hyprlinkr è un buona soluzione per generare effettivamente i collegamenti - quando sai quali link vuoi generare. La mia domanda era più incentrata su "come faccio a sapere quali link devo generare", piuttosto che "come dovrei generarli?" In entrambi i casi, Hyperlinkr aiuta a risolvere il problema una volta arrivato alla parte "come". – Jordan0Day

2

Per rispondere a questa domanda, è istruttivo guardare verso l'approccio ASP.NET MVC per la gestione di questo, dal momento che ASP.NET MVC può essere visto come un text/html-vincolata versione di API Web (contenuti negoziazione manuale in deroga), e dal momento che ovviamente ha pesantemente influenzato il design dell'API Web.

Fondamentalmente, possiamo usare i formattatori personalizzati per variare le rappresentazioni in base al percorso o ad un attributo di azione. Questo è informato dal modo in cui ASP.NET MVC separa le viste dai modelli. In un progetto ASP.NET MVC, un singolo modello può essere rappresentato da vari modelli di viste. Ciascuno di questi modelli visualizza essenzialmente i collegamenti di transizione "hard-code" (anchor, form e elementi di collegamento) in quella particolare rappresentazione del modello. La selezione del modello di visualizzazione è guidata prevalentemente dalla convenzione (nome del controller e dell'azione), ma può anche essere codificata nell'azione.

Il motore di visualizzazione e la convenzione di ricerca vista in ASP.NET MVC possono essere considerati un programma di formattazione API Web personalizzato. Questo può essere generalizzato in modo tale che, per ciascun tipo di supporto supportato, un formattatore personalizzato utilizzi i dettagli della rotta - e facoltativamente un attributo applicato al metodo di azione invocato - per definire lo stato della risorsa. (In base a questa convenzione, c'è un vantaggio nella scelta dei nomi delle azioni che riflettono lo stato della risorsa.) Una volta che il formattatore conosce lo stato della risorsa, può delegare al codice di formattazione specifico dello stato. In questo codice sono definiti i collegamenti specifici dello stato.

Questo codice di formattazione specifico dello stato potrebbe anche delegare ad altri sottomoduli, analogamente al modo in cui le visualizzazioni del rasoio supportano la composizione di viste parziali.

1

Ho aggiunto la mia soluzione here

Esso utilizza classe e proprietà attributi, in combinazione con un metodo di estensione ApiController per popolare un oggetto ResourceLink nella vostra entità. Può anche popolare i collegamenti per qualsiasi proprietà della raccolta. Non è l'articolo finito, ma è abbastanza intuitivo e farà un buon inizio.