link-it / govway

API Gateway per la Pubblica Amministrazione italiana
https://govway.org
GNU General Public License v3.0
55 stars 11 forks source link

Utilizzo servizi di quadratura #81

Closed marcomarsala closed 3 years ago

marcomarsala commented 3 years ago

Ho configurato all'interno di GovWay il servizio di quadratura per il flusso di ricezione (WSDL qui: https://www.fatturapa.gov.it/it/norme-e-regole/DocumentazioneSDI/), effettuando i seguenti passi:

sotto il profilo API Gateway;:

  1. creata un'API, sotto il profilo API Gateway, importando il WSDL e allegando l'XSD dei tipi;
  2. creato un Soggetto CentroServiziFatturaPA
  3. creato un Applicativo per l'autenticazione http-basic con username e password
  4. creata una Fruizione SdIQuadraturaFlussoRicezione associata a Soggetto e Applicativo di cui sopra.

Chiamo in questo modo il metodo per richiedere un report di quadratura:

curl -X POST -H "Content-Type: application/soap+xml" --basic --user "____" -k "https://____/govway/out/APP/CentroServiziFatturaPA/SdIQuadraturaFlussoRicezione/v1/richiestaReportQuadraturaFlussoRicezioneB2B" -s -i \
-d '<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Header/>
    <soap12:Body>
        <richiestaReportQuadraturaFlussoRicezioneB2B>
            <DataDa>2021-06-01</DataDa>
            <DataA>2021-06-08</DataA>
        </richiestaReportQuadraturaFlussoRicezioneB2B>
    </soap12:Body>
</soap12:Envelope>'

ma ricevo i seguenti errori.

Fault ingresso:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <soapenv:Fault xmlns:axis2ns10373="http://www.w3.org/2003/05/soap-envelope">
            <soapenv:Code>
                <soapenv:Value>axis2ns10373:Server</soapenv:Value>
            </soapenv:Code>
            <soapenv:Reason>
                <soapenv:Text xml:lang="en-US">Internal Error</soapenv:Text>
            </soapenv:Reason>
            <soapenv:Detail/>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

Fault uscita:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <soapenv:Fault xmlns:axis2ns10373="http://www.w3.org/2003/05/soap-envelope">
            <soapenv:Code>
                <soapenv:Value>axis2ns10373:Server</soapenv:Value>
            </soapenv:Code>
            <soapenv:Reason>
                <soapenv:Text xml:lang="en-US">Internal Error</soapenv:Text>
            </soapenv:Reason>
            <soapenv:Detail>
                <problem xmlns="urn:ietf:rfc:7807">
                    <type>https://httpstatuses.com/500</type>
                    <title>Internal Server Error</title>
                    <status>500</status>
                    <detail>Servizio Applicativo non disponibile</detail>
                    <govway_id>7f491173-4458-4019-84ac-5632b428d6d6</govway_id>
                    <govway_status>integration:516</govway_status>
                </problem>
            </soapenv:Detail>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

Ho difficoltà a capire se l'errore si verifica su GovWay o sul Sistema di Interscambio. Come posso effettuare correttamente la chiamata?

andreapoli commented 3 years ago

L'errore viene generato dal Sistema di Interscambio.

Per comprendere meglio il flusso puoi esaminare i diagnostici emessi dal gateway, accedendo al dettaglio della transazione nella console di monitoraggio. Dovresti trovare l'evidenza che stai contattando l'endpoint remoto da cui ricevi il Fault riportato nella mail.

marcomarsala commented 3 years ago

Grazie, trovo questo:

Riscontrato errore durante l'inoltro del Messaggio di cooperazione con identificativo [9d12d685-73ec-4903-bd92-9490d08126cc] inviato alla parte destinataria [gw/CentroServiziFatturaPA] mediante connettore [https] (location: https://servizi.fatturapa.it/quadratura-flusso-ricezione): errore di trasporto, codice 500 (<soapenv:Fault xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:axis2ns10373="http://www.w3.org/2003/05/soap-envelope"><soapenv:Code><soapenv:Value>axis2ns10373:Server</soapenv:Value></soapenv:Code><soapenv:Reason><soapenv:Text xml:lang="en-US">Internal Error</soapenv:Text></soapenv:Reason><soapenv:Detail/></soapenv:Fault>)

che non mi dice nulla su quale sia il problema. Noti qualche errore nella mia chiamata?

andreapoli commented 3 years ago

Ad una prima vista, mi sembra che la richiesta non sia conforme al wsdl.

Prova ad utilizzare una richiesta simile alla seguente:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:types="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/QuadraturaWS/v1.0/types">
   <soapenv:Header/>
   <soapenv:Body>
      <types:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
         <DataDa>2006-05-04</DataDa>
         <DataA>2006-05-04</DataA>
      </types:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
   </soapenv:Body>
</soapenv:Envelope>

Se ottieni ancora errore, ti suggerisco di chiedere supporto al Sistema di Interscambio.

marcomarsala commented 3 years ago

Ho chiesto supporto al Sistema di Interscambio, che mi ha indicato una request secondo loro corretta:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/QuadraturaWS/v1.0/types">
<soapenv:Header/>
<soapenv:Body>
<typ:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
<DataDa>2020-10-13</DataDa>
<DataA>2020-10-14</DataA>
</typ:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
</soapenv:Body>
</soapenv:Envelope>

