Newsgroup: it.comp.lang.delphi
Titolo: Utilizzo di servizio SOAP con oggetti in risposta

Ciao a tutti,
 
sto implementando una integrazione per la fatturazione elettronica verso il provider che abbiamo scelto come intermediario e per conservazione.
 
Di recente hanno introdotto per alcuni metodi delle chiamate SOAP che restituiscono degli oggetti (array di oggetti) al posto dei soliti array di stringhe.
 
Purtroppo con la versione di Delphi che utilizzo (10.2, update 3) non riesco a ottenere nella risposta gli oggetti.
 
La chiamata avviene normalmente, passando come parametri degli oggetti derivati da TRemotable
 
Anche la risposta è derivata sempre da TRemotable, ma l'array di oggetti risulta sempre vuoto.
 
Questa è la definizione dell'oggetto risposta:
 
  ArrayOfElectronicInvoiceOutcome = array of ElectronicInvoiceOutcome; 
 
  ElectronicInvoiceOutcomeResponse = class(StandardResponse)
  private
    FElectronicInvoiceOutcomes: ArrayOfElectronicInvoiceOutcome;
    FElectronicInvoiceOutcomes_Specified: boolean;
    procedure SetElectronicInvoiceOutcomes(Index: Integer; const AArrayOfElectronicInvoiceOutcome: ArrayOfElectronicInvoiceOutcome);
    function  ElectronicInvoiceOutcomes_Specified(Index: Integer): boolean;
  public
    destructor Destroy; override;
  published
    property ElectronicInvoiceOutcomes: ArrayOfElectronicInvoiceOutcome  Index (IS_OPTN) read FElectronicInvoiceOutcomes write SetElectronicInvoiceOutcomes stored ElectronicInvoiceOutcomes_Specified;
  end;
 
 
 
Questa è la sezione body della risposta (da Delphi):
<soap:Body>
  <GetElectronicInvoiceOutcomesResponse xmlns="
http://tempuri.org/
">
    <GetElectronicInvoiceOutcomesResult>
    <ResultCode>Success</ResultCode>
    <ResultMessage />
    <ElectronicInvoiceOutcomes />
    </GetElectronicInvoiceOutcomesResult>
  </GetElectronicInvoiceOutcomesResponse>
</soap:Body>
 
 
Da test fatti con il provider, i log dal loro lato solo corretti, risulta infatti che la richiesta avviene in modo corretto
 
Utilizzando un altro ambiente per verifica, con la stessa chiamata si ottiene la risposta:
 
<soap:Body>
  <GetElectronicInvoiceOutcomesResponse xmlns="
http://tempuri.org/
">
    <GetElectronicInvoiceOutcomesResult>
    <ResultCode>Success</ResultCode>
    <ResultMessage/>
    <ElectronicInvoiceOutcomes>
      <ElectronicInvoiceOutcome>
        <Id>xxxxx</Id>
        <IdTransazione>xxxxx</IdTransazione>
        <IdCliente>xxxx</IdCliente>
        <IdSdi>xxxx</IdSdi>
        <IsImported>xxxx</IsImported>
        <DataCreazione>xxxxx</DataCreazione>
        <IdSdiEsito>xxxxx</IdSdiEsito>
        <TipoMessaggio>xxx</TipoMessaggio>
        <DescrizioneMessaggio>xxxxxxx</DescrizioneMessaggio>
        <NomeFile>xxxxxx</NomeFile>
        <KeyS3>xxxxx</KeyS3>
        <Codice>xxxxxxxxx</Codice>
        <Descrizione>xxxxxxxxxx</Descrizione>
        <DataPdV xsi:nil="true"/>
        <DataRdV xsi:nil="true"/>
        <DataPdA xsi:nil="true"/>
        <StatoConservazione>xxxxxxxxx</StatoConservazione>
      </ElectronicInvoiceOutcome>
    </ElectronicInvoiceOutcomes>
    </GetElectronicInvoiceOutcomesResult>
  </GetElectronicInvoiceOutcomesResponse>
</soap:Body>
 
 
Qualche suggerimento?

Risolto...
 
L'errore era nell'utilizzo dei parametri di passaggio.
 
Uno di questi è opzionale, ma si tratta di un insieme.
Di conseguenza nel record di chiamata assume un valore (il primo) che viene comunque passato come parametro, portando come risultato ad un insieme vuoto.
 
Modificando il valore a quello corrispondente al record da leggere, l'array di oggetti viene correttamente compilato.
 
Quello che resta come problema (secondario a questo punto), è come poter passare (o meglio non passare) un parametro opzionale presente in un record parametri della chiamata SOAP.
 
Al momento l'unica soluzione che mi viene in mente (suggerita in alcuni form) è intercettare l'evento HTTPRIOBeforeExecute per rimuovere la chiave corrispondente dalla chiamata...
 
Per chi avesse problemi simili, consiglio l'utilizzo di due strumenti:
- SoapUI che consente di testare le chiamate SOAP 
- Fiddler che consente di verificare il traffico HTTPS