Italian community of Lazarus and Free Pascal

Programmazione => Lazarus e il web => Topic aperto da: Legolas - Maggio 30, 2014, 04:40:12 pm

Titolo: Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Legolas - Maggio 30, 2014, 04:40:12 pm
Ciao a tutti :D

Dopo un periodo di "scarico" vorrei riprendere a pastrugnare con Lazarus, magari cercando di imparare qualcosa di nuovo.

Avrei in mente un progettino che dovrebbe interrogare gli archivi di Google tramite SOAP e WSDL e, dopo avere interpretato i dati raccolti, restituirli in una grid.

Per ora sono partito da qui: http://wiki.lazarus.freepascal.org/Web_Service_Toolkit (http://wiki.lazarus.freepascal.org/Web_Service_Toolkit) e ho potuto vedere che l'importer wsdl funziona abbastanza bene. Per ora sono fermo lì  ;D

Qualcuno di voi ha mai avuto a che fare con questa tecnologia? E, nel caso specifico, mai provato a interfacciarsi con google? Problematiche affrontate?

Insomma, accetto qualsiasi suggerimento  ;)

Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: xinyiman - Maggio 30, 2014, 07:01:50 pm
Non conosco questa tecnologia...di cosa si tratta?
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: nomorelogic - Maggio 30, 2014, 07:20:52 pm
Tempo fa ho fatto qualcosa per eBay, si tratta sempre di web services, però avevo trovato una libreria a pagamento e l'ho acquistata perchè le api eBay sono mostruose e non avevo voglia di impazzire.

Con google non ho esperienza.

L'unico consiglio che ti voglio dare è di vedere se ararat synapse offre qualcosa.
Il motivo è semplice, di solito quando si lavora con i web services si ha a che fare con non-blocking socket. Teoria molto bella ma dopo l'esperienza con eBay mi sono drasticamente convertito al blocking socket!

Immagina di lanciare più di una ricerca contemporaneamente, dopo un po' arrivano un po' di risposte, a casaccio, tutte insieme...
Secondo me il multithreading deve essere fatto con i thread e blocking-sockets. Programmazione molto più lineare e pulita: mi riferisco ad esempio alla possibilità di usare try...except e/o try...finally in modo sicuro (e scusa se è poco).
Ci sono poi altri vantaggi tipo la possibilità di killare i thread e così via. Con i non-blocking sockets non usi i thread ma si torna un po' allo spaghetti programming :D

Vabbè, è una mia opinione, condivisibile o no. ;)


Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Stilgar - Giugno 02, 2014, 10:47:50 pm
WSDL
Non è altro che un descrittore.
Un xml ... alla fine ;) http://www.w3.org/TR/wsdl
SOAP .. idem :D
http://it.wikipedia.org/wiki/SOAP

(I link sono per xinyiman)
"Tencologie" webbe ...

Stilgar
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: xinyiman - Giugno 03, 2014, 10:36:15 am
WSDL
Non è altro che un descrittore.
Un xml ... alla fine ;) http://www.w3.org/TR/wsdl
SOAP .. idem :D
http://it.wikipedia.org/wiki/SOAP

(I link sono per xinyiman)
"Tencologie" webbe ...

Stilgar

