Il linguaggio di programmazione Delphi
 

Connessione ed interazione con webserver
1 | 2 |

Luigi Siciliano 28 Gen 2017 08:00
Ho la necessità di connettermi ed interagire con i webservices del
sistema tessera sanitaria per trasmettere un solo ******* di dati.

Questi webservices dialogano con il protocollo soap e non si possono
importare.

Tra i componenti di delphi2010 trovo, nella palette webservices, il
componente TSoapConnection.

L'help in linea di delphi non mi è d'aiuto e non ho capito con quali
altri componenti gestisco poi la connessione ed il dialogo con il
webservice.

Online trovo parecchia roba ma, essendo proprio digiuno di queste cose,
mi perdo facilmente.

Qualcuno potrebbe darmi un spunto?

Grazie.
Alberto Salvati 28 Gen 2017 15:48
> Questi webservices dialogano con il protocollo soap e non si possono
> importare.


Cioè, non è possibile generare la classe proxy con il wsdlimporter?
Hai provato? Ti da errori o che altro?


A.
Alberto Salvati 28 Gen 2017 15:49
Aggiungo: se hai un link magari qualcuno riesce a fare una prova veloce...

A.
alessandrob 29 Gen 2017 17:06
Il giorno sabato 28 gennaio 2017 07:59:51 UTC+1, Luigi Siciliano ha scritto:
> Ho la necessità di connettermi ed interagire con i webservices del
> sistema tessera sanitaria per trasmettere un solo ******* di dati.
>
Credo ti riferisca alla trasmissione dei dati relativi al 730 da parte di
strutture sanitarie (farmacie, laboratori di *****isi, ...)

In questo caso, se hai fatto richiesta del Kit di integrazione (o se te lo ha
fatto pervenire il tuo cliente finale) trovi all'interno molte informazioni su
come fare la procedura per il trasferimento dei dati.

Io ho mandato una mail direttamente a gestionets @ sogei.it che mi ha fatto
pervenire il kit di integrazione

Nella mail, oltre al kit (una serie di ******* di documentazione e di esempio),
era presente anche un link alla documentazione online:
http://sistemats1.sanita.finanze.it/wps/portal/portalets/sistematsinforma/730%20-%20Spese%20sanitarie

Ho realizzato questa integrazione ancora alla fine del 2015 e credo di aver
utilizzato la versione XE7 di Delphi, nella quale ho effettuato l'import del
wsdl come suggerito anche da Alberto Salvati
Luigi Siciliano 30 Gen 2017 11:00
Il 29/01/2017 17.06, alessandrob ha scritto:
>
> Nella mail, oltre al kit (una serie di ******* di documentazione e di
esempio), era presente anche un link alla documentazione online:
>
http://sistemats1.sanita.finanze.it/wps/portal/portalets/sistematsinforma/730%20-%20Spese%20sanitarie
>

ho importato il wsdl presente nel kit tessera sanitaria.

Delphi mi ha creato due classi: TRicevutaInvio e TProprietario

una interfaccia definita come segue:

InvioTelematicoSS730pMtom = interface(IInvokable)
['{1F58756D-A2E0-C47D-0817-8E685DCE51B1}']
function inviaFileMtom(const nomeFileAllegato:
tipoNomeFileAllegato;
const pincodeInvianteCifrato: string;
const datiProprietario: TProprietario;
const opzionale1: string;
const opzionale2: string;
const opzionale3: string;
const documento: TByteDynArray):
TRicevutaInvio; stdcall;
end;

e la function che segue:

function GetInvioTelematicoSS730pMtom(UseWSDL: Boolean=System.False;
Addr: string=''; HTTPRIO: THTTPRIO = nil): InvioTelematicoSS730pMtom;


Come faccio a passare i parametri alla function dell'interfaccia?

il seguente codice sembra funzionare ma non capisco come prelevo i dati
della ricevuta:

procedure TfrmGestioneSistemaTesseraSanitaria.btnInvioClick(Sender:
TObject);
const
fnfile = 'Veterinario.zip';
sPinCode = 'e4XbRBmI';
var
Proprietario: TProprietario;
Documento: TByteDynArray;
Ricevuta: TRicevutaInvio;
Invio: InvioTelematicoSS730pMtom;
begin
Proprietario := TProprietario.Create;
Proprietario.cfProprietario := sPinCode;
Documento := FileToByteArray(fnFile);
invio := GetInvioTelematicoSS730pMtom();

// Fin qui ci arriva ma come leggo la ricevuta restituita?

CodiceEsito := Ricevuta.CodiceEsito ??????
end;

Grazie.
Alberto Salvati 30 Gen 2017 11:06
Devi avere una classe che implementa InvioTelematicoSS730pMtom.
Ne crei una istanza e poi:

