2012-09-25 19 views
5

Abbiamo un'app Web Java con un backend di ibernazione che fornisce risorse REST. Ora siamo di fronte il compito di implementare una ricerca generica che è controllato dai parametri di query nella nostra richiesta GET:Genera ricerca SQL da HTTP Parametri richiesta GET

some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something 

o simili.

  • Non vogliamo predefinire tutti i parametri possibili (nome, created_on, qualcosa)
  • non vogliamo avere per analizzare la stringa di richiesta di far salire i caratteri di controllo (come> =)
  • né ci non vogliamo implementare la nostra propria grammatica in modo da riflettere le cose come _eq _like _goe e così via (in alternativa o in aggiunta a controllare caratteri)

c'è una sorta di quadro che fornisce aiutare con questo mapping dai parametri di richiesta GET alla query di database?

Poiché sappiamo quale risorsa REST stiamo ottenendo abbiamo l'entità/tabella (selezionare). Probabilmente sarà anche necessario predefinire i JOIN che verranno eseguiti al fine di limitare le profondità di una ricerca.

Ma a parte questo, vogliamo che il client REST che consuma sia in grado di eseguire qualsiasi ricerca senza che noi dobbiamo predefinire come un determinato parametro e una determinata sequenza di controllo verranno tradotti in una ricerca.


In questo momento sto cercando qualche edificio semi automatica soluzione sul Mysemas QueryDSL. Mi permette di predefinire le colonne dove e ordinare le colonne e sto lavorando a un semplice confronto tra stringhe per rilevare elementi come "_like", "_loe", ... in un parametro e quindi attivare la parte predefinita corrispondente della ricerca. Non molto diverso da una stringa SQL tranne che è a prova di iniezione SQL un tipo di salvataggio.

Tuttavia devo ancora dire al mio oggetto di ricerca che dovrebbe essere in grado di gestire potenzialmente una query "cercare una persona con nome come" ??? "". In questo momento va bene così come consumiamo internamente la risorsa REST e isoliamo abbastanza bene la vera ricerca. Se abbiamo bisogno di fare una ricerca, possiamo aggiungere altre predefinizioni per ora. Ma dovremmo rendere pubbliche le nostre risorse REST in futuro, in futuro, che non saranno così grandi.


Quindi ci stiamo chiedendo, ci deve essere qualche framework o best practice o soluzione consigliata per avvicinarsi a questo. Non siamo i primi a volerlo. Redmine ad esempio offre tutte le sue risorse tramite un'interfaccia REST e posso interrogare a piacimento. O Facebook con la sua Graph API. Sono sicuro che quei ragazzi non solo hanno preassegnato tutte le possibilità, ma piuttosto hanno creato una grammatica generica. Vorremmo risparmiare il più possibile su questo sforzo e utilizzare invece le soluzioni disponibili.

Come ho detto, stiamo usando Hibernate in modo che una soluzione SQL o HQL possa andare bene o qualsiasi cosa si sviluppi su entità come QueryDsl. (C'è anche il problema di sicurezza relativo all'iniezione SQL)

Qualche suggerimento? Idee? Dovremo fare tutto da soli?

risposta

1

Da una prospettiva .NET, la cosa più vicina che posso pensare sarebbe un servizio dati WCF.

Dai uno sguardo allo the uri-conventions specificato sul sito Web di OData. Ci sono alcune buone informazioni sulla sezione 4.5 Filter System Query Option. Noterai che molti esempi su questo sito sono correlati a .NET, ma ci sono othersuggestions per far funzionare tutto questo con Java.

+0

Grazie! Sembra promettente. Analizzeremo questo aspetto e vediamo se possiamo utilizzare parti di esso per adattarci alla nostra struttura, dal momento che vogliamo gestire le risorse REST di noi stessi e solo la funzionalità di query. Ma se è possibile tutto ciò di cui avremmo allora bisogno è una mappatura intelligente dal lato del consumatore dal modulo di ricerca alla struttura di queste query. – Pete

+0

Nessun problema. È passato molto tempo da quando ho usato Java e/o Hibernate e non sono sicuro di come tutto ciò si integrerebbe con l'ibernazione. Stranamente però ho solo [questo post] (http://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search) sul blog di Matt Raible su alcune modifiche a [AppFuse] (http://appfuse.org/). Nel post menziona [Hibernate Search] (http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/), e questo mi ha fatto pensare alla tua domanda. Forse potresti vedere se potrebbe essere utile anche nella tua situazione. –

Problemi correlati