servizi esterni tramite REST

Salve,
Dovrei implementare la possibilit di richiamare dei servizi esterni tramite REST per recuperare alcune informazioni e inserirle ed utilizzare dal mio software. Purtroppo sono molto ignorante in questo settore, quindi vi chiedo dove posso trovare una documentazione per farmi unidea come funziona il tutto. Cosa dovrei chiedere a chi gestisce il sevizio per interfacciarmi con lo stesso e recuperare le informazioni. Qualcuno pu aiutarmi con qualche esempio? Gradirei ricevere pi informazioni possibile partendo dal presupposto che non ho mai utilizzato questa tecnologia, quindi anche una breve sintesi di come funziona
Saluti
Mario Graziani

Mario,
Dipende dal formato dei dati che devi trasmettere / restituire…
Postresti ricevere i dati e/o trasmetterli in uno dei formati HTTP, URI, JSON, e XML
quindi dovresti essere più preciso con la richiesta in modo di poterti aiutare.
Io ad esempio ho implementato una procedura che restituisce i listini prezzi dei produttori di materiale per l’edilizia e di idraulica utilizzato un sito di servizi, la richiesta è http ( occorreva indicare il codice del produttore e il codice dell’articolo ) e restituisce un xml con il prezzo del listino, le descrizioni, le varie unità di misura relative ai vari formati di vendita, il barcode etc.

Quindi prova a descrivere come funziona questo servizio e provo ad aiutarti.

Fino adesso pensavo, perch cosi avevo letto da qualche parte, che i servizi Rest utilizzassero solo HTTP, quindi la prima domanda che devo porre a chi gestisce il servizio quali o quale formato usano per la richieste e le risposte, appena sar informato replicher. grazie
Mario

Mi hanno appena risposto, usano JSON
Mario

Ustia… non ci capisco un cappero di JSON
fatti mandare un esempio che lo vediamo assieme ad Antonio Rinaldi.

Ciao Mario,
i json sono semplici,
il fortnitore del servizio deve fornirti le “Regole” con cui richiede la compilazione del json.
Una volta che conosci le “Regole” della sintassi la compilazione abbastanza semplice.
Xojo mette a disposizione una serie di comandi per i json
ma esistono anche delle funzionalit extra che trovi nei plugin di monkeybread

www.monkeybreadsoftware.de

ti allego un esempio da un mio progetto