ma ricevo da GovWay l'errore SOAP Envelope contiene un namespace (Impossibile recuperare il valore del namespace) diverso da quello atteso per messaggi Soap-1.2 (http://www.w3.org/2003/05/soap-envelope). Come si può evitare? Modificando il namespace come indicato dal messaggio di errore, anche in questo caso SDI risponde con un HTTP 500 Internal Error come prima. Sto sbagliando qualcosa o devo risentirli?

andreapoli commented 3 years ago

La request che ti hanno indicato è uguale a quella che ti avevo suggerito :-)

Il servizio di quadratura è SOAP 1.1 mentre ho visto adesso dal comando curl riportato in testa all'issue che lo stai indirizzando tramite un Content-Type associato a SOAP 1.2.

Prova a sostituire la parte

-H "Content-Type: application/soap+xml"

con:

-H "Content-Type: text/xml"

marcomarsala commented 3 years ago

Funziona :) Riporto di seguito la richiesta funzionante.

curl -X POST -H "Content-Type: text/xml" --basic --user "marco:Fragola0" -k "https://sdi-attive-1.fatturaelettronica-app.it/govway/out/APP/CentroServiziFatturaPA/SdIQuadraturaFlussoRicezione/v1" -H 'SOAPAction: richiestaReportQuadraturaFlussoRicezioneB2B' -s -i -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:types="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/QuadraturaWS/v1.0/types">
   <soapenv:Header/>
   <soapenv:Body>
      <types:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
         <DataDa>2021-06-01</DataDa>
         <DataA>2021-06-08</DataA>
      </types:RichiestaReportQuadraturaFlussoRicezioneB2BRequest>
   </soapenv:Body>
</soapenv:Envelope>'
marcomarsala commented 3 years ago

Per il download del report di quadratura, che il metodo scaricoReportQuadraturaFlussoRicezione mi restituirà in formato base64, c'è qualche funzionalità di GovWay che permette di estrarlo automaticamente dalla response SOAP?

andreapoli commented 3 years ago

Puoi utilizzare le funzionalità di trasformazione

Attivando una trasformazione della risposta, puoi ad esempio definire un freemarker template che individua tramite una espressione xpath l'elemento che contiene il report, effettua la decodifica base64 e utilizza il contenuto decodificato per generare una nuova risposta soap da ritornare al client.

Le funzionalità di trasformazioni sono state riviste nelle ultime versioni; attenzione quindi a che versione del software stai utilizzando.

marcomarsala commented 3 years ago

Grazie, sono riuscito a estrarre il file. Ho visto comunque che la risposta è in formato xml+xop, quindi il file zip mi arriva già in formato binario, non in base64 come indica la documentazione del servizio SdiCoop.

HTTP/1.1 200 OK
Date: Wed, 09 Jun 2021 00:34:37 GMT
Server: GovWay
X-Frame-Options: SAMEORIGIN
GovWay-Message-ID: 7b32b90d-1a41-42af-ad86-577ad1c0ce42
GovWay-Transaction-ID: 13a61c8e-1f35-4104-bac0-b90d7a5e6a31
Content-Type: Multipart/Related; boundary="----=_Part_445462_1198743256.1624431131502";   type="application/xop+xml"; start-info="text/xml"
Transfer-Encoding: chunked

------=_Part_445462_1198743256.1624431131502
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.14ce8df43f000c37b3b5512f412ca458ba62754dc1495936@apache.org>

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><a:ScaricoReportQuadraturaFlussoRicezioneResponse xmlns:a="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/QuadraturaWS/v1.0/types"><Stato>SR03</Stato><File><NomeFile>RQ_01021160328_00000005P1.zip</NomeFile><File><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:64ce8df43f000c37b3b5512f412ca458ba62754dc1495936@apache.org"/></File></File><DataOraProduzione>2021-06-23T08:01:35.000+02:00</DataOraProduzione></a:ScaricoReportQuadraturaFlussoRicezioneResponse></soapenv:Body></soapenv:Envelope>
------=_Part_445462_1198743256.1624431131502
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <64ce8df43f000c37b3b5512f412ca458ba62754dc1495936@apache.org>

Sono riuscito banalmente a estrarlo redirigendo l'output di curl su un file .zip e togliendo la parte iniziale. Anche il comando unzip di Linux non si lamenta del testo extra all'inizio (pur segnalandolo con un warning) e consente comunque di scompattare il csv contenuto. Per fare una cosa più pulita, con le trasformazioni avrei potuto gestire anche questo tipo di response?

Invece, per inviare il file CSV, con gli ID di cui chiedo il reinoltro, al metodo richiestaReinoltroFlussoRicezioneFileFattura, come mi conviene procedere?

andreapoli commented 3 years ago

Per quanto concerne l'estrazione dalla risposta, le trasformazioni ti consentono di accedere direttamente ai vari contenuti del messaggio, compresi i singoli attachments, come potrai riscontrare seguendo le indicazioni della documentazione. Essendo però una API SOAP il template deve generare una struttura xml al cui interno puoi racchiudere il csv estratto dall'attachments come valore di un elemento (magari con la formula CDATA), in modo che sia utilizzabile all'interno di una struttura soap da ritornare al client. Tanto premesso se hai trovato un modo per processare la risposta lato client, forse non ti conviene attivare una trasformazione che come ovvio va progettata e ha un costo in termini sia di memoria che di latenza introdotta dal gateway (costo della trasformazione).

Per l'invio puoi utilizzare la funzionalità di packaging mtom.