05 - Web Services05a - Varie Web Service con IBM i

IBM i e Web Services – Trucchi e Faq (IT)

Last Updated on 1 Marzo 2020 by Roberto De Pedrini

You can find an English version of this post here!

Introduzione

Ecco un’altra collection di FAQ (Domande frequenti) sui Web Service e IBM i (ex AS400)… sono domande che ci vengono poste dalla Community IBM i italiana oppure prese direttamente dai forum di settore. Non vuole essere una guida completa per chi si affaccia per la prima volta al mondo dei Web Service in ambiente IBM i per pubblicare e/o consumare servizi, per questo abbiamo dei corsi appositi che facciamo in aula (se si raggiunge un numero sufficiente) oppure direttamente in azienda, vedi in tal caso l’apposita area di Faq400.com ( https://www.faq400.com/corsi-e-workshop/ ).

iWS-FAQ001: Posso pubblicare un Web Service senza la GUI di IWS?

L’interfaccia GUI di IWS semplifica moltissimo la pubblicazione di programmi e service program come Web Service, ma è un processo “lungo” e ripetitivo … se dobbiamo pubblicare pochi web service è ottimo ma se il numero diventa importante o dobbiamo automatizzare la pubblicazione per la distribuizione di un sooftware o altro, meglio ricorrere agli script

Gli script che riguardano i Web Services sono in questa cartella dell’IFS: /QIBM/ProdData/OS/WebServices/V1/server/bin

Per pubblicare un nuovo webservice avendo già il nostro programma o service program RPG/Cobol o, in generale, ILE possiamo fare:

STRQSH
cd /QIBM/ProdData/OS/WebServices/V1/server/bin
installWebService.sh -server 'server-name' -programObject 'program-object'
[-service 'service-name'] [-pcml 'pcml-file'] [-userid 'userid']
[-libraryList 'library-list'] [-libraryListPosition '*FIRST|*LAST']
[-disableNillableWSDLElements] [-disableOptionalWSDLElements]
[-addUnderscoreToWSDLElementNames] [-libraryListPosition '*FIRST|*LAST'] [-printErrorDetails] [-help]  

 Where:
server is the name of the Web services server in which the service will be installed.
programObject is the integrated file system path to the ILE program or
service program. For example, '/QSYS.LIB/MYLIB.LIB/MYPGM.[SRVPGM or PGM]'
service is the name of Web service to be installed. This parameter is
optional. If not specified, the program object name will be used.
pcml is a path to the PCML file. This parameter is optional. If not
specified, the program object must contain the PCML data.
userid is the user profile the Web service will be modified to run under. This parameter is optional. If not specified, the Web service will run
under the Web services server user profile. Note: The Web service server's
user profile needs to have *USE authority to the user profile specified on
this parameter. A value of *SERVER will ensure the Web service runs under the
same user profile as the Web services server.
libraryList is a list of libraries, that will be added to the library
list prior to invoking the Web service. Each library in the list must
be delimited by a colon. This parameter is optional.
libraryListPosition is the position in the user portion of the job
library list where the list of libraries specified in -libraryList will be
placed. A value of *FIRST inserts the libraries at the beginning of
the user portion of the library list. A value of *LAST inserts the libraries
at the end of the user portion of the library list. This parameter is
optional. If not specified the default value of *LAST is used.
disableNillableWSDLElements will define elements in generated WSDL as
not nillable. If not specified, elements are defined as nillable.
This parameter is ignored for version 1.3 of Web services engine.
disableOptionalWSDLElements will define elements in generated WSDL as
not optional. If not specified, elements are defined as optional.
This parameter is ignored for version 1.3 of Web services engine.
addUnderscoreToWSDLElementNames will generate WSDL element names
that start with the underscore (_) character, as was always done in
version 1.3 of the Web services engine. If not specified, element names
in WSDL will not start with the underscore character.
This parameter is ignored for version 1.3 of Web services engine.
printErrorDetails will show additional error information, such as stack
traces and error codes, if the command fails. This parameter is optional.
help displays the command syntax. This parameter is optional. 

iWS-FAQ-002: Come salvo e migro dei Web Service su un’altra partizione IBM i?

Quando dobbiamo migrare dei web service verso una nuova partizione IBM i (ad esempio cambio macchina o passaggio da Sviluppo a Produzione o tra due macchine in Clustering) dobbiamo conoscere un po’ meglio IWS:

I servizi che vediamo pubblicati dalla pagina http://myibmi:2001/HTTPAdmin risiedono in effetti nell’IFS in cartelle generalmente /www/nomedelserver … ad esempio /www/wservice. C’è inoltre una tabella di sistema che contiene un membro per ogni server delle applicazioni esistente

Salvare in un file la configurazione del webservice:

-- QSH and script directory
STRQSH
cd /QIBM/ProdData/OS/WebServices/V1/server/bin 
 
-- Save web service server
saveWebServicesServer.sh -server MyServer  -saveFile /qsys.lib/mylib.lib/mysavf.file 
--- Save some webservices
saveWebServices.sh -server MyServer -serviceList WS2:WS1  -saveFile /qsys.lib/mylib.lib/mysavf.file 

--- Trasfer your save file to another IBM i partition

-- Restore your web service server
restoreWebServicesServer.sh  -fromServerDirectory server-directory  -saveFile save-file  [ -printErrorDetails ] [ -help ] 

--- Restore some web services
restoreWebServices.sh -server MyServer2 -serviceList WS2:WS1  -fromServerDirectory /www/MyServer  -saveFile /qsys.lib/mylib.lib/mysavf.file 

Attenzione: se si stanno migrando i Web service su una nuova partizione IBM i, ad esempio in un cambio di macchina, consiglio di eseguire comunque un “Redeploy” di almeno un Web Service per ogni utente-web-service-server utilizzato: in fase di deploy l’utente del servizio viene autorizzato all’esecuzione dei web service: se non si fa questo passaggio potremmo andare in contro ad un errore 500 sui servizi trasferiti.

Seguono alcuni link di approfondimento sul tema:

iWS-FAQ-003: Recuperare le proprietà di un Web Service

Questo script estra le proprietà di un Web Service in un file in formato XML (PCML) … potrebbe risultare utile per installare nuovi web service su una seconda partizione partendo dalle proprietà estrette:

 getConfigurationFile.sh  -server WSERVICE -locationDirectory /tmp  -serviceList ConvertTemp 

installwebservice.sh     -server WSTEST   -propertiesFile    /tmp/ConvertTemp.properties 

Vedi guida su DeveloperWorks: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/dW%20IBM%20Integrated%20Web%20Services%20for%20i/page/Script%20to%20generate%20property%20file%20for%20a%20service

iWS-FAQ-004: Pubblicare un REST web service direttamente con SQL senza RPG/Cobol?

Dalla versione 7.3 TR7 e 7.4 è possibile pubblicare come Web Service delle semplici istruzioni SQL sempilficando notevolmente la logica.

Ce ne parla direttamente Tim Rowe di IBM in questo post su IBM System Magazine: IBM SystemMag : Getting started with REST and SQL

iWS-FAQ-005: HTTPS e SSL con IBM i – La creazione del certificato *SYSTEM nel Digital Certificate Manager DCM

Per attivare le funzioni HTTPS / SSL nei web service da IBM i è necessario creare un certificato *SYSTEM di base al nostro IBM i … la procedura è molto semplice se si ha un utente autorizzato (autorizzazioni *SECOFR).

E’ sufficiente seguire i 5 passi qui riportati:

https://www.ibm.com/support/pages/how-create-system-store-dcm

iWS-FAQ-006: Utilizzare HTTPGETCLOB e JSON_TABLE per Geolocalizzare un indirizzo

Ormai la geolocalizzazione di un indirizzo è un tema all’ordine del giorno e, sempre più spesso, dobbiamo completare delle nostre tabelle degli indirizzi su IBM i con i dati di geo-localizzazione, latitudine, longitudine ecc. Anche per interfacciarci agli spedizionieri è sempre più importare riportare nelle anagrafiche gli indirizzi pre-formattati correttamente.

Sono disponibile su internet diversi servizi di geo-localizzazione partendo da un indirizzo … vediamo qui sotto come utilizzare i Servizi di Geocoding di Google (**) direttamente da uno statement SQL con HTTPGETCLOB e JSON_TABLE per recuperarne i metadati dal JSON ritornato.

Lo statement SQL è molto semplice e possiamo utilizzarlo direttamente da SQL Script oppure da RPG-SQL-Embedded e avere a disposizione i dati ritornati da memorizzare sulle nostre tabelle … in questa chiamata ho, naturalmente, sostituito la mia KEY di Google Maps con la scritta XXX_YOUR_KEY_HERE, metteteci la vostra KEY presa dal pannello di Google Developers

Select * from
 json_table(
 systools.httpgetclob('https://maps.googleapis.com/maps/api/geocode/json?address=Piazza+Duomo+1,20121+MIlano&components=country:IT&key=XXX_YOUR_KEY_HERE','')
,'$'
COLUMNS( 
formatted_address VARCHAR(200) PATH '$.results.formatted_address',
lat decimal(10, 7) PATH '$.results.geometry.location.lat',
lng decimal(10, 7) PATH '$.results.geometry.location.lng'


) ) as x;

Il risultato dello statement sopra è il seguente:

(**) Geocode è una delle API disponibili dal pannello dei servizi Google. Un tempo era gratuita … ora richiede la registrazione di un apposito account nella Google Cloud Platform, l’attivazione delle API desiderate e l’ottenimento di una KEY univoca di riconoscimento

Solo per gli indirizzi di US e Canada c’è il servizio gratuito United States CENSUS Bureau, gratuito:

Select * from
 json_table(
 systools.httpgetclob('https://geocoding.geo.census.gov/geocoder/locations/address?street=265+Peachtree+St+NE&city=Atlanta&state=GA&zip=30303&benchmark=Public_AR_Current&format=json','')
,'$'
COLUMNS( 
formatted_address VARCHAR(200) PATH '$.result.addressMatches.matchedAddress',
lat decimal(10, 7) PATH '$.result.addressMatches.coordinates.x',
lng decimal(10, 7) PATH '$.result.addressMatches.coordinates.y'
) ) as x;

Con questo risultato:

Se preferisci utilizzare RPG per consumare questo tipo di servizi dai una occhiata a questo post su FieldExit di Bradley Stone

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

--- Roberto De Pedrini Faq400.com
About author

Founder di Faq400 Srl, IBM Champion, ideatore del sito Faq400.com e del Blog blog.faq400.com. Sviluppatore RPG da quando avevo i pantaloni corti, forte sostenitore della piattaforma IBM i (ex AS400), ho sempre cercato di convididere le mie conoscenze con gli altri tramite forum, eventi e corsi. Oggi, tramite Faq400 Srl, cerchiamo di aiutare le aziende a sfruttare al meglio questa fantastica piattaforma IBM i.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *