Blog

Gestire il dialogo frontend-backend con le API REST di Genropy: il caso Genromed

Gestire il dialogo frontend-backend con le API REST di Genropy: il caso Genromed

Molte volte ci troviamo di fronte alla necessità di far dialogare un frontend (un sito HTML, o WordPress) e un backend in Genropy, sia questa una scelta specifica, finalizzata a gestire la parte frontend in modo indipendente, sia perché obbligati da ragioni storiche (sito già presente) o da scelte meramente di carattere estetico (più libertà nella gestione della grafica del sito).

Un caso simile lo avevamo trattato in un precedente tutorial, “Come integrare un modulo di contatto WordPress CF7 in Genropy con le API REST”, ma desideriamo in questo caso condividere un caso pratico per vedere insieme cosa si può ottenere in termini grafici e pratici da una configurazione di questo tipo.

Le alternative a disposizione di uno sviluppatore Genropy che deve realizzare sul sito frontend una qualche forma di integrazione con il backend sono essenzialmente due:

  • inglobare una webpage realizzata in Genropy con un iframe sul sito
  • dialogare con Genropy attraverso le API REST

Nonostante il primo scenario sia sicuramente il più semplice, ed assolutamente percorribile, in molti casi potrebbe essere preferibile la seconda strada, quella dell’integrazione esterna, sulla quale ci concentreremo in questo articolo.

Il caso reale che raccontiamo è quello di Genromed, software gestionale per i centri medici (appuntamenti, prestazioni, fatturazione), che dialoga con un sito web attraverso il quale i pazienti possono prenotare le visite mediche, specificando data e orario tra quelli disponibili.

Il modulo prenotazione del sito effettua diverse chiamate in cascata a Genromed, la prima per individuare le specialità, la seconda i tipi prestazione per quella specialità, la terza i medici per tipo di prestazione, infine gli slot liberi per quel medico. Ogni chiamata viene effettuata nella forma seguente:

class GnrCustomWebPage(object):
    py_requires='gnrcomponents/externalcall:BaseRpc'

    @public_method
    def getSpecializzazioni(self, **kwargs):
        "Restituisce le specialità disponibili per la prenotazione"
        self.checkAuth()
        specializzazioni = self.db.table('gm_base.specialita').query(
                                where='$prenotazione_web IS TRUE AND $disponibile_web IS TRUE', 
                                columns='$descrizione', 
                                order_by='$descrizione').fetch()
        result = defaultdict(list)
        for s in specializzazioni:
            result['specializzazioni'].append(dict(s))
        return toJson(result)

ovvero, ogni chiamata è definita in un metodo, il quale effettua una query e restituisce il risultato in formato json, visualizzato ovviamente nella tendina sul sito per la selezione.

La chiamata viene effettuata all’url:

https://healthcare.erpy.org/care/prenota/getSpecializzazioni?param1=param1&param2=param2...

Dove l’ultima parte dell’url è il nome del metodo, seguito dagli eventuali parametri (in questo caso nessuno).

Con la medesima logica vengono effettuate tutte le altre chiamate, non solo in lettura, ma anche in scrittura, come per esempio nel caso dell’aggiunta o eliminazione di una prenotazione, che ha un effetto in termini di occupazione dello slot per il medico in questione.


Come si può notare, l’integrazione è estremamente semplice ma efficace. Hai domande/curiosità in merito alle API REST di Genropy? Scrivici su AskGenropy!