var
x: TQualcosaCheImplementaInvioTelematicoSS730pMtom;
ricevuta: TRicevuta;

begin
ricevuta := x.inviaFileMtom(...);
Giacomo Degli Esposti 30 Gen 2017 11:21
On Monday, January 30, 2017 at 10:59:36 AM UTC+1, Luigi Siciliano wrote:
[...]
> InvioTelematicoSS730pMtom = interface(IInvokable)
> ['{1F58756D-A2E0-C47D-0817-8E685DCE51B1}']
> function inviaFileMtom(const nomeFileAllegato:
> tipoNomeFileAllegato;
> const pincodeInvianteCifrato: string;
> const datiProprietario: TProprietario;
> const opzionale1: string;
> const opzionale2: string;
> const opzionale3: string;
> const documento: TByteDynArray):
> TRicevutaInvio; stdcall;
> end;
[...]
> function GetInvioTelematicoSS730pMtom(UseWSDL: Boolean=System.False;
> Addr: string=''; HTTPRIO: THTTPRIO = nil): InvioTelematicoSS730pMtom;
[...]
> procedure TfrmGestioneSistemaTesseraSanitaria.btnInvioClick(Sender:
> TObject);
> const
> fnfile = 'Veterinario.zip';
> sPinCode = 'e4XbRBmI';
> var
> Proprietario: TProprietario;
> Documento: TByteDynArray;
> Ricevuta: TRicevutaInvio;
> Invio: InvioTelematicoSS730pMtom;
> begin
> Proprietario := TProprietario.Create;
> Proprietario.cfProprietario := sPinCode;
> Documento := FileToByteArray(fnFile);
> invio := GetInvioTelematicoSS730pMtom();
>
> // Fin qui ci arriva ma come leggo la ricevuta restituita?

prova con ...

Ricevuta := invio.inviaFileMtom( ... );

> CodiceEsito := Ricevuta.CodiceEsito ??????
> end;

ciao
Giacomo
Luigi Siciliano 30 Gen 2017 12:32
Il 30/01/2017 11.21, Giacomo Degli Esposti ha scritto:
>
> prova con ...
>
> Ricevuta := invio.inviaFileMtom( ... );
>

Grazie, così sembra funzionare ma, il webservice (credo sia lui che va
in eccezione) mi restituisce un errore come se il ******* xml fosse guasto:
"Per il documento XML è necessario specificare un elemento di primo
livello." Line: 0

Il ******* formalmente è corretto.

Suggerimenti?

Grazie.
Alberto Salvati 30 Gen 2017 12:37
> Il ******* formalmente è corretto.

..cioè...? Con cosa lo hai aperto?


A.
Luigi Siciliano 30 Gen 2017 12:55
Il 30/01/2017 12.37, Alberto Salvati ha scritto:
>> Il ******* formalmente è corretto.
>
> ..cioè...? Con cosa lo hai aperto?
>
>

Sia con il blocco note per guardarlo al lumicino :) che con IE
(applicazione di default).

Ciao
Alberto Salvati 30 Gen 2017 13:04
> Sia con il blocco note per guardarlo al lumicino :) che con IE
> (applicazione di default).

Buttali via.
Prova ad aprirlo da un browser diverso o da un programma delphi

Ancora, prendi un xml formattato in modo diverso, mandalo su e vedi che errori
ti da.

Essendo un software della PA è stato sciuramente scritto da persone che hanno
25 lauree, 48 master e molto altro, ma poi scrivono programmi cinofallici che in
caso di errori sputano fuori messaggi "penali", il tutto basato su direttive di
burocrati che spesso sono staccati dalla realtà.


A.
Alberto Salvati 30 Gen 2017 14:24
Mi autoquoto:

ricordo come fosse ieri un sito della PA sul quale, durante la registrazione, se
scrivevi una password non adatta ti rispondeva con un messaggio "la pw non è
conforme al decreto/legge etc etc".
Io feci la parte dell'indiano e scrissi al supporto chiedendo cosa volesse dire.
Devo dirlo: mi risposero entro la mattina dopo.
E mi spiegarono le solite cose: deve essere lunga almeno tot, deve contenere
almeno un carattere maiuscolo etc.

Sempre facendo l'indiano, chiesi come mai, invece del messaggo scritto in
burocratichese. non avessero riportato le 2 righe dell mail.
A questa richiesta non hanno mai risposto.

Per non parlare del SIETA...

A.
Luigi Siciliano 30 Gen 2017 15:23
In effetti, in uno dei files che compongono il kit c'è un documento con
i dati da utilizzare per le prove.

In questo ******* c'è lo username e la password da utilizzare, per i quali,
però, *non* ho trovato i corrispondenti campi.

