Guida ai servizi di interoperabilità

Questo documento ha l’obbiettivo di fornire le informazioni necessarie per effettuare richieste utilizzando i servizi di interoperabilità forniti da Geoweb.

Da notare che ogni esempio fornito in questo documento è relativo ad uno specifico software chiamato “Postman”,
tramite il quale sono stati eseguiti i test qui mostrati.

Tabella esempio: test_class

id_resourcecod_resourcefax
12345001aaa
54321002 bbb
13245003 ccc

Servizi di interoperabilità disponibili:

READ

  • detailEntity: informazioni di un singolo record di un classe
  • listEntity: informazioni dei record di una classe (paginazione e ordinamento)
  • listEntity: informazioni dei record di una classe (paginazione e ordinamento e filtri)

INSERT

  • 1.1) insertGwRecord (multipart/form-data): richiede che i dati in ingresso siano di tipo “multipart/form-data”, ma permette che siano forniti sia in formato “testo” che in formato “file”.
  • 1.2) insertGwRecord (json): richiede che i dati in ingresso siano di tipo “mappa chiave/valore”, fornita tramite un oggetto JSON.
  • 1.3) insertGwRecord (modelAttribute): richiede che i dati in ingresso siano inseriti in un oggetto “FormData”, specificamente costruito nel corpo della richiesta seguendo la struttura di un oggetto ‘FormData’ di Geoweb (più avanti una spiegazione approfondita).

UPDATE

  • 2.1) updateGwRecord (multipart/form-data): richiede che i dati in ingresso siano di tipo “multipart/form-data”, ma permette che siano forniti sia in formato “testo” che in formato “file”.
  • 2.2) updateGwRecord (json): richiede che i dati in ingresso siano di tipo “mappa chiave/valore”, fornita tramite un oggetto JSON.
  • 2.3) updateGwRecord (modelAttribute): richiede che i dati in ingresso siano inseriti in un oggetto “FormData”, specificamente costruito nel corpo della richiesta seguendo la struttura di un oggetto ‘FormData’ di Geoweb (più avanti una spiegazione approfondita).

NOTA: Postman è in grado di determinare automaticamente il contenuto di una richiesta. Ciò significa che non è necessario definirla manualmente, a meno che l’obbiettivo dell’utente non sia stabilire un Content-Type fisso (può essere fatto nella sezione ‘Headers’ della richiesta).

