My initial thought is to establish a RESTful API by building my own servlet to handle the requests, and of course, customize it to meet my aims. However, I have a feeling there are already many versions of this wheel out there so I would like to avoid reinventing it.
Probabilmente ci sono ma le API REST sono come gli ORM del database, possono potenzialmente accelerare lo sviluppo un po 'ma vengono con il sovraccarico e la maggior parte del lavoro sarà ancora focalizzata nella definizione delle interfacce.
La soluzione migliore è scegliere una piattaforma server di basso livello che ti permetta di controllare routing, richieste e risposte direttamente (es. URI + GET / POST / PUT / DELETE).
In effetti, se si impiega un po 'di tempo a leggere l'approccio HATEOAS alle API REST, inizierai a rendersi conto di quanto REST sia semplice e potente se pienamente utilizzato. Resisti all'impulso di usare anti-pattern REST hackerati in stile Ruby.
Aggiornamento:
Ecco un link valido per alcuni buoni esempi di anti-pattern REST.
Per anti-pattern REST in stile Ruby mi riferisco alla creazione inutile di URI per azioni specifiche.
Per l'URI:
// a URI representing a post
example.org/post/456
// another URI representing a post edit
example.org/post/456/edit
Al contrario di usare POST (cioè creare), PUT (cioè aggiornare), DELETE (cioè rimuovere).
Un altro esempio è l'anti-pattern del blog:
// filter by date
example.com/posts/2012/12/1/
// load by ID
example.com/posts/id/456
// load by title
example.com/posts/title/example-post-title
Fondamentalmente, cosa sta cercando e restituendo la prima istanza che corrisponde ai parametri della data. Il modo RESTful di fare un filtro è usando una querystring sull'URI.
// the post uri represents a post
example.com/post/456
// the posts uri represents a filtered list of posts
// think of a filtered ATOM feed
example.com/posts?date=12/12/1
example.com/posts?title=example-post-title
Ruby è stata una delle prime piattaforme diffuse che ha permesso di creare schemi di routing personalizzati / avanzati senza configurazioni oscure come mod_rewrite di apache. Sfortunatamente, al momento molte persone hanno iniziato a prendere in considerazione schemi di routing personalizzati RESTful quando poi non seguono realmente la definizione.
L'idea è che ci dovrebbe essere un singolo URI che rappresenta ogni risorsa. Le risorse vengono create tramite POST, aggiornate tramite PUT, lette / filtrate tramite GET, ecc. L'incanalamento di tutto tramite GET / POST e / o la creazione di URI per rappresentare azioni su altri URI sono comuni ma non ideali.
Le trasformazioni possono essere gestite usando i tipi MIME:
example.org/post/456+json
Nota: Inoltre, non dimenticare di inviare la risposta con il Content-Type corretto nell'intestazione in modo che il client sappia come gestirlo. In questo caso il Content-Type sarebbe 'application / json'.
L'autenticazione può essere molto semplice se non hai bisogno di un ACL complicato. Basta creare una classe di base Controller in cui le richieste POST / PUT / DELETE richiedono tutte l'autenticazione. Le richieste GET sono generalmente di sola lettura.
Le differenze possono sembrare banali ma immaginare REST come interfaccia di classe. Si prevede che tutto ciò che lo eredita agisca in modo conforme alla definizione dell'interfaccia. Rompere il modello significa rompere il contratto di interfaccia a quel punto l'astrazione perde. Ogni anti-pattern implementato dovrà quindi essere re-implementato su ogni client e l'interfaccia diventerà specifica per l'implementazione.
Optional:
Monitoraggio Analytics:
Il monitoraggio è altrettanto semplice. Imposta un URI per il tracker configurato per accettare le richieste POST. Quando invii la risposta all'utente, invia una seconda risposta all'URI del tracker con le informazioni sull'agente dell'utente nel corpo.
// POST tracking info to this URI with user agent info in the body
example.org/tracking/
Richiedi tracciamento temporale:
Questo dipende davvero. Volete che il tempo dalla richiesta sia ricevuto dal server e una risposta sia inviata? In questo caso, contrassegna semplicemente Date.now () all'inizio del controller, fallo di nuovo dopo che la risposta è stata inviata e confronta i due.