Ci sono anche altri due dati: "PinCode" e "PinCode cifrato",
utilizzandoli, durante l'elaborazione dell'istruzione:
Ricevuta := invio.inviaFileMtom(fnfile, sPinCode, Proprietario, '', '',
'', Documento);
Mi viene presentata una dialog (titolo: "Sicurezza di windows") per
scegliere il certificato da selezionare (I certificati che mi vengono
presentati, però, corrispondono a due persone che sono passate nel mio
PC solo perché hanno firmato digitalmente dei documenti con la ******* per
la firma digitale con l'applicazione "dike") e, non sapendo se questi
certificati vengono trasmessi al webservice e, non volendo coinvolgere
questi certificati, ho premuto il pulsante "Annulla" ricevendo un nuovo
errore:
"cvc-particle 3.1: in element inviaFileMtom of type inviaFileMtom, found
<nomeFileAllegato>, but next item should be nomeFileAllegato."

Se cambio l'url da "https://..." a "http://..." ricevo nuovamente
l'errore precedente che segnalava il ******* xml guasto!

Come posso utilizzare un altro certificato (il mio)?

Grazie
Alberto Salvati 30 Gen 2017 15:40
> In questo ******* c'è lo username e la password da utilizzare, per i quali,
> però, *non* ho trovato i corrispondenti campi.

Credo che l'autenticazione con quei dati debba essere fatta ogni volta.
Avere in cache da qualche parte questi dati potrebbe creare delle paurose falle
nella sicurezza.


> Come posso utilizzare un altro certificato (il mio)?

Google?


A.
Luigi Siciliano 30 Gen 2017 16:07
Il 30/01/2017 15.40, Alberto Salvati ha scritto:
>
>> Come posso utilizzare un altro certificato (il mio)?
>
> Google?
>
>
Anche utilizzando il mio certificato viene fuori lo stesso errore :(
Alberto Salvati 30 Gen 2017 16:59
> Anche utilizzando il mio certificato viene fuori lo stesso errore :(

cioe', xml non valido?
Hai provato ad aprirlo da Firefox/Chrome?
Hai provato a inviare un xml con struttura diversa rispetto a quella che il web
service si aspetta di ricevere?
Aggiungo: non è che oltre XML è previsto l'invio anche in qualche formato
testo?

A.
Luigi Siciliano 30 Gen 2017 18:59
Il 30/01/2017 16.59, Alberto Salvati ha scritto:
>> Anche utilizzando il mio certificato viene fuori lo stesso errore :(
>
> cioe', xml non valido?

Si, provato con editor di testo, ed ho provato Online con XML validator
presente su xmlGrid.net qui <http://xmlgrid.net/validator.html> e dice
che va bene.
Il ******* xml è un ******* standard presente nel kit rilasciato dal sistema
tessera sanitaria per le prove di trasmissione.

> Hai provato ad aprirlo da Firefox/Chrome?

Firefox stranamente legge una serie incomprensibile di caratteri!?!

Chome non lo uso.


> Hai provato a inviare un xml con struttura diversa rispetto a quella che il
web service si aspetta di ricevere?

Si e mi restituisce lo stesso errore!?!

> Aggiungo: non è che oltre XML è previsto l'invio anche in qualche formato
testo?
>
Le specifiche sono di passare:

- NomeFileAllegato = nome dos del *******
- PincodeCifrato = un codice cifrato;
- Documento = il ******* NomeFileAllegato zippato;
- CFProprietario = codice fiscale;

Grazie.

Ciao.
Luigi Siciliano 31 Gen 2017 08:32
Il 30/01/2017 16.59, Alberto Salvati ha scritto:
> Hai provato a inviare un xml con struttura diversa rispetto a quella che il
web service si aspetta di ricevere?

Provato con il ******* .dpr del progetto di delphi ed è lo stesso errore.
E' chiaro, quindi, che il ******* *non* arriva!
Nel prototipo della funzione il ******* da allegare è definito come segue:
const documento: TByteDynArray.

Poiché in Delphi non c'è una apposita funzione ho utilizzato questa
reperita in rete (per inciso non ho capito bene perché senza assegnare
Result la funzione restituisce comunque un risultato):

function FIleToByteArray( const FileName : string ) : TByteDynArray;
const
BLOCK_SIZE=1024;
var
BytesRead, BytesToWrite, Count : integer;
F : ******* of Byte;
pTemp : Pointer;
begin
AssignFile( F, FileName );
Reset(F);
try
Count := FileSize( F );
SetLength(Result, Count );
pTemp := @Result[0];
BytesRead := BLOCK_SIZE;
while (BytesRead = BLOCK_SIZE ) do
begin
BytesToWrite := Min(Count, BLOCK_SIZE);
BlockRead(F, pTemp^, BytesToWrite , BytesRead );
pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
Count := Count-BytesRead;
end;
finally
CloseFile( F );
end;
end;

ma anche con quest'altra è lo stesso:

function ByteStreamToByteArray(const FileName: TFileName): TByteDynArray;
var
bs: TBytesStream;
begin
bs := TBytesStream.Create;
bs.LoadFromFile(FileName);
Result := TByteDyNArray(bs.bytes);
bs.Free;
end;

Che dipenda da unicode?

Grazie.

Ciao.
Daniele 31 Gen 2017 10:17
Ciao Luigi,
non ho esperienza per quanto riguarda l'invio dei dati al server della PA,
pero' ho avuto esperienza nei dati da inviare al sistema di tracciamento nel
comparto del ministero della sanita'.
Ricordo (ormai sono passati 3 anni) che il ******* xml (studiato da chi ha
almeno 25 lauree, 48 master, 3 titoli masterchef e ha vinto 4 ristoranti)
veniva SEMPRE rifiutao con errori strambi e poco interpretabili.
In questo caso l'assistenza (che ad onore del vero ha sempre risposto
subito) a sua volta brancolava nel buio e mi aveva mandato diversi pdf con
le versioni aggiornate della documentazione.
Per farla breve, se la filosofia e' la stessa, il fil xml DEVE ESSERE COSI'
COM'E' RIPORTATO NEGLI ESEMPI, se varia di un qualcosa non lo accetta.
Nel mio caso il motivo del rifiuto era la data.
Nel ******* xml era specificato che si poteva usare il formato yyyy-mm-dd o
dd-mm-yyyy o yyyy/mm/dd.
Io mandavo dd/mm/yyyy ERRATO PERCHE' NON SUPPORTATO, ho cambiato in
yyyy-mm-dd e, magicamente, tutto ha funzionato.
Per creare il ******* xml ho usato TXMLDocument (Delhi XE 2).

Sempre per tua informazione, quando questa ira si e' abbattuta sulla filiera
sanitaria (farmacie, dentisti, medici ecc....) le software house deputate
alla modifica dei gestionali (appunto per inviare i dati alla PA per la
compilazione automatica del 730) hanno impiegato la bellezza di qualche mese
PRIMA di imbroccare il formato giusto.

Ricorda il ******* deve essere paro paro come quello degli esempi.

> Il ******* formalmente è corretto.
Se non lo accetta no

> Suggerimenti?
Se c'e' un link di prova sfruttalo.
A mio tempo non c'era, ma oggi dovrebbe esserci.
Se c'e', manda li il tuo ******* e *****izza gli errori restituiti e, nel caso
del ******* xml, controlla bene gli inio-fine di ogni blocco e la gerarchia.

Non e' cosi' facile (almeno, per me non lo e' stato!!)

Ciao

Daniele
theFiller 31 Gen 2017 11:30
Il 30/01/2017 15:23, Luigi Siciliano ha scritto:
> In effetti, in uno dei files che compongono il kit c'è un documento con
> i dati da utilizzare per le prove.
>
> In questo ******* c'è lo username e la password da utilizzare, per i quali,
> però, *non* ho trovato i corrispondenti campi.
>

sono l'username e la password per l'autenticazione
cerca delphi Basic Authentication
eventualmente specifiche per THTTPRIO

ciao
theFiller 31 Gen 2017 11:33
Il 28/01/2017 08:00, Luigi Siciliano ha scritto:
> Ho la necessità di connettermi ed interagire con i webservices del
> sistema tessera sanitaria per trasmettere un solo ******* di dati.
>
> Questi webservices dialogano con il protocollo soap e non si possono
> importare.
>
> Tra i componenti di delphi2010 trovo, nella palette webservices, il
> componente TSoapConnection.
>
> L'help in linea di delphi non mi è d'aiuto e non ho capito con quali
> altri componenti gestisco poi la connessione ed il dialogo con il
> webservice.
>
> Online trovo parecchia roba ma, essendo proprio digiuno di queste cose,
> mi perdo facilmente.
>
> Qualcuno potrebbe darmi un spunto?
>
> Grazie.

se conosci dotnet qui c'è un esempio funzionante
www.visual-basic.it/Forum/tabid/151/aft/42746/Default.aspx#.WJBeIPnhBhF

ciao
Luigi Siciliano 31 Gen 2017 11:51
Il 31/01/2017 10.17, Daniele ha scritto:
> In questo caso l'assistenza (che ad onore del vero ha sempre risposto
> subito)

Non sembra esserci un link/email per avere assistenza software o meglio,
io non sono riuscito a trovarlo. ;(


>
> Ricorda il ******* deve essere paro paro come quello degli esempi.
>

In questo caso, io, invio un ******* contenuto nel kit stesso rilasciato da
loro ma, se invio il ******* dpr generato da delphi mi viene restituito lo
stesso errore per cui ritengo che anche se io passo il ******* giusto,
questo non arriva nel formato richiesto.

Nel documento di accompagnamento c'è scritto: ******* compresso contenente
i documenti fiscali, secondo lo schema dati"
Nello schema dati: "<xs:element minOccurs="1" maxOccurs="1"
name="documento" nillable="false" type="xs:base64Binary" />"

Delphi, importando il wsdl l'ha definito nel prototipo della funzione
così: const documento: TByteDynArray


>> Il ******* formalmente è corretto.
> Se non lo accetta no
>

Io dico che è corretto perché è lo stesso ******* contenuto nel loro kit e
perché ho verificato le corrispondenze.


>> Suggerimenti?
> Se c'e' un link di prova sfruttalo.

E' proprio quello che sto cercando di fare :)


Grazie.

Ciao
alessandrob 31 Gen 2017 13:01
Il giorno martedì 31 gennaio 2017 11:51:20 UTC+1, Luigi Siciliano ha scritto:
> Il 31/01/2017 10.17, Daniele ha scritto:
>> In questo caso l'assistenza (che ad onore del vero ha sempre risposto
>> subito)
>

Ho visto una serie di problemi segnalati, prova a vedere se per alcuni di questi
le informazioni qui sotto ti possono aiutare:

a) per il certificato da utilizzare, il kit contiene il ******* SanitelCF.rar
nel quale è presente il certificato da utilizzare SaniterCF.cer

b) per l'autenticazione da passare, ho trovato un metodo da ridefinire in
HTTPRIO che consente di gestire l'autenticazione (ti riporto anche i riferimenti
di dove ho trovato gli spunti); FUserName e FPassword sono due variabili del
form dove ho gestito la procedura