Esempi
Title Informazioni di un record, dato il valore della chiave e il nome della classe
MethodGET
URL http://[indirizzo]/[contesto]/services/detailEntity/[**id**]/[**className**] http://localhost:8080/webclient/services/detailEntity/12345/test_class
Success Response Content{“key1”:“value1”,“key2”:“value2”,…}{“id_resource”:12345,“cod_resource”:“001”,“fax”:“aaa”}
Esempi
Title Lista completa delle entità di una classe, con paginazione e ordinamento
MethodGET
URL http://[indirizzo]/[contesto]/services/listEntity/[**className**] http://localhost:8080/webclient/services/listEntity/test_class
Header(optional) x-range=[startIndex-endIndex]x-range=0-29
URL Params(optional) sortBy=[+columnName1,+columnName2,…]sortBy=+id_resource,-cod_resource
Success Response Content{“keyColumn”:“nome_campo_chiave”, “data”:[{“key1”:“value1”,“key2”:“value2”,…},{“key1”:“value4”,“key2”:“value5”,…},…] {“keyColumn”:“id_resource”, “data”:[{“id_resource”:12345,“cod_resource”:“001”,“fax”:“aaa”},{“id_resource”:13245,“cod_resource”:“003”,“fax”:“ccc”},{“id_resource”:54321,“cod_resource”:“002”,“fax”:“bbb”} ]}
  • x-range: indica l'intervallo di valori da restituire (paginazione) (es.x-range=0-29 vengono restituiti i primi 30 record della classe). Se non specificato, sono restituiti tutti i record della classe.
  • sortBy: indica il tipo di ordinamento da effettuare. I campi, separati dalla virgola, possono essere preceduti dal carattere “+” per indicare un ordinamento crescente, “-” per indicare un ordinamento decrescente (DESC). Default crescente.
Esempi
Title Lista Entità: lista completa delle entità di una classe con paginazione, ordinamento e filtri
MethodPOST
URLhttp://[indirizzo]/[contesto]/services/listEntity/[**className**] http://localhost:8080/webclient/services/listEntity/test_class
Header(optional) x-range=[startIndex-endIndex]x-range=0-29
URL Params(optional) sortBy=[+columnName1,+columnName2,…]sortBy=+id_resource,-cod_resource
Content-Typeapplication/json
Body {“filters” : [{“condition”: [alphanumeric] “columnName”: [alphanumeric] “operator”: [alphanumeric] “filterType”: [alphanumeric] “value”: [array] ] , […] } {“filters” : [{“condition”:“AND”,“columnName”:“id_resource”, “operator”:“<”,“filterType”:“INTEGER”,“value”:[20000]},{“condition”:“AND”,“columnName”:“fax”, “operator”:“is not null”,“filterType”:“STRING”,“value”:[]}]}
Success Response Content{“keyColumn”:“nome_campo_chiave”, “data”:[{“key1”:“value1”,“key2”:“value2”,…},{“key1”:“value4”,“key2”:“value5”,…},…] {“keyColumn”:“id_resource”, “data”:[{“id_resource”:12345,“cod_resource”:“001”,“fax”:“aaa”},{“id_resource”:13245,“cod_resource”:“003”,“fax”:“ccc”} ]}

Headers

  • x-range: indica l'intervallo di valori da restituire (paginazione) (es.x-range=0-29 vengono restituiti i primi 30 record della classe). Se non specificato, non viene applicata la paginazione..

Params

  • sortBy: indica il tipo di ordinamento da effettuare. I campi, separati dalla virgola, possono essere preceduti dal carattere “+” per indicare un ordinamento crescente, “-” per indicare un ordinamento decrescente (DESC). Default crescente.

Body

  • {“filters”: …}: l'oggetto che contiene i filtri da applicare alla ricerca è costituito costituito dalla chiave “filters” e come valore una lista di oggetti, dove ogni oggetto rappresenta un singolo un filtro.
    • I filtri vengono tradotti in una clausola WHERE sql secondo questa struttura:
      • WHERE <beforeOpenBrackets1> <columnName1> <operator1> <value1> <endClosedBrackets1> <beforeOpenBrackets2> <condition2> <columnName2> <operator2> <value2> <endClosedBrackets2>
        • Esempio: l'oggetto filtri:
          • {“filters” : [{“condition”:“AND”,“columnName”:“id_resource”, “operator”:“<”,“filterType”:“INTEGER”,“value”:[20000]},{“condition”:“AND”,“columnName”:“fax”,“operator”:“is not null”,“filterType”:“STRING”,“value”:[]}]}
        • sarà tradotto nella seguente clausola WHERE:
          • WHERE id_resource < 20000 AND fax is not null
    • Il singolo filtro è così costituito:
      • beforeOpenBrackets: (INTEGER) numero di “(” da inserire prima della condizione. Default: 0
      • condition: (STRING) operatore logico. Possibili valori: “AND” oppure “OR”. La condizione è applicata prima del filtro per cui è definita (per il primo filtro viene quindi ignorata),
      • columnName: (STRING) nome dell'attributo a sinistra dell'operatore,
      • operator: (STRING) l'operatore (es “=”,“<>”,“<”,“⇐”,“>”,“>=”,“LIKE”,“BETWEEN”,“IS NULL”,“IS NOT NULL”,…),
      • filterType: (STRING) il datatype del valore del filtro (es. “STRING”, “INTEGER”, “NUMBER”, “DATE”, “CUSTOM”)
        • i valori corrispondenti al tipo “DATE” devono essere di tipo STRING e formattati secondo il seguente pattern ISO8601: “yyyy-MM-dd'T'HH:mm:ss”
        • il formato di tipo “CUSTOM” è utilizzabile nel caso in cui il filtro non è esprimibile tramite il formato di filtro standard di GEOWEB. Nel caso di filtro CUSTOM, la clausola WHERE verrà costruita utilizzando il contenuto del valore del campo (opzionale) customFilter
      • value: (LIST) una lista di valori (STRING, INTEGER, NUMBER). Il numero di valori deve essere coerente con il tipo di operatore: es. nel caso di operatore “=” la lista deve contenere un solo valore. Nel caso di operatore “is null” o “is not null” la lista deve essere vuota.
      • endClosedBrackets: (INTEGER) numero di “)” da inserire dopo la condizione. Default: 0
Esempi
Title Inserimento di un record (di una classe)
MethodPOST
URLhttp://[indirizzo]/[contesto]/services/insertGwRecord/[**className**] http://localhost:8080/webclient/services/insertGwRecord/test_class
Content-Typemultipart/form-data
Body
 Content-Disposition: form-data; name="key1"
 
 value1
 ------WebKitFormBoundary--,
 Content-Disposition: form-data; name="key2"
 
 value2
 -------WebKitFormBoundary--
 -...
Success Response Content{“success”:[boolean],“description”:“[messaggio_testuale]”,“itemId”:“[valore_chiave_primaria]”}{“success”:true,“description”:“Operazione eseguita con successo”,“itemId”:“1870567”}

insertGwRecord (multipart/form-data) - TEST

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/insertGwRecord/[gwClassName]
(esempio) http://localhost:8080/webclient/services/insertGwRecord/test_class

Body:

Selezionare l’opzione form-data ed inserire ogni dato seguendo una struttura chiave/valore. Utilizzando Postman sarà possibile cambiare il tipo di chiave da “testo” a “file”, permettendo dunque di inviare anche file attraverso questa richiesta (il tipo e l’estensione del file possono variare in base al contesto della richiesta, e non deve obbligatoriamente trattarsi di un file di testo).

(esempio)

KeyValue
fax (Text) ddd
test (File) [Scegli] test_file.txt

Inserisce un nuovo record con “fax” = ddd e “test” = test_file.txt

Esempi
Title Inserimento di un record (di una classe)
MethodPOST
URLhttp://[indirizzo]/[contesto]/services/insertGwRecord/[**className**] http://localhost:8080/webclient/services/insertGwRecord/test_class
Content-Typeapplication/json
Body {“key1”:“value1”,“key2”:“value2”,…}
Success Response Content{“success”:[boolean],“description”:“[messaggio_testuale]”,“itemId”:“[valore_chiave_primaria]”}{success:true,“description”:“Operazione eseguita con successo”,“itemId”:“1870567”}

insertGwRecord (JSON) TEST

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/insertGwRecord/[gwClassName]/json
(esempio) http://localhost:8080/webclient/services/insertGwRecord/test_class/json

Header:

In questo caso è necessario impostare un header che abbia Content-Type come chiave, e application/json come valore. Questo perché il servizio richiesto necessita obbligatoriamente di una mappa chiave/valore in ingresso, sotto forma di oggetto JSON.

Body:

Selezionare l’opzione raw. Apparirà un menu a tendina, tramite il quale l’utente potrà scegliere il formato e/o il tipo di testo che andrà ad utilizzare (nel nostro caso, sarà JSON (application/json)). Dopo di che, sarà possibile inserire i dati da inviare, ovviamente seguendo il formato JSON.

(esempio) 
{
  "cod_resource": "004",
  "fax": "eee"
}

Inserisce un nuovo record con “cod_resource” = “004” e “fax” = “eee”

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/insertGwRecord/[gwClassName]/modelAttribute
(esempio) http://localhost:8080/webclient/services/insertGwRecord/test_class/modelAttribute

Body:

Selezionare l’opzione form-data ed inserire i dati da inviare al servizio, seguendo una struttura chiave/valore. Stavolta sarà necessario strutturare la chiave in modo specifico, cosicché possa essere interpretata come un oggetto FormData (uno specifico tipo di oggetto di Geoweb), ed inserire i dati in una mappa chiamata editFormManager (la quale è posizionata in profondità all’interno di questo oggetto). Inoltre, a differenza del servizio ‘insertGwRecord’, in questo non sarà possibile utilizzare dei file come valori.

(esempio)

KeyValue
mapFormData[editFormManager][itemId] -1
mapFormData[editFormManager][10251]005
mapFormData[editFormManager][10258]fff

Inserisce un nuovo record con “cod_resource” = “005” e “fax” = “fff”

NOTA: In questo specifico servizio va notato che gli utenti non possono inviare dati utilizzando i “columnName” dei record che intendono inserire. Infatti, sarà necessario utilizzare i “gwid” degli attributi relative ai record: in questo esempio, “itemId” rappresenta il gwid della colonna “id_resource”, mentre “10251” rappresenta il gwid della colonna “cod_resource” e “10258” rappresenta il gwid della colonna “fax”.

NOTA: Durante la procedura di inserimento è comunque necessario fornire un “itemId” per l’oggetto che si intende inserire. Questo, per convenzione, è un valore fisso a -1, in modo tale che i servizi richiesti ed i metodi che ne conseguono possano essere in grado di riconoscere questo come un nuovo oggetto che non ha ancora un codice identificativo.

Esempi
Title Inserimento di un record (di una classe)
MethodPOST
URLhttp://[indirizzo]/[contesto]/services/updateGwRecord/[className] http://localhost:8080/webclient/services/updateGwRecord/test_class
Content-Typemultipart/form-data
Body
 Content-Disposition: form-data; name="primaryKeyColumn"
 
 keyColumn
 ------WebKitFormBoundary--,
 Content-Disposition: form-data; name="key2"
 
 value2
 -------WebKitFormBoundary--
Success Response Content{“success”:[boolean],“description”:“[messaggio_testuale]”}{success:true,“description”:“Operazione eseguita con successo”}

updateGwRecord (multipart/form-data) - TEST

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/updateGwRecord/[gwClassName]
(esempio) http://localhost:8080/webclient/services/updateGwRecord/test_class

Body:

Selezionare l’opzione form-data ed inserire ogni dato seguendo una struttura chiave/valore. Utilizzando Postman sarà possibile cambiare il tipo di chiave da testo a file, permettendo dunque di inviare anche file attraverso questa richiesta (il tipo e l’estensione del file possono variare in base al contesto della richiesta, e non deve obbligatoriamente trattarsi di un file di testo).

(esempio)

KeyValue
id_resource (Text)12345
fax (Text)ddd
test (File) [Scegli] test_file.txt

Aggiorna il record con id_resource = 123454 nei campi “fax” e “test”

Esempi
Title Inserimento di un record (di una classe)
MethodPOST
URLhttp://[indirizzo]/[contesto]/services/updateGwRecord/[**className**] http://localhost:8080/webclient/services/updateGwRecord/test_class
Content-Typeapplication/json
Body {“primaryKeyColumn”:“primaryKeyValue”,“key2”:“value2”,…}
Success Response Content{“success”:[boolean],“description”:“[messaggio_testuale]”}{success:true,“description”:“Operazione eseguita con successo”}

updateGwRecord (JSON) - TEST

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/updateGwRecord/[gwClassName]/json
(esempio) http://localhost:8080/webclient/services/updateGwRecord/test_class/json

Header:

In questo caso è necessario impostare un header che abbia Content-Type come chiave, e application/json come valore. Questo perché il servizio richiesto necessita obbligatoriamente di una mappa chiave/valore in ingresso, sotto forma di oggetto JSON.

Body:

Selezionare l’opzione raw. Apparirà un menu a tendina, tramite il quale l’utente potrà scegliere il formato e/o il tipo di testo che andrà ad utilizzare (nel nostro caso, sarà JSON (application/json)). Dopo di che, sarà possibile inserire i dati da inviare, ovviamente seguendo il formato JSON.

(esempio) 
{
  “id_resource”: “54321”
  "cod_resource": "004",
  "fax": "eee"
}

Aggiorna il record con id_resource = 54321 nei campi “cod_resource” e “fax”

Indirizzo della richiesta:

POST - http://[indirizzo]/[contesto]/services/updateGwRecord/[gwClassName]/modelAttribute
(esempio) http://localhost:8080/webclient/services/updateGwRecord/test_class/modelAttribute

Body:

Selezionare l’opzione form-data ed inserire i dati da inviare al servizio, seguendo una struttura chiave/valore. Stavolta sarà necessario strutturare la chiave in modo specifico, cosicché possa essere interpretata come un oggetto FormData (uno specifico tipo di oggetto di Geoweb), ed inserire i dati in una mappa chiamata editFormManager (la quale è posizionata in profondità all’interno di questo oggetto). Inoltre, a differenza del servizio ‘insertGwRecord’, in questo non sarà possibile utilizzare dei file come valori.

(esempio)

KeyValue
mapFormData[editFormManager][itemId]13245
mapFormData[editFormManager][10251]005
mapFormData[editFormManager][10258]fff

Aggiorna il record con id_resource = 13245 nei campi “cod_resource” e “fax”

NOTA: In questo specifico servizio va notato che gli utenti non possono inviare dati utilizzando i “columnName” dei record che intendono aggiornare. Infatti, sarà necessario utilizzare i “gwid” degli attributi relative ai record: in questo esempio, “itemId” rappresenta il gwid della colonna “id_resource”, mentre “10251” rappresenta il gwid della colonna “cod_resource” e “10258” rappresenta il gwid della colonna “fax”.

  • custom/interoperability/services.txt
  • Ultima modifica: 2019/11/26 11:01
  • da sabrina.sonno