Grazie Stilgar :)
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Legolas - Giugno 03, 2014, 05:46:57 pm
Rispondo solo ora perché mi sono preso un week-end in famiglia lontano da tutto (l'unico contatto con internet era Youtube per i cartoni di Peppa Pig e della Pimpa per il pupo, che altrimenti non mangia...  ::) ;D )

Comunque grazie! Ho cercato un po' in rete e ho trovato un articolo (http://www.drbob42.com/examine/examinE2.htm) per Delphi XE2 e, dopo qualche affanno, sono riuscito a farlo funzionare anche con Lazarus. Si tratta di un semplice programmino che controlla la validità del VAT dei membri di uno Stato europeo.

Occorre prima di tutto generare le unit dal file WSDL disponibile qui:
http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl (http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl)
che, grazie all'aiuto di WST è un'operazione da un paio di click :D

Il progetto richiede un tedit (edVAT) e un tbutton (btnVAT). Bisogna aggiungere wst_synapse e wst_core tra i packages richiesti dal progetto, oltre che aggiungere tra gli uses le unit generate da WST.


Senza dilungarmi troppo, per chi fosse interessato, ecco il codice:
Codice: delphi [Seleziona]

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  checkVatService, checkVatService_proxy,
  urn_ec_europa_eu_taxud_vies_services_checkVat_types,
  synapse_http_protocol;

type

  { TForm1 }

  TForm1 = class(TForm)
    btnVAT: TButton;
    edVAT: TEdit;
    procedure btnVATClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnVATClick(Sender: TObject);
var
  WS: checkVatPortType;
  inp: checkVat_Type;
  outp: checkVatResponse;
begin
  SYNAPSE_RegisterHTTP_Transport();
  WS := wst_CreateInstance_checkVatPortType();
  inp := checkVat_Type.Create;
  try
    inp.countryCode := Copy(edVAT.Text,1,Pos(#32,edVAT.Text)-1);
    inp.vatNumber := Copy(edVAT.Text,Pos(#32,edVAT.Text)+1,255);
    outp := WS.checkVat(inp);
    if outp.valid then
      ShowMessage('OK: ' + outp.name + #13#10 + outp.address)
    else ShowMessage(outp.vatNumber + ' not OK')
  finally
    inp.Free;
    outp.Free
  end
end;

end.



E' solo un inizio, ma ora credo di aver capito come funziona il tutto :)
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 24, 2023, 08:13:08 pm
Salve, scusate sono nuovo in questo forum, ma sto cercando di imparare a programmare in Lazarus, avevo letto l'articolo del Dr. Bob's riguardo l'incorporazione del VIES in Delphi, poi per fortuna ho trovato la versione in lazarus proposta da Legolas ed ho eseguito le istruzioni fedelmente. Alla fine quando cerco di compilare il progetto mi da sempre il seguente errore:"checkVatService_proxy.pas(...)Error:Identifier not found "urn_ec_europa_eu_taxud_vies_services_checkVat_types" e successivamente: checkVatService_proxy.pas(...) Error: interface type expected, but got "<erroneus type>", non trova quell'identificatore anche se c'è. Non capisco.
Grazie per l'attenzione e scusate in anticipo se ho sbagliato qualcosa.
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: DragoRosso - Giugno 24, 2023, 09:03:36 pm
Ripartiamo da zero.

Prima cosa devi scaricare il file "checkVatService.wsdl" dal link indicato (http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl (http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl)

Poi dal OPL (Online Package Manager) devi scaricare ed installare il componente WST con tutti i suoi collegati.

Ora possiamo continuare.

Dalla voce di menu "Progetto/Web Services Toolkit" scegli "Import WDSL file" ti si aprirà un pagina e imposta il file di input (scaricato prima) e la directory dove verranno generati i wrapper pascal.

Se tutto OK, allora hai tutto.

PER USARE I WRAPPER GENERATI, vai nel menu "Progetto/Opzioni di progetto" e sotto "Opzioni Compilatore/Percorsi" devi aggiungere  la path dove ci sono i wrapper appena generati nella prima linea a destra "Altri file unit (-Fu):".

Ciao
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: DragoRosso - Giugno 24, 2023, 09:53:00 pm
Aggiornamento, devi portare due modifiche ai wrapper creati.

Nel file "checkvatService_proxy.pas" alla riga 19 devi eseguire la sostituzione come indicato qui sotto:

Codice: [Seleziona]
  
//Dichiarazione orignale
  //TcheckVatPortType_Proxy=class(TBaseProxy,urn_ec_europa_eu_taxud_vies_services_checkVat_types.checkVatPortType,urn_ec_europa_eu_taxud_vies_services_checkVat_types.checkVatPortTypeEasy)

//Dichiarazione corretta
  TcheckVatPortType_Proxy=class(TBaseProxy, checkVatService.checkVatPortType, CheckVatService.checkVatPortTypeEasy)

e alla riga 69 (o giù di li) sempre dello stesso file:

Codice: [Seleziona]
class function TcheckVatPortType_Proxy.GetServiceType() : PTypeInfo;
begin
  result := TypeInfo(checkVatService.checkVatPortType);
end;

Ultima cosa: l'immisione della partita IVA è:

 codice paese (le due lettere internazionali, per l'Italia è IT)
 SPAZIO
 PARTITA IVA

Ciao
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 24, 2023, 10:11:55 pm
Grazie infinite per la sollecita risposta, ma avevo già fatto quasi tutto come hai detto, non avevo collegato soltanto i wrapper generati con l'opzione "Compilatore/Percorsi", ma li avevo riposti nella stessa dir del progetto e li avevo lanciati manualmente. Comunque anche così ottengo sempre i 2 errori che avevo detto nel precedente nella unit checkVatService_proxy.
Grazie comunque e se vi sovviene altro alla soluzione del problema ve nesarei grato.
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: DragoRosso - Giugno 24, 2023, 10:41:49 pm
Questo è il progetto completo perfettamente funzionante in Windows 64 bit.

E' implementato con Indy, se non usi Indy ma Synapse basta che togli i riferimenti a Indy (Uses e Prima riga dell'evento del bottone) e ripristini quelli di Synapse.

In Analizzatore Progetti hai un riferimento  a wst_Indy, togli quello ed inserisci wst_Synapse.

Ciao
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 24, 2023, 10:43:41 pm
fatto ma ora alla riga 19 segna comunque errore e mi dice Error: Identifier not found "CheckVatService"  ed Error: interface type expected, but got "<erroneus type>"
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: DragoRosso - Giugno 24, 2023, 10:46:12 pm
Il progetto che ti ho postato è perfettamente funzionante.

Che versione di Lazarus / FPC usi ? Che SO usi ?
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 25, 2023, 06:48:39 am
ok grazie infinite, così funziona perfettamente.
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 25, 2023, 06:50:05 am
Comunque lazarus v.2.2.6, S.O Windows 11 versione 22H2
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: Ettore Cicinelli - Giugno 28, 2023, 07:49:50 am
Buondì, potrebbe tornare utile questa modifica che ho apportato al TButton, considerando che la dimensione massima della partita IVA europea è di 12 cifre e che il codice ISO2 della nazione è di 2 cifre, togliendo lo spazio tra l'iso2 e il vat code il sorgente verrebbe così modificato:
Codice: [Seleziona]
procedure TForm1.btnVATClick(Sender: TObject);
var
  WS: checkVatPortType;
  inp: checkVat_Type;
  outp: checkVatResponse;
begin
  if edVAT.Text = '' then Exit;
  if Length(edVAT.Text) > 14 then Exit;
  INDY_RegisterHTTP_Transport();
  WS :=  wst_CreateInstance_checkVatPortType();
  inp := checkVat_Type.Create;
  try
    inp.countryCode := Copy(edVAT.Text,1,2);
    inp.vatNumber := Copy(edVAT.Text,3);
      outp := WS.checkVat(inp);
     if outp.valid then
        ShowMessage('P.IVA valida: ' + outp.name + #13#10 + outp.address)
     else
         ShowMessage(outp.vatNumber + ' P.IVA non valida');
     outp.Free;
  finally
    inp.Free;
  end;
end;                   
l'output.free l'ho spostato su subito dopo lo showmessage, in modo che se si dovesse generare un errore per errata digitazione o lasciando vuoto il campo dopo il return il programma non smetta di funzionare.
Spero che ciò sia utile. Ringrazio DragoRosso, perchè senza di lui non sarei giunto al risultato.
Titolo: Re:Consumare un webservice con Lazarus utilizzando SOAP e WSDL
Inserito da: slapshot - Febbraio 13, 2024, 11:40:14 am
Grazie per questo thread iniziato nel 2014 e quasi concluso nel 2024. Non sviluppo con Lazarus (e con il resto del mondo per ciò che importa) da secoli, e vorrei sviluppare una console app per scaricare un file da un webservice. Inizio da qui, grazie ancora.