Importez USRLE au moyen d'Apache NiFi. Étape 1 - Télécharger des fichiers via HTTPS

Dans l'un des projets, il était nécessaire de transférer le processus d'importation de données de systèmes tiers vers une architecture de microservice. Apache NiFi a été choisi comme outil. Comme première expérimentation, l'importation du registre des services fiscaux fédéraux a été sélectionnée.


Les données USRLE sont publiées sous forme de fichiers XML emballés dans des archives ZIP. Les archives sont disposées quotidiennement sur une ressource https://ftp.egrul.nalog.ru/dans un répertoire séparé pour la date correspondante. Pour l'accès, la clé est # PKCS12.


La tâche qui doit être résolue avec NiFi est de télécharger des fichiers du Service fédéral des impôts et de préparer les données téléchargées pour l'importation dans nos services. Cet article décrit comment implémenter les téléchargements de fichiers.


La source de données


L'obtention des données de l'USRLE s'effectue dans le cadre du service du Service Fiscal Fédéral "Intégration et accès aux bases de données de l'USRLE et de l'USRIP". Une description du modèle d'interaction est présentée ici .


Il s'agit de la ressource du Federal Tax Service, à partir de laquelle vous souhaitez télécharger des fichiers.
https://ftp.egrul.nalog.ru/?dir=EGRUL


Les répertoires avec le suffixe FULL sont le déchargement du registre complet au début de l'année correspondante. Les autres catalogues sont des mises à jour quotidiennes dans le registre. Nous souhaitons télécharger des mises à jour quotidiennes.


Configuration du flux dans Apache NiFi


La tâche du flux est de collecter une liste de fichiers de catalogue avec le téléchargement d'hier, d'obtenir ces fichiers et de les décompresser.


NiFi :

  1. FlowFile,
  2. HTML
  3. HTML ,


FlowFile


FlowFile GenerateFlowFile.


GenerateFlowFile






24 FlowFile fnsEgrulURL. https://ftp.egrul.nalog.ru/?dir=EGRUL/14.04.2020. NiFi Expression Language:

${literal('https://ftp.egrul.nalog.ru/?dir=EGRUL/'):append(${now():toNumber():minus(86400000):format('dd.MM.yyyy')})}

Ceux. la date actuelle est prise et convertie en une représentation numérique de la date. 86 400 000 millisecondes en sont soustraites. Le résultat est converti en une représentation sous forme de chaîne de la date au format jj.MM.aaaa. La date résultante est ajoutée à la partie permanente du lien.

En sortie, nous obtenons un FlowFile de la forme suivante:


Captures d'Ă©cran FlowFile




Récupération du contenu du répertoire


Le processeur InvokeHTTP est utilisé pour obtenir le contenu du répertoire . Il effectue une demande GET en utilisant le lien vers le répertoire avec le téléchargement d'hier. En réponse, le processeur reçoit le code HTML du catalogue et ajoute ce code HTML au FlowFile en tant que contenu.


Captures d'Ă©cran du processeur InvokeHTTP




:
HTTPMethod — GET;
Remote URL — , URL . ${fnsEgrulURL} — FlowFile fnsEgrulURL;
SSL Context Service — SSLContextService , .. HTTPS. #PKCS12 .


FlowFile , , — HTML- .


SSLContextService


SSLContextService




SSLContexService #PKCS12 , , .


cacerts JDK. . https://fns.egrul.nalog.ru , #PKCS12. .



Dans la chaîne de certificats, vous devez sélectionner le service fiscal russe DPC certificat et l' exporter dans .CER le format dans le codage DER . Ensuite, vous devez importer le certificat du fichier reçu dans le référentiel cacerts à l'aide de l'utilitaire keytool . Par exemple, comme ceci:

C:\Program Files\Java\jdk1.8.0_121\bin> keytool -importcert -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts" -file {   .CER}

Le mot de passe par défaut pour cacerts est changeit .

cacerts , NiFi . , Persistent Volume. SSLContextService. PKSC12, cacerts — JKS.



GetHTMLElement, HTML- FlowFile-. ZIP-.


<div id="page-content" class="container">
    <div id="directory-list-header">
        <div class="row">
            <div class="col-md-7 col-sm-6 col-xs-10"></div>
            <div class="col-md-2 col-sm-2 col-xs-2 text-right"></div>
            <div class="col-md-3 col-sm-4 hidden-xs text-right"> </div>
        </div>
    </div>
    <ul id="directory-listing" class="nav nav-pills nav-stacked">
                            <li data-name=".." data-href="https://ftp.egrul.nalog.ru/?dir=EGRUL">
                <a href="https://ftp.egrul.nalog.ru/?dir=EGRUL" class="clearfix" data-name="..">
                    <div class="row">
                        <span class="file-name col-md-7 col-sm-6 col-xs-9">
                            <i class="fa fa-level-up fa-fw"></i>
                            ..                                </span>
                        <span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
                            -                                </span>
                        <span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
                            2020-04-05 22:00:00                                </span>
                    </div>
                </a>
            </li>
                            <li data-name="EGRUL_2020-04-05_1.zip" data-href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip">
                <a href="EGRUL/05.04.2020/EGRUL_2020-04-05_1.zip" class="clearfix" data-name="EGRUL_2020-04-05_1.zip">
                    <div class="row">
                        <span class="file-name col-md-7 col-sm-6 col-xs-9">
                            <i class="fa fa-file-archive-o fa-fw"></i>
                            EGRUL_2020-04-05_1.zip                                </span>
                        <span class="file-size col-md-2 col-sm-2 col-xs-3 text-right">
                            528.78KB                                </span>
                        <span class="file-modified col-md-3 col-sm-4 hidden-xs text-right">
                            2020-04-05 22:00:24                                </span>
                    </div>
                </a>                     
                    <a href="javascript:void(0)" class="file-info-button">
                        <i class="fa fa-info-circle"></i>
                    </a>
            </li>
    </ul>
</div>


GetHTMLElement


:
URL — URL HTML-;
CSS Selector — . li[data-name^=EGRUL] — li, data-name, EGRUL;
Output Type — Attribute — HTML-;
Destination — flowfile-attribute — FlowFile- ( HTMLElement);
Attribute Name — , . abs:${literal('data-href')} — URL (abs:) + data-href , CSS-.


, CSS- FlowFile ZIP- HTMLElement.



InvokeHTTP , HTML- . URL HTMLElement, ZIP-. SSLContextService .


InvokeHTTP


ZIP- FlowFile .



UnpackContent. — ZIP.


Captures d'Ă©cran du processeur UnpackContent


En sortie, le processeur crée un FlowFile pour chaque fichier XML décompressé de l'archive ZIP.


Plus loin...


De plus, chaque XML doit être converti en JSON et ventilé par organisation, car chaque XML contient de 1 à 1 000 instructions de registre. Et à partir de JSON à l'avenir, il sera possible de charger des données dans le stockage SQL ou NoSQL.


La conversion de XML en JSON et AVROSchema est dans l'article suivant.


All Articles