{
“jsonrpc”: “2.0”,
“id”: “0”,
“method”: “insert_record”,
“params”: [“08772fdd74ad5410b2e3b5a094dbc627”, “EB_OrdiniClienti”, “00000001”, “00000002”, {
“EB_OrdiniClienti.code_Azienda”: “00000001”,
“EB_OrdiniClienti.code_Tipologia”: “09”,
“EB_OrdiniClienti.code_Valuta”: “EUR”,
“EB_OrdiniClienti.NumeroProgressivo”: “22559”,
“EB_OrdiniClienti.code_Cliente”: “C01054”,
“EB_OrdiniClienti.CodiceCliente”: “C01054”,
“EB_OrdiniClienti.RagioneSociale”: “AAAAAAAAAAAAA”,
“EB_OrdiniClienti.Indirizzo”: “VIA MILANO, 24”,
“EB_OrdiniClienti.Localita”: “PERUGIA”,
“EB_OrdiniClienti.CAP”: “1111111”,
“EB_OrdiniClienti.Provincia”: “PG”,
“EB_OrdiniClienti.PartitaIVA”: “0255665445”,
“EB_OrdiniClienti.code_CondizionePagamento”: “RB60-10”,
“EB_OrdiniClienti.code_CondizioneConsegna”: “02”,
“EB_OrdiniClienti.code_Banca”: “00029”,
“EB_OrdiniClienti.ref_BancaAzienda”: “2”,
“EB_OrdiniClienti.DataOrdine”: “2017-06-23”,
“EB_OrdiniClienti.code_CausaleMagazzino”: “SCCL”,
“EB_OrdiniClienti.code_TitDepUscita”: “0101”,
“EB_OrdiniClienti.val_Stato”: “1”,
“EB_OrdiniClienti.ref_TipologiaDF”: “11”,
“EB_OrdiniClienti.NumPreventivo”: “3483”,
“EB_OrdiniClienti.Note”: “”,
“EB_OrdiniClienti.TotaleImponibile”: “”,
“EB_OrdiniClienti.val_Sospeso”: “0”,
@rows”: [{
“EB_RigheOrdiniClienti.code_Articolo”: “G 783/SC”,
“EB_RigheOrdiniClienti.NumeroRiga”: “1”,
“EB_RigheOrdiniClienti.DescArticolo”: “SCATOLA GUARNIZIONE BIANCA - ML.200”,
“EB_RigheOrdiniClienti.code_RigheUnitaMisura”: “PZ”,
“EB_RigheOrdiniClienti.ValoreUnitario”: “51.300000”,
“EB_RigheOrdiniClienti.Sconto”: “20”,
“EB_RigheOrdiniClienti.ValoreUnitarioNetto”: “41.040000”,
“EB_RigheOrdiniClienti.Quantita”: “1”,
“EB_RigheOrdiniClienti.QtaEvasa”: “0”,
“EB_RigheOrdiniClienti.PrezzoAcquisto”: “23.600000”,
“EB_RigheOrdiniClienti.PrezzoVendita”: “51.300000”,
“EB_RigheOrdiniClienti.ref_AliquotaIVA”: “15”,
“EB_RigheOrdiniClienti.ref_SottRicavo”: “537”
}, {
“EB_RigheOrdiniClienti.code_Articolo”: “G 933E/SC”,
“EB_RigheOrdiniClienti.NumeroRiga”: “2”,
“EB_RigheOrdiniClienti.DescArticolo”: “SCATOLA GUARNIZIONE BIANCA - ML.300”,
“EB_RigheOrdiniClienti.code_RigheUnitaMisura”: “PZ”,
“EB_RigheOrdiniClienti.ValoreUnitario”: “92.610000”,
“EB_RigheOrdiniClienti.Sconto”: “20”,
“EB_RigheOrdiniClienti.ValoreUnitarioNetto”: “74.088000”,
“EB_RigheOrdiniClienti.Quantita”: “1”,
“EB_RigheOrdiniClienti.QtaEvasa”: “0”,
“EB_RigheOrdiniClienti.PrezzoAcquisto”: “42.600000”,
“EB_RigheOrdiniClienti.PrezzoVendita”: “92.610000”,
“EB_RigheOrdiniClienti.ref_AliquotaIVA”: “15”,
“EB_RigheOrdiniClienti.ref_SottRicavo”: “537”
}, {
“EB_RigheOrdiniClienti.code_Articolo”: “G 1493 R/SC”,
“EB_RigheOrdiniClienti.NumeroRiga”: “3”,
“EB_RigheOrdiniClienti.DescArticolo”: “SCATOLA GUARNIZIONE COESTRUSA BIANCA BATT=10,5 SP=8,3 INC=4x8 - ML. 300”,
“EB_RigheOrdiniClienti.code_RigheUnitaMisura”: “PZ”,
“EB_RigheOrdiniClienti.ValoreUnitario”: “204”,
“EB_RigheOrdiniClienti.Sconto”: “20”,
“EB_RigheOrdiniClienti.ValoreUnitarioNetto”: “163.200000”,
“EB_RigheOrdiniClienti.Quantita”: “1”,
“EB_RigheOrdiniClienti.QtaEvasa”: “0”,
“EB_RigheOrdiniClienti.PrezzoAcquisto”: “111.600000”,
“EB_RigheOrdiniClienti.PrezzoVendita”: “204”,
“EB_RigheOrdiniClienti.ref_AliquotaIVA”: “15”,
“EB_RigheOrdiniClienti.ref_SottRicavo”: “537”
}]
}]
}

