2010-07-05 13 views
41

Sto cercando di qualcosa di leggero, che, come minimo dovrebbe sostenere le seguenti caratteristiche:Qual è il buon punto di partenza per lo sviluppo di un servizio web RESTful in Clojure?

  • supporto per una facile definizione delle azioni attraverso metadati
  • Wrapper che estrae i parametri di richiesta in carta clojure, o come la funzione parametri
  • Supporto di più forme di autenticazione (di base, la forma, biscotto)
  • autorizzazione di base sulla base del metodo API metadati
  • sessione oggetto avvolto in clojure mappa
  • codifica diretta dal REPL (non è necessario riavviare il server)
  • serializzazione automatica del valore di ritorno a JSON e XML
  • hanno la manipolazione (ad esempio/azione/par1/par2 invece di/azione parametro bello (pluggable) url? par1 = val1 & par2 = val2)

so che è relativamente facile da rotolare il mio micro-quadro per ognuna di queste opzioni, ma perché reinventare la ruota, se una cosa del genere già esiste? Soprattutto se si tratta di:

  • progetto attivo con crescente numero di contribuenti/utenti
  • hanno almeno documentazione di base e tutorial on-line.
+0

Potrebbe anche essere utile guardare questo progetto, è un webshop sperimentale ben documentato REST api. Ha alcune delle caratteristiche che elencherai. https://github.com/i-schuetz/clojushop – Ixx

risposta

52

Prima di tutto, penso che e 'difficile trovare una singola soluzione shrinkwrapped a fare tutto questo in Clojure (se non nella forma di una libreria Java per essere utilizzato attraverso interoperabilità). Quello che sta diventando lo stack Web standard di Clojure comprende un numero di librerie che le persone mescolano e abbinano in tutti i modi (dal momento che sono fortunatamente tendenzialmente perfettamente compatibili).

Ecco un elenco di alcuni blocchi di costruzione che potreste trovare utili:

  1. Ring - dati di base biblioteca richiesta HTTP la manipolazione del Clojure; tutte le altre librerie webby (per scrivere i percorsi & c.) che io sappia sono compatibili con Ring. Ring è attivamente sviluppato, ha una solida community, è molto ben scritto e ha un documento SPEC dettagliato che ne illustra la filosofia di design. This blog post fornisce un bell'esempio di come potrebbe essere utilizzato (reagendo a commit GitHub).

  2. Sandbar - attualmente una libreria di autenticazione, più tipi di funzionalità programmati; in fase di sviluppo.

  3. Compojure - una libreria matura e robusta che fornisce un bel DSL per scrivere percorsi da utilizzare sopra Ring. Questo ti darà la bella gestione dei parametri URL.

  4. Compojure-rest - "una libreria per la creazione di applicazioni RESTful su Compojure". Compojure-riposo è, per quanto posso dire, nelle sue prime fasi di sviluppo; forse potresti vederlo come un'opportunità per influenzare il suo design.:-)

  5. Per trattare con XML, c'è clojure.contrib.lazy-xml (e l'aiutante libreria clojure.contrib.zip-filter.xml) e Enlive (il built-in clojure.xml spazio dei nomi non è attualmente molto usabile); questi sarebbero usati in tandem (anche se per i tuoi scopi il primo potrebbe bastare).

  6. Per JSON, c'è una biblioteca in contrib e clojure-json (ed io penso c'era almeno un altro lib mi sembra di essere dimenticare ora ...); scegli quello che ti piace di più.

Tutto sarà perfettamente felice con uno stile di sviluppo REPL-driven (vedere la risposta accettato di this SO question per un trucco anello che è molto molto per lo scopo qui). Suppongo che la raccolta di collegamenti sopra riportata lasci alcuni punti ciechi (in particolare, la storia dell'autenticazione è ancora in via di estinzione, per quanto posso dire), ma si spera che sia un buon inizio.


L'unica soluzione single-pacchetto per la costruzione di webapps in Clojure, che io sappia è Conjure, ispirato da Rails; sfortunatamente devo ammettere che non ne so molto, quindi se ti senti interessato, segui il link e guarda le fonti, wiki & c.

+0

Grazie per la risposta. È esattamente quello che stavo cercando – Marko

+0

Dichiaro questa risposta: fantastico. Grazie! – jdl

7

Durante la creazione del mio primo servizio di riposo Clojure mi sono ritrovato a fare spesso la stessa domanda. Il Clojure Toolbox mi ha aiutato molto: http://www.clojure-toolbox.com/

+0

collegamento impressionante. grazie mille – sova

1

Se siete alla ricerca di un po 'del campione, nel mondo reale, il codice illustrativo per iniziare, allora si potrebbe studiare questo progetto clojure-news-feed on github che dimostra come implementare un non banale RESTful web servizio con compojure/ring che include sia SQL (postgresql o mysql) che NoSQL (cassandra), ricerca (solr), caching (redis), logging degli eventi (kafka), connection pooling (c3po) e metriche in tempo reale via JMX.

Questo blog su Building a Scalable News Feed Web Service in Clojure fornisce una buona introduzione. Ho eseguito alcuni test di carico su questo servizio su un'umile distribuzione AWS e ho ottenuto circa ottanta transazioni al secondo con meno di mezzo secondo di latenza media per transazione.

Problemi correlati