....
{ --- Supporto per Collegamento --- }
HTTPRIO := THTTPRIO.Create(Self);

{ --- Consente anche utilizzo di Certificati non verificati --- }
HTTPRIO.HTTPWebNode.InvokeOptions :=
[soPickFirstClientCertificate,soIgnoreInvalidCerts];

{ --- Metodo per passare le credenziali di accesso --- }
HTTPRIO.HTTPWebNode.OnBeforePost := DoHTTPRIOHTTPWebNodeBeforePost;

...


{}
{ --- Gestione Autenticazione --- }
// See more at:
http://codeverge.com/embarcadero.delphi.webservices/how-do-i-use-basic-authenticat/1078800#sthash.Umf0FsWD.dpuf
{}
procedure TFrmStgHubSysTs.DoHTTPRIOHTTPWebNodeBeforePost( const HTTPReqResp:
THTTPReqResp; Data: Pointer);
var S: string;
begin
{ --- Compone testo per Credenziali --- }
S := 'Authorization: Basic ' + EncodeString( FUserName + ':' + FPassword );

{ --- Inserisce Credenziali --- }
HttpAddRequestHeaders( Data, PChar(S), Length(S), HTTP_ADDREQ_FLAG_ADD );
end;


c) per quanto riguarda i dati da criptare erano il PinCode dell'inviante, il
Codice Fiscale del proprietario e quello del cittadino; io ho utilizzato vari
metodi ha poi alla fine ho optato per una chiamata indiretta a openssl tramite
******* di appoggio; per l'utilizzo diretto (che inizialmente mi funzionava) ho
avuto una serie di problemi legati alle varie versioni di Delphi e delle
librerie Libeay32 e ssleay32