buon lavoro
Enzo

Ciao Mario, JSON uno standard con una logica simile all’XML; si tratta di una lunga stringa di testo nella quale una sintassi basata su tag di apertura e chiusura consente la rappresentazione di dati strutturati (tipo un db) in una “stringona” facilmente trasmettibile.

Questo un estratto di codice preso da mie soluzione che chiamano un motore webservice fatto sempre da me con Xojo ed utilizzato sia per far parlare Xojo con Xojo che mobile con Xojo.

[code]
dim request as new JSONItem
request.Value(“MethodType”) = “GetPage”
request.Value(“MethodName”) = “GetDocDownload”

dim methodContent as New JSONItem
methodContent.Value(“User”) = “admin”
methodContent.Value(“Password”) = “verySecret”
methodContent.Value(“DocId”) = 123
methodContent.Value(“DocRev”) = 2
request.Value(“methodContent”) = methodContent

dim response as String
dim r as string
r = ConvertEncoding(ReplaceAll(request.ToString,"%","%25").ToText, Encodings.UTF8)
dim s as new HTTPSocket
s.SetRequestContent(r, “application/json; charset=utf-8”)
response = s.Post(webServicesIntranetURL, webServicesRequestTimeoutSeconds)
response = DefineEncoding(result, Encodings.UTF8)[/code]

Le prime 9 righe (fino a request.Value(“methodContent”) = methodContent) compongono il JSON da inviare come chiamata, che avr questo contenuto:

{
	"MethodType": "GetPage",
	"MethodName": "GetDocDownload",
	"MethodContent": {
		"User": "admin",
		"Password": "verySecret",
		"DocId": "123",
		"DocRev": "2"
	}
}

Quindi nella root del JSON di chiamata ci sono 3 nodi, ovvero MethodType, MethodName e MethodContent. I primi 2 contengono direttamente un valore, mentre il terzo un nodo con vari “figli”, dove ognuno dei quali ha il proprio valore.

Dalla riga da “dim response as String” in poi trovi il codice in cui il JSON di richiesta viene inviato all’indirizzo contenuto nella variabile “webServicesIntranetURL” restando in attesa per un massimo di numero di secondi specificato con la variabile “webServicesRequestTimeoutSeconds”.

A risposta ottenuta, nella variabile “response” trovi il JSON restituito dal web service.

Per quanto riguarda la costruzione dell’oggetto JSON, Xojo ha la classe JSONItem con cui fare il parse/creazione di JSON (per la chiamata) e l’estrazione di informazioni da un oggetto JSON (per interpretare la risposta).

Per testare chiamata e risposta al servizio, senza scrivere codice in Xojo io uso un comodo componente aggiuntivo di firefox che si chiama “HttpRequester”. Ti consente di parlare direttamente con il webservice, senza “strati” intermedi.

Grazie ragazzi, dopo la risposta di Massimiliano ero entrato in panico, dopo le vostre risposte ed esempi, formidabili le minuziose spiegazioni di Pietro, di mi sono ripreso. Ora studier i vostri esempi, chieder le informazioni per le Regole al fornitore di servizio, eventuali password e quant’altro e poi mi cimenter a fare qualche prova, sicuramente avr ancor bisogno dei vostro preziosi consigli
Mario

Con il nuovo framework leggere e scrivere un JSON abbastanza semplice.
Le accortezze in ogni caso:
Per i dati che invii devi sapere indirizzo e struttura del JSON da inviare (non sempre da inviare, e e ben fatto dovrebbe rispondere con un messaggio di errore per la struttura non conforme)

Per i dati che ricevi: definisci l’encoding alla risposta (il contenuto del messaggio ricevuto non ha encoding), normalmente, oramai, devi definirlo come UTF-8; Naviga con accortezza nel JSON ottenuto: con il nuovo framework puoi trasformarlo in un dictionary, ma solo con la documentazione (se esiste) o per analisi e gestione errori puoi navigare correttamente nei dati.

