Archivi categoria: Senza categoria

TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP

L’articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama “net/http”. Vediamo subito come gestire i principali casi d’uso.

Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e un oggetto Error.

Nell’esempio sto invocando la homepage di google, e verifico la presenza di errore e il codice restituito dalla risposta. Successivamente tramite il package ioutil recupero il body della response e lo stampo a video.

Se invece volessi inviare una post Golang mette a disposizione 2 funzioni: post e postForm.

La funzione post riceve in ingresso l’url cui inviare la post, il content type del dato che sto inviando e un reader del package io

La funzione postForm invece riceve in ingresso l’url cui inviare la post e il form dei dati chiave, valore

Le 3 funzioni consentono di inviare get e post, ma qualora volessi usare altri metodi come la put o la delete occorre usare il metodo addNewRequest per creare una request e usare il client http per inviare la richiesta.

Per gestire le caratteristiche avanzate delle connessioni Go mette a disposizione l’oggetto Transport che opportunamente configurato consente di definire un proxy per l’invocazione del servizio. Questo caso si presenta quando il nostro client è presente all’interno di una rete il cui accesso ad internet è veicolato dalla presenza di un proxy.

Qualora invece il nostro server voglia un certificato occorre caricare il certificato e configurato sempre nel transport affinchè venga usato in trasmissione

Nell’esempio sto leggendo il certificato e lo sto configurando all’interno del transport per poi fornirlo al client.

Abbiamo quindi visto come invocare i vari metodi e come gestire una rete con proxy e una connessione crittografata con invio del certificato.

Alla prossima

TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP

Nell’articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package “net/http” e “encoding/json”, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e decoding di oggetti json.

Incominciamo instanziando il server e implementando un servizio di keepalive che serve a stabilire se il server è attivo regolarmente.

La funzione HandleFunc definisce il path e il relativo handler. Per handler si intende la funzione che verrà eseguita dal server in corrispondenza della richiesta riceveuta.

Se abbiamo fatto tutto bene invocando il servizio http://localhost:10000/isAlive riceveremo un 200 ok con testo alive.

A questo punto supponiamo di voler gestire una rubrica dei contatti e pertanto definiamo prima di tutto la nostra struct Contatto

La struct presenta 2 parametri Nome e Cognome e relative regole di trascodifica in json. Definiamo l’elenco dei contatti e lo inizializziamo con dei dati di prova, simulando la presenza di un database

Infine definiamo l’handler relativo

In tal modo invocando l’url http://localhost:10000/contatti otterremo il seguente json [{“Nome”:”nome 1″,”Cognome”:”Cognome 1″},{“Nome”:”nome 2″,”Cognome”:”Cognome 2″}]

Di seguito il codice completo

Il package http ci ha consentito di tirare su il server e configurare delle risposte su dei path statici. Il package ha dei limiti, non ci permette di configurare degli endpoint variabili ed esplicitare il metodo http supportato. Per superare questo limite ci viene in soccorso un nuovo package “github.com/gorilla/mux”. Il package va installato con il comando

A questo per tirare su il server e configurare opportunamente gli endpoint possiamo scrivere

Il packge ci mette a disposizione l’oggetto router che consente per ogni handler di definire maggiori proprietà per meglio mappare il comportamento

Il package ci consente agevolmente di leggere le path variable e superare i limiti del package net/http.

Di seguito il codice completo per l’analisi dei metodi restanti

Alla prossima

TUTORIAL GO – GESTIONE DEL DATABASE

Nell’articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura.

Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L’elenco dei driver disponibili e le relative basi di dati supportati sono disponibili al link https://github.com/golang/go/wiki/SQLDrivers. Per lavoro uso Oracle, pertanto nell’esempio integro il driver godror. Per poter usare questo driver occorre installarlo e configurarlo nell’ambiente go tramite la direttiva:

Il driver è realizzato in cgo pertanto è richiesta la presenza di un gcc compiler, nel mio caso ho utilizzato quello disponibile all’indirizzo https://jmeubank.github.io/tdm-gcc/. Maggiori informazioni su godror sono disponibili al l’url https://github.com/godror/godror

Dopo aver installato gcc e godror possiamo finalmente definire l’import

Per la connessione al db il comando da usare è Open del package db

Il primo parametro della Open è il nome del driver e a seguire la stringa di connessione verso il db nel formato username@password@ip:port:sid

La funzione restituisce una istanza db e come secondo parametro un oggetto error che potrà essere gestito tramite la funzione panic.

Vediamo subito come effettuare una operazione di scrittura tramite la funzione Exec