d) per il ******* da inviare è necessario il caricamento del ******* zip in un
array di byte/caratteri per consentire l'invio; io ho utilizzato la lettura
tramite stream:

function TFrmStgHubSysTs.ReadFileToSend( FileZip: String ): string;
var StringStream: TStringStream;
FileStream : TFileStream;
Bytes: TBytes;
FileData: string;
begin
{ --- Apertura Stream su ******* --- }
FileStream:= TFileStream.Create( FileZip,fmOpenRead );

{ --- Stream Stringa di Destinazione --- }
StringStream := TStringStream.Create( '' );

try
{ --- Copia Stream --- }
StringStream.CopyFrom( FileStream,FileStream.Size );

{ --- Lettura ******* su Stringa --- }
FileData := StringStream.DataString;
finally
StringStream.Free;
FileStream.Free;
end;

{ --- Risultato --- }
Result := FileData;
end;
Daniele 31 Gen 2017 16:07
Ciao Luigi,

> Non sembra esserci un link/email per avere assistenza software o meglio,
> io non sono riuscito a trovarlo. ;(
Partendo dal link che ha lasciato alessandrob ho trovato quest'altro link

http://sistemats1.sanita.finanze.it/wps/wcm/connect/0f7a758c-9638-4e74-95b7-bde0bfab29a5/kit730P_ver_20161223.zip?MOD=AJPERES&CACHEID=0f7a758c-9638-4e74-95b7-bde0bfab29a5

che praticamente contiene tutto quello che hai bisogno.
Ci sono anche i link per fare i test ovvero, per i veterinari

AMBIENTE DI TEST:
--------------------------------------------------------------------------------------------------------------------
https://invioSS730pTest.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort
https://invioSS730pTest.sanita.finanze.it/Ricevute730ServiceWeb/ricevutePdf
https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/DettaglioErrori730Service
https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/EsitoInvioDatiSpesa730Service
https://invioSS730pTest.sanita.finanze.it/DocumentoSpesa730pWeb/DocumentoSpesa730pPort
https://invioSS730pTest.sanita.finanze.it/ReportMensile730Web/ReportMensilePort
https://invioSS730pTest.sanita.finanze.it/InterrogazionePuntuale730Web/InterrogazionePuntuale730Port

poi ci sono i vari esempi dei ******* xml che qui non posso allegare perche'
l'editor non li gradisce.

Come ti dicevo nell'altro messaggio il ******* xml dev'essere uguale a quello
che trovi dentro il ******* zippato.
Ci sono davvero tanti esempi, tra cui l'autenticazione.
Non posso aiutarti per tutto cio' che riguarda i certificati perche' non li
ho mai utilizzati.

Il primo test che DEVI superare e' il test del login.
Quando il sistema della sogei ti da ok come risultato, allora ti dedichi al
******* da inviare che, vista la struttura, se hai una griglia e' davvero una
stupidaggine crearlo.
Ovviamente il login lo devi fare con le credenziali corrette, ovvero con
l'utente accreditato per l'invio, nel sito di test.

Il login lo fai con gli oggetti creati da delphi nella conversione del *******
wsdl.
Nell'oggetto di delphi c'e' gia' tutto, al massimo devi preoccuparti di
cryptare username e password secondo le direttive del sito a cui ti
colleghi.
Anche il THTTPRIO lo devi usare con le pinze, io mi ricordo che

WSDLLocation e' il drive + path + nomefile.wsdl
Port e Service dovrebbe metterli gia' delphi.

Inoltre devi anche saper gestire i vari wsdl convertiti.
Di solito trovi un wsdl per il login, uno per le richieste, ecc....

Ho anche visto che esistono versioni di wsdl con piu' servizi incorporati,
ma non so come si fa a gestirli.

Non e' facile, anzi tutt'altro.
Io (non programmatore ma solo utodidatta che si arrangia per le proprie
necessita') ho impiegato 1 mese per capire e far funzionare i servizi web di
cui avevo bisono (login, invio, richieste, letture, listini ecc.. dei
documenti )
tu dovresti impiegare meno di me !!!, metti in conto tatnte, tante cozzate
contro il muro.

Buon divertimento !!!!

Ciao

Daniele
Luigi Siciliano 31 Gen 2017 19:53
Il 31/01/2017 16.07, Daniele ha scritto:
>
> che praticamente contiene tutto quello che hai bisogno.
> Ci sono anche i link per fare i test ovvero, per i veterinari
>

Li ho trovati ma, non mi aiutano a capire dove sbaglio.
>
> Come ti dicevo nell'altro messaggio il ******* xml dev'essere uguale a
> quello che trovi dentro il ******* zippato.

Il ******* che invio è quello.

> Ci sono davvero tanti esempi, tra cui l'autenticazione.
??? non mi sembra. Ci sono i dati da inserire relativamente alla
username, password, pin in chiaro e codificato.

>
> Il primo test che DEVI superare e' il test del login.

A questo punto credo di non riuscire in questo :(

> Ovviamente il login lo devi fare con le credenziali corrette, ovvero con
> l'utente accreditato per l'invio, nel sito di test.
>
Veramente se provo a loggarmi nell'area riservata utilizzando la
username e la relativa password non si riesce a farlo.

>
> WSDLLocation e' il drive + path + nomefile.wsdl
> Port e Service dovrebbe metterli gia' delphi.
>
giusto, almeno credo :)

> Non e' facile, anzi tutt'altro.
>
> Buon divertimento !!!!
>

Adesso l'errore restituito è: "Interface not supported".

> Ciao
>
> Daniele
>

Grazie.

Ciao.
alessandrob 31 Gen 2017 21:48
Il giorno martedì 31 gennaio 2017 19:52:33 UTC+1, Luigi Siciliano ha scritto:

Ti posto un po' di codice che utilizzo per eseguire l'invio sperando che ti
possa aiutare.

Io utilizzo la tecnica di predisporre il ******* da inviare, zipparlo e
predisporre un ******* di appoggio con i parametri per l'invio.
Successivamente richiamo la procedura che esegue l'invio vero e proprio

Il ******* di appoggio da cui leggere i dati per l'invio, viene letto con una
mia estensione di TIniFile per non memorizzare le password in chiaro nel *******
di appoggio

Anche la risposta (che nel primo invio è sostanzialmente il protocollo) la
ri-memorizzo nel ******* di appoggio, così poi ritorna al processo principale

Tra i parametri di passaggio ricevo l'informazione se utilizzare l'area di test
o quella di produzione


procedure TFrmStgHubSysTs.SendToSistemaTs( FileIni: string; TargetTest: boolean
);

var Ini: TTecnoSysIniFile;
FileToSend, DataToSend: string;

// Strumenti di Connessione
HTTPRIO: THTTPRIO;
F730: InvioTelematicoSS730pMtom;

// dati specifici
datiProprietario: proprietario;
nomefileallegato: tipoNomeFileAllegato;
pincodeInvianteCifrato: string;
opzionale1: string;
opzionale2: string;
opzionale3: string;
documento: TByteDynArray;
ricevuta: ricevutaInvio;
begin
{ --- Dati Proprietario --- }
datiProprietario := proprietario.Create;

{ --- Lettura ******* di Collegamento --- }
Ini := TTecnoSysIniFile.Create( FileIni );

{ --- ******* da Inviare --- }
FileToSend := Ini.ReadString( _SysTs_Sec_I,'Zip','' );

{ --- Dati Proprietario --- }
datiProprietario.codiceRegione := Ini.ReadString( _SysTs_Sec_I,'Reg','' );
datiProprietario.codiceAsl := Ini.ReadString( _SysTs_Sec_I,'Asl','' );
datiProprietario.codiceSSA := Ini.ReadString( _SysTs_Sec_I,'Pre','' );
datiProprietario.cfProprietario := Ini.ReadString( _SysTs_Sec_I,'Cfp','' );

{ --- PinCode Cifrato --- }
pincodeInvianteCifrato := Ini.ReadString( _SysTs_Sec_I,'Pin','' );

{ --- Credenziali --- }
FUserName := Ini.ReadPassword( _SysTs_Sec_I,'Usr','' );
FPassword := Ini.ReadPassword( _SysTs_Sec_I,'Pwd','' );

{ --- Libera --- }
Ini.Free;



{ --- Caricamento ******* nel buffer di trasmissione --- }
DataToSend := ReadFileToSend(FileToSend);

{ --- Trasferimento nel Buffer --- }
documento := StrToByteDynArray( DataToSend );

{ --- Nome Allegato --- }
nomefileallegato := ExtractFileName( FileToSend );

{ --- Dati Opzionali --- }
opzionale1 := '';
opzionale2 := '';
opzionale3 := '';




{ --- Supporto per Collegamento --- }
HTTPRIO := THTTPRIO.Create(Self);

{ --- Consente anche utilizzo di Certificati non verificati --- }
HTTPRIO.HTTPWebNode.InvokeOptions :=
[soPickFirstClientCertificate,soIgnoreInvalidCerts];

{ --- Metodo per passare le credenziali di accesso --- }
HTTPRIO.HTTPWebNode.OnBeforePost := DoHTTPRIOHTTPWebNodeBeforePost;

{ --- Collegamento Area Test / Produzione --- }
if TargetTest
then F730 := GetInvioTelematicoSS730pMtom( False,_Deb_SistemaTs_Send,HTTPRIO
)
else F730 := GetInvioTelematicoSS730pMtom( False,_Prd_SistemaTs_Send,HTTPRIO
);

{ --- Esegue Invio --- }
ricevuta := F730.inviaFileMtom(
nomefileallegato,pincodeInvianteCifrato,datiproprietario,
opzionale1,opzionale2,opzionale3,documento );



{ --- Scrittura ******* di Collegamento --- }
Ini := TTecnoSysIniFile.Create( FileIni );

{ --- Dump Risposta --- }
Ini.WriteString( _SysTs_Sec_O,'Protocollo',Ricevuta.protocollo );
Ini.WriteString( _SysTs_Sec_O,'dataAccoglienza',Ricevuta.dataAccoglienza );
Ini.WriteString( _SysTs_Sec_O,'nomeFileAllegato',Ricevuta.nomeFileAllegato );
Ini.WriteString(
_SysTs_Sec_O,'dimensioneFileAllegato',Ricevuta.dimensioneFileAllegato );
Ini.WriteString( _SysTs_Sec_O,'codiceEsito',Ricevuta.codiceEsito );
Ini.WriteString( _SysTs_Sec_O,'descrizioneEsito',Ricevuta.descrizioneEsito );
Ini.WriteString( _SysTs_Sec_O,'idErrore',Ricevuta.idErrore );

{ --- Libera --- }
Ini.Free;

end;
Luigi Siciliano 1 Feb 2017 09:14
Posso chiederti quale versione di delphi utilizzi?

Io utilizzo Delphi2010 ed anche con il tuo codice non riesco ugualmente
a connettermi :( ottengo lo stesso errore.

Grazie.

Ciao.
alessandrob 1 Feb 2017 12:15
Il giorno mercoledì 1 febbraio 2017 09:13:55 UTC+1, Luigi Siciliano ha scritto:
> Posso chiederti quale versione di delphi utilizzi?
>
> Io utilizzo Delphi2010 ed anche con il tuo codice non riesco ugualmente
> a connettermi :( ottengo lo stesso errore.
>
> Grazie.
>
> Ciao.

Io ho un sistema un po' ibrido...
La procedura che genera il ******* (quindi la parte gestionale) è scritta
ancora con il vecchio Delphi5

La procedura che ho utilizzato per la connessione con il webservice è stata
scritta verso la fine del 2015 e a suo tempo avevo utilizzato Delphi XE7

Ora sto lavorando con Delphi RX1 (10.1 Berlin, non ho ancora installato la
versione 10.2), ma non ho provato a ricompilare la procedura di connessione al
webservice

Sto anche provando la beta della nuova versione Godzilla

Ecco anche spiegato il motivo dei ******* di appoggio...

Ciao
Luigi Siciliano 1 Feb 2017 13:05
Il 01/02/2017 12.15, alessandrob ha scritto:
>
> La procedura che ho utilizzato per la connessione con il webservice è stata
scritta verso la fine del 2015 e a suo tempo avevo utilizzato Delphi XE7
>
Allora potrebbe essere la versione di Delphi che utilizzo (Delphi2010)
che potrebbe essere troppo vecchia.

Grazie.

Ciao.
Daniele 2 Feb 2017 10:34
Ciao Luigi,
grazie a te mi sto appassionando a questo argomento .....
Naturalmente grazie anche ad alessandrob

> Io utilizzo Delphi2010 ed anche con il tuo codice non riesco ugualmente a
> connettermi :( ottengo lo stesso errore.
Scusami, non puoi utilizzare paro paro il codice di alessandrob per fare i
tuoi test perche'
- il codice non e' completo
- e' riferito alle sue esigenze.

Quello fornito e' un punto di partenza.
La parte interessante di quel codice, e che sono curioso come pochi di
sapere com'e', e' la

DoHTTPRIOHTTPWebNodeBeforePost

che pero' credo sia molto close (eheheheh).

Per il resto e' tutto ben spiegato.

Per riassumere, tieni presente da una scala da 0-10 il mio livello
e' -qualcosa, devi trovare da qualche parte in delphi2010 l'importatore
wsdl.
Il ******* da importare e' InvioTelematicoSpeseSanitarie730p.wsdl.
Una volta importato (fa tutto delphi) hai esposto (in ordine di
presentazione del ******* .pas)
- RicevutaInvio
- Proprietario
e
InvioTelematicoSS730pMtom = interface(IInvokable)
['{1F58756D-A2E0-C47D-0817-8E685DCE51B1}']
function inviaFileMtom(const nomeFileAllegato: tipoNomeFileAllegato;
const pincodeInvianteCifrato: string; const datiProprietario: proprietario;
const opzionale1: string; const opzionale2: string; const opzionale3:
string;
const documento: TByteDynArray): ricevutaInvio;
stdcall;
end;
function GetInvioTelematicoSS730pMtom(UseWSDL: Boolean=System.False; Addr:
string=''; HTTPRIO: THTTPRIO = nil): InvioTelematicoSS730pMtom;

Nel codice di alessandrob hai

if TargetTest
then F730 := GetInvioTelematicoSS730pMtom(
False,_Deb_SistemaTs_Send,HTTPRIO )
else F730 := GetInvioTelematicoSS730pMtom(
False,_Prd_SistemaTs_Send,HTTPRIO );

Come vedi se e' un test usa il link test altrimenti quello vero della sogei.

Infine, hai a disposizione il *******
InvioTelematicoSpeseSanitarie730p_schema1.xsd

che ti permette di capire come dev'eesere fatto il ******* da inviare.

Scusami per la lungaggine.

Ciao

Daniele
Daniele 2 Feb 2017 10:44
Ciao alessandro,
in passato ho dovuto usare dei webservice, pero' in quei casi c'era
sempre un wsdl per accettare il login.
Se andava male, restituiva gli errori del caso.

Invece, in questo caso, il login come viene fatto ?
Ho visionato i vari ******* xml (anche i wsdl) ma non riesco a capire (o meglio
non trovo la parte dedicata al login).

Puoi dare qualche delucidazione?

Grazie

Ciao

Daniele

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.