Ostregheta, non volevo spaventarti… ti avevo solo scritto che non lo avevo mai fatto…

Grazie Antonio, come al solito sempre pronto a dare una mano, seguir i tuoi preziosi consigli.

Massimiliano, mi ero spaventato perch fino a quel momento mi avevi risposto solo tu, comunque un bel ringraziamento per l’interessamento non te lo toglie nessuno

Ci avrei comunque speso del tempo, ad esempio provando a costruire una classe. ma senza specifiche … la vedevo dura… .

Grazie ai vostri consigli ed esempi, forse, e dico forse sono riuscito a capire qualcosa sui Json;
ho creato questa stringa, dovrebbe essere Json almeno spero, che contiene i dati di due persone

Dim anagrafica As String = “{”“Nome”":"“Mario rossi”","“Via”":"“Pellico 15"”, ““Citt””:"“Roma”","“Tel”":"“06 123456789"”},{"“Nome”":"“Paolo Verdi”","“Via”":"“Pasteur 45"”, ““Citt””:"“Milano”","“Tel”":"“02 123456789"”}"

con quest’altro codice ho creato la stessa stringa ma con solo il primo nome
Dim datipers As New JSONItem
datipers.Value(“Nome”) = “Mario Rossi”
datipers.Value(“Via”) = “Pellico 15”
datipers.Value(“Citt”) = “Roma”
datipers.Value(“Tel”) = “06 123456789”
datipers.Compact = True
Dim s As String
s = ConvertEncoding(ReplaceAll(datipers.ToString,"%","%25").ToText, Encodings.UTF8)

In questo modo, molto pi semplice, i dati potrebbero essere inseriti da codice prelevandoli da un database o quant’altro
1 domanda: come fare per inserire un secondo o anche pi nominativi con questo codice?
2 domanda, quella che mi interessa particolarmente; Ricevuta una stringa del genere come posso recuperare i dati automaticamente? se ho capito bene Pietro dice che con la classe JSONItem possibile fare un parse per l’estrazione dei dati, Rinaldi dice di trasformarlo in un dicionary, ma non so cosa sia e come leggerlo da codice. Purtroppo non sono riuscito a trovare come effettuare il Parse e neanche come tramutarlo in un dicionary

ok niente paura, ho fatto una prova, non pensavo fosse una cosa cos semplice, non avevo mai usato JSON prima.

prima ti crei un oggetto jsonitem
poi ci appendi tutti gli oggetti jsonitem che vuoi …

quindi :

Dim elenco as new JSONItem
Dim datipers As New JSONItem
datipers.Value("Nome") = "Mario Rossi"
datipers.Value("Via") = "Pellico 15"
datipers.Value("Citt") = "Roma"
datipers.Value("Tel") = "06 123456789"
datipers.Compact = True

elenco.append datipers
datipers.Value("Nome") = "Pallino Pinco"
datipers.Value("Via") = "Le dita dal naso, 12"
datipers.Value("Citt") = "Milano"
datipers.Value("Tel") = "02 987654321"
datipers.Compact = True

elenco.append datipers
Dim s As String
s = ConvertEncoding(ReplaceAll(elenco.ToString,"%","%25").ToText, Encodings.UTF8)

per la lettura ci picchio la testolina ancora qualche minuto.

Ho provato il tuo codice, ma alla fine mi ritrovo replicato due volte il secondo append, per spiegarmi meglio, due volte Pinco Pallino. ho creato un terzo oggetto JSONItem datipers2 a cui ho inserito i dati di di pinco pallino, in questo modo mi ritrovo tutti i dati. Ho notato che all’inizio ed alla fine della stringa mi ritrovo due parentisi quadre, che se non erro indicano un array, certo questo potrebbe essere anche un array ma manca il nome dell’array stesso

Ciao Mario,
credo che a Massimiliano sia sfuggita una cosa per questo non ti funziona.

prova cos

Dim elenco as new JSONItem
Dim datipers As JSONItem

datipers = New JSONItem
datipers.Value(“Nome”) = “Mario Rossi”
datipers.Value(“Via”) = “Pellico 15”
datipers.Value(“Citt”) = “Roma”
datipers.Value(“Tel”) = “06 123456789”
datipers.Compact = True

elenco.append datipers

datipers = New JSONItem
datipers.Value(“Nome”) = “Pallino Pinco”
datipers.Value(“Via”) = “Le dita dal naso, 12”
datipers.Value(“Citt”) = “Milano”
datipers.Value(“Tel”) = “02 987654321”
datipers.Compact = True

elenco.append datipers

Dim s As String
s = ConvertEncoding(ReplaceAll(elenco.ToString,"%","%25").ToText, Encodings.UTF8)

ops… dimenticavo

per leggere i contenuti prova questo semplice codice

if elenco.Count >0 then
for i as integer = 0 to elenco.Count-1
MsgBox elenco.Child(i).ToString
next
end if

Ciao

Grazie Enzo,
ho provato e funziona tutto, l’ultimo codice visualizza i dati completi per ogni singola persona, ed gi un passo avanti per me, ma non basta. La stringa JSON che ricever dal servizio esterno sicuramente sar simile a questa, chiaramente con molti dati in pi, proprio oggi mi hanno consigliato di crearmi la stringa completa per i dati che servono al mio software e di darla al loro per utilizzarla. Ora il problema principale per me come estrapolare i dati ed inserirli automaticamente nel database del software. Conoscendo bene, come sar, la stringa dovrei crearmi un algoritmo per estrapolare i dati, ma penso che esista un modo pi facile per farlo, sembrerebbe il parse, ma no trovo come farlo
Mario

hai provato il ciclo for che ti ho suggerito?

quello la base da cui puoi leggere tutti i dati…
ad ogni MsgBox corrisponde un novo record
puoi ulteriormente implementarlo con la lettura di ogni singolo campo
cos da poter creare i record…

prova ad aggiungere questo codice
sostituisci::
“tuo_db” con il nome del tuo database
“tua_tabella” con il nome della tua tabella

dovresti riuscire a creare i record…

dim stringa, nome_campo, valore_campo as String

dim r as DatabaseRecord

if elenco.Count >0 then
for i as integer = 0 to elenco.Count-1

MsgBox elenco.Child(i).ToString

r = new DatabaseRecord

datipers = elenco.Child(i)
if datipers.Count > 0 then
  for x as integer = 0 to datipers.Count-1
    stringa = datipers.Name(x)+" - "+datipers.Value(datipers.Name(x))
    
    
    nome_campo = datipers.Name(x)
    valore_campo = datipers.Value(stringa_campo)
    
    r.Column(nome_campo) = valore_campo
    
    MsgBox stringa
    
  next
  
  tuo_db.InsertRecord("tua_tabella", r)
  
end if

next
end if

Grazie Enzo, mi hai facilitato il compito per l’algoritmo che volevo fare, in modo strepitoso oserei dire, praticamente lo hai fatto, finito e funzionante. L’ho appena modificato per adattarlo al software. Normalmente il software permette l’inserimento dei record manualmente, tramite un pulsante chiamato nuovo, il quale abilita le caselle di testo svuotandole da eventuali dati ed abilita il pulsante di registrazione che sar utilizzato dopo l’inserimento dei dati, le caselle sono all’incirca 10, anagrafica completa pi altri dati. In questo modo sfrutto tutti i controlli previsti dal software prima di salvare il record

if elenco.Count >0 then
for i as integer = 0 to elenco.Count-1
datipers = elenco.Child(i)
if datipers.Count > 0 then
nuovo.push (nuovo record)
txtnome.text = datipers.Value(datipers.Name(0))
txtvia.text = datipers.Value(datipers.Name(1))
txtcitta.text = datipers.Value(datipers.Name(2))
txttel.text = datipers.Value(datipers.Name(3))
registra.push (registra il nuovo record)
end if
next
end if