Nell’esempio tramite la funzione Begin ho avviato una transazione con commit previsto a fine operazioni di scrittura. Nel caso specifico sto facendo la cancellazione di un record dalla tabella di audit e successivo inserimento La funzione Exec ritorna un oggetto Result che rappresenta l’esito di una qualsiasi chiamata al db mostrando quante righe sono state coinvolte e l’id dell’ultimo inserimento.

Se volessi leggere i dati mi viene in aiuto la funzione Query che restituisce un cursore che scorre sulle righe selezionate

Nell’esempio sto leggenda dalla tabella audit tutti i record e tramite la funzione Scan dell’oggetto Rows la assegna a delle variabili per stamparne successivamente il valore. Con il comando defer chiudo il cursore alla fine di tutte le operazioni.

Per semplificare il lavoro con il db ci vengono in soccorso altri package che consentono di velocizzare il lavoro. Oggi introduco il package sqlx disponibile all’url https://jmoiron.github.io/sqlx/

Per installarlo il comando è

ad installazione effettuata può essere importato con la direttiva github.com/jmoiron/sqlx”. Questo package consente di mappare le query direttamente su struct senza dover ricorrere al comando Scan.

Ho definito una struct Audit che presenta i parametri ID e dataora, ne ho definito il tipo e tramite il thick ho definito il mapping, tramite la regola del contesto:nomecolonna.

A questo punto ottengo il gioco è fatto

Con la Open ottengo un riferimento al db che mi espone le funzioni Get per il recupero del singolo oggetto e Select per il recupero di un set di righe,

Alla prossima

ps. per i pigri a seguire l’intero codice

TUTORIAL GO – FUNCTIONS

Per definire una funzione Go mette a disposizione la parola chiave func seguita dal nome della funzione, l’elenco dei tipi attesi e l’elenco dei tipi restituiti, questo perchè in Go le funzioni possono restituire più valori in modo sequenziale,

Nel caso sopra ho definito la funzione duplica che riceve in ingresso una stringa e restituisce la string concatenata con se stessa

E’ possibile definire più parametri in ingresso e se i parametri sono dello stesso tipo Go permette di dichiarare il tipo una volta sola

In questo caso la funzione concatena riceve 2 stringhe in ingresso e le concatena dando il valore in uscita. Essendo parametri dello stesso tipo è possibile dichiarare il tipo una volta sola.

Anche in uscita è possibile definire più parametri

In questo la funzione restituisce la lunghezza delle 2 stringhe ricevute in ingresso. E’ possibile anche ignorare una delle 2 variabili tramite la parola chiave _.

Go mette anche a disposizione un meccanismo per definire un numero infinito di parametri in ingresso tramite la parola chiave …

In questo caso ho definito una lista di valori in ingresso e per ognuno di essi restituisco la lunghezza della parola

Go permette di ritornare la funzione come tipo di ritorno di una funzione e di assegnarla ad una funzione e di poterlo assegnare ad una variabile

Nell’esempio ho definito una funzione conta3 che riceve una lista di valori variabili in ingresso e che per ognuno di essi elabora la lunghezza e la stampa. Successivamente assegno la funzione ad una variabile e la eseguo invocando la variabile stessa con i parametri in ingresso. Posso ottenere un comportamento analogo definendo la function direttamente dopo il nome della variabile ma in questo caso perdo la gestione della variabile di stato counter.

Infine Go supporta la ricorsione ovvero una funzione che elabora il risultato richiamando se stesso e basando il tutto su una condizione di uscita. Classico esempio è la funzione fattoriale

SWAGGER: Generare FILE JSON

Swagger è un prodotto che ti consente di documentare i rest service che hai implementato tramite delle comode annotation. Puoi quindi descrivere i campi accettati, le regole di validazione applicati e tutto quanto concorra ad una definizione efficiente delle specifiche.

Una volta che hai completato le tue specifiche ti consente di generare agevolamente il file json delle specifiche tramite il quale poter generare il client per invocare i tuoi servizi.

Per generare il file è sufficiente invocare l’url

http://<hostname>:<port>/v2/api-docs?format=openapi

La risposta sarà il file json da cui poter generare agevolmente il client.

JAVA – CONFIGURARE I MESSAGGI DI JAVAX.VALIDATATION

Usare JAVAX.VALIDATION ha i suoi vantaggi, tramite delle comode annotation demandiamo al nostro sistema la funziona di validazione per le casistiche più comuni

che coprono la stragrande maggioranza dei casi.

Quando il sistema riscontra l’errore restituisce il messaggio associato, es. not be not null

Qualora volessimo agevolmente localizzare il messaggio è sufficiente creare un file ValidationMessages_it_IT.properties sotto la directory resources del nostro progetto maven e il gioco è fatto

Es. del file

javax.validation.constraints.NotNull.message=Obbligatorio
javax.validation.constraints.NotEmpty.message=Obbligatorio