Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue114:tuto2 [2016/11/18 09:22] – d52fr | issue114:tuto2 [2016/11/19 11:39] (Version actuelle) – auntiee |
---|
In the previous part of the series, we covered setting up a small Sqlite database, then building a command-line Free Pascal program to access it. Finally, we integrated the database code into our Free Vision application through a new Dialog type to connect to the database and display data retrieved. In this fourth part of the series, we will connect to the Internet in order to refresh the information in our database directly from the Full Circle Magazine website.** | In the previous part of the series, we covered setting up a small Sqlite database, then building a command-line Free Pascal program to access it. Finally, we integrated the database code into our Free Vision application through a new Dialog type to connect to the database and display data retrieved. In this fourth part of the series, we will connect to the Internet in order to refresh the information in our database directly from the Full Circle Magazine website.** |
| |
Dans cette série d'articles, je construirai une application en mode texte avec FreePascal, en utilisant son interface en mode texte pour l'interaction avec l'utilisateur. Ceci sera combiné avec d'autres technologies, plus modernes, telles que l'accès à une base de données en utilisant SQL et l'accès au Web avec HTTP. Le but final du projet est de démontrer comment Pascal peut être utilisé pour construire une application moderne, tout en évitant le surpoids associé à une interface graphique qui utilise un jeu de gadgets comme GTK ou Qt. | Dans cette série d'articles, je construirai une application en mode texte avec Free Pascal, en utilisant son interface en mode texte pour l'interaction avec l'utilisateur. Ceci sera combiné avec d'autres technologies, plus modernes, telles que l'accès à une base de données en utilisant SQL et l'accès au Web avec HTTP. Le but final du projet est de démontrer comment Pascal peut être utilisé pour construire une application moderne, tout en évitant le surpoids associé à une interface graphique qui utilise un jeu de gadgets comme GTK ou Qt. |
| |
Dans la partir précédente de la série, nous avons couvert le paramétrage d'une petite base de données Sqlite, puis construit un programme Free Pascal en ligne de commande pour y accéder. Enfin, nous avons intégré le code de la base de données dans notre application Free Vision via un nouveau type Dialog pour se connecter à la base de données et afficher les données récupérées. Dans cette quatrième partie de la série, nous nous connecterons à Internet de façon à rafraîchir les information de notre bbase de données directement depuis le site Web du Full Circle Magazine. | Dans la dernière partie de la série, nous avons couvert le paramétrage d'une petite base de données Sqlite, puis construit un programme Free Pascal en ligne de commande pour y accéder. Enfin, nous avons intégré le code de la base de données dans notre application Free Vision via un nouveau type de Dialog pour se connecter à la base de données et afficher les données récupérées. Dans cette quatrième partie de la série, nous nous connecterons à Internet de façon à rafraîchir les informations de notre base de données directement depuis le site Web du Full Circle Magazine. |
| |
**Tools to connect to the network | **Tools to connect to the network |
apt install fp-units-net | apt install fp-units-net |
| |
Ceci nous rendra plusieurs units disponibles, à la fois pour les simples connexions HTTP et pour des scénarios plus complexes comme OpenSSL. Dans notre cas, nous nous connecterons juste à Internet pour extraire le flux RSS de notre magazine favori. Pour cette tache, nous pouvons suivre l'une des différentes stratégies. Une serait de construire notre propre protocole client HTTP, en démarrant à partir des « sockets » (interfaces) nus. Ceci serait probablement faisable et pas très compliqué pour une simple connexion, étant donné la nature du protocole HTTP. Cependant, les choses peuvent devenir un peu plus complexe quand des connexions HTTPS sont requises - comme c'est le cas maintenant pour de nombreux services, comme Google. De plus, l'analyse du code HTTP deviendra vite fastidieuse. C'est là où une seconde stratégie apparaît, qui est d'utiliser la bibliothèque existante pour encapsuler ces taches. Le programmeur de l'application peut ensuite se concentrer sur les vraies données à transférer, laissant les mécanismes de bas niveau à la bibliothèque. | Ceci rendra plusieurs units disponibles, à la fois pour les simples connexions HTTP et pour des scénarios plus complexes comme OpenSSL. Dans notre cas, nous nous connecterons juste à Internet pour extraire le flux RSS de notre magazine favori. Pour cette tâche, nous pouvons suivre différentes stratégies. L'une serait de construire notre propre protocole client HTTP, en démarrant à partir des « sockets » (interfaces) nus. Ceci serait certainement faisable et pas très compliqué pour une simple connexion, étant donné la nature du protocole HTTP. Cependant, les choses peuvent devenir un peu plus complexes quand des connexions HTTPS sont requises - comme c'est le cas maintenant pour de nombreux services, tels que Google. De plus, l'analyse du code HTTP deviendra vite fastidieuse. C'est là où une seconde stratégie apparaît, qui est d'utiliser la bibliothèque existante pour encapsuler ces tâches. Le programmeur de l'application peut ensuite se concentrer sur les vraies données à transférer, laissant les mécanismes de bas niveau à la bibliothèque. |
| |
**The well-known library libcurl is standard in many POSIX environments, and the Free Pascal project has made it available through an appropriate unit. The CURL or “C-URL” (pronounced “see URL”) library is, no doubt, a bit of an overkill for our task, but it is very easy to set up and use. The interested reader can peruse the documentation at the project’s site (https://curl.haxx.se/ ) to find out more. A short extract from the website will help understand what it is capable of doing: | **The well-known library libcurl is standard in many POSIX environments, and the Free Pascal project has made it available through an appropriate unit. The CURL or “C-URL” (pronounced “see URL”) library is, no doubt, a bit of an overkill for our task, but it is very easy to set up and use. The interested reader can peruse the documentation at the project’s site (https://curl.haxx.se/ ) to find out more. A short extract from the website will help understand what it is capable of doing: |
“A free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password authentication, file transfer resume, http proxy tunneling, and more!”** | “A free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password authentication, file transfer resume, http proxy tunneling, and more!”** |
| |
La bibliothèque bien connue libcurl est standard dans de nombreux environnements POSIX et le projet Free Pascal l'a rendue disponible dans une unit appropriée. La bibliothèque CURL ou C-URL (prononcez "si-URL") est, sans aucun doute, un peu surdimensionnée pour notre tache, mais elle est très facile à paramétrer et utiliser. Le lecteur intéressé peut consulter la documentation sur le site du projet (https://curl.haxx.se/) pour en découvrir plus. Un court extrait de ce site Web aidera notre compréhension de ce qu'il est capable de faire : | La bibliothèque bien connue libcurl est standard dans de nombreux environnements POSIX et le projet Free Pascal l'a rendue disponible dans une unit appropriée. La bibliothèque CURL ou C-URL (prononcez "si-URL") est, sans aucun doute, un peu surdimensionnée pour notre tâche, mais elle est très facile à paramétrer et utiliser. Le lecteur intéressé peut consulter la documentation sur le site du projet (https://curl.haxx.se/) pour en apprendre plus. Un court extrait de ce site Web aidera à notre compréhension de ce qu'il est capable de faire : |
| |
Une bilbiothèque de transfert d'URL côté client libre et facile à utiliser, supportant DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl supporte les certificats HTTPS, HTTP POST, HTTP PUT, le téléversement FTP, Kerberos, SPNEGO, le téléversement basé sur le format HTTP, les proxy, les cookies, l'authentification identifiant+mot de passe, la reprise de transfert de fichier, le tunnel par proxy http et plus ! | « Une bibliothèque de transfert d'URL côté client, libre et facile à utiliser, supportant DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP. libcurl supporte les certificats HTTPS, HTTP POST, HTTP PUT, le téléversement FTP, Kerberos, SPNEGO, le téléversement basé sur le format HTTP, les proxy, les cookies, l'authentification identifiant+mot-de-passe, la reprise de transfert de fichier, le tunnel par proxy http, et plus encore ! » |
| |
**However, most Ubuntu installations contain the libcurl library itself, but not the header files. In order to use it in conjunction with a compiled language such as Free Pascal, we will need to install the corresponding header files as well. The actual version may change across distro versions, but in Ubuntu 16.04 and Linux Mint 18 the following command should set you up: | **However, most Ubuntu installations contain the libcurl library itself, but not the header files. In order to use it in conjunction with a compiled language such as Free Pascal, we will need to install the corresponding header files as well. The actual version may change across distro versions, but in Ubuntu 16.04 and Linux Mint 18 the following command should set you up: |
Qu'est-ce que nous téléchargerons du Web ? | Qu'est-ce que nous téléchargerons du Web ? |
| |
Au départ, nous sommes à la recherche d'une liste des publications récentes du Full Circle Magazine. C'est un tache très simple pour un lecteur humain : naviguer simplement jusqu'à la page Web, et lire les articles en choisissant ceux avec le titre « Full Circle Magazine » (par opposition avec « Weekly News ») ou quelque chose d'autre. Cependant, c'est plus difficile pour un programme informatique que pour un humain de la faire, car il doit apprendre tant soit peu à distinguer entre les articles et les éléments d'arrière-plan, les images, etc. Les pages Web modernes sont en fait un assemblage bien complexe d'informations. Aussi, aidons notre programme en utilisant les facilités construites dans un CMS (Content Management System - système de gestion du contenu) moderne tel que Wordpress utilisé par le FCM. L'un d'eux est le flux RSS (Rich Site Summary - Résumé enrichi d'un site). | Au départ, nous sommes à la recherche d'une liste des publications récentes du Full Circle Magazine. C'est une tâche très simple pour un lecteur humain : naviguer simplement jusqu'à la page Web et lire les articles en choisissant ceux avec le titre //Full Circle Magazine// (par opposition à //Weekly News// ou quelque chose d'autre). Cependant, c'est plus difficile à faire pour un programme informatique que pour un humain, car il doit apprendre à distinguer entre les articles et les éléments d'arrière-plan, les images, etc. Les pages Web modernes sont en fait un assemblage bien complexe d'informations. Aussi, aidons notre programme en utilisant les facilités intégrées dans un CMS (Content Management System - système de gestion du contenu) moderne tel que Wordpress utilisé par le FCM. L'un d'eux est le flux RSS (Rich Site Summary - Résumé enrichi d'un site). |
| |
**An RSS feed is a way of querying the site’s database of articles. Most CMS allow us to build a query along several different lines. In the case of FCM, we can use the following query to get a list of all articles: | **An RSS feed is a way of querying the site’s database of articles. Most CMS allow us to build a query along several different lines. In the case of FCM, we can use the following query to get a list of all articles: |
$ curl http://fullcirclemagazine.org/feed/ | less** | $ curl http://fullcirclemagazine.org/feed/ | less** |
| |
Un flux RSS est une façon d'interroger la base de données des articles du site. La plupart des CMS nous permettent de bâtir une requête en plusieurs lignes différentes. Dans le cas du FCM, nous pouvons utiliser la requête suivante pour obtenir la liste de tous les articles : | Un flux RSS est une façon d'interroger la base de données des articles du site. La plupart des CMS nous permettent de bâtir une requête composée de plusieurs façons différentes. Dans le cas du FCM, nous pouvons utiliser la requête suivante pour obtenir la liste de tous les articles : |
http://fullcirclemagazine.org/feed/ | http://fullcirclemagazine.org/feed/ |
| |
Si nous l'ouvrons dans notre navigateur Internet, nous obtiendrons un page formatée car les navigateurs modernes connaissent le code sous-jacent en XML (eXtended Meta Language - Meta-langage étendu) et peuvent l'analyser correctement. Cependant, nous devons savoir que ce qui va transiter dans le réseau devrait ressembler à ce qui est présenté dans l'image ci-dessous. | Si nous l'ouvrons dans notre navigateur Internet, nous obtiendrons un page formatée car les navigateurs modernes connaissent le code sous-jacent en XML (eXtended Meta Language - Meta-langage étendu) et peuvent l'analyser correctement. Cependant, nous devons savoir que ce qui a traversé le réseau ressemble à ce qui est présenté dans l'image ci-dessous. |
| |
Si ça intéresse quelqu'un, j'ai vraiment obtenu la copie d'écran jointe en utilisant la commande CURL elle-même : | Si ça intéresse quelqu'un, j'ai en fait obtenu la copie d'écran jointe en utilisant la commande CURL elle-même : |
| |
$ curl http://fullcirclemagazine.org/feed/ | less | $ curl http://fullcirclemagazine.org/feed/ | less |
This is what we will be using to help our search for new issues.** | This is what we will be using to help our search for new issues.** |
| |
D'autres requêtes peuvent être manipulées de façon similaire. Par exemple, pour localiser tous les articles qui sont étiquetés « podcast », « python », « pascal » etc.: | D'autres requêtes peuvent être manipulées de façon similaire. Par exemple, pour localiser tous les articles qui sont étiquetés « podcast », « python », « pascal » etc. : |
http://fullcirclemagazine.org/tag/podcast/feed/ | http://fullcirclemagazine.org/tag/podcast/feed/ |
| |
http://fullcirclemagazine.org/tag/pascal/feed/ | http://fullcirclemagazine.org/tag/pascal/feed/ |
| |
Ronnie a vraiment inclus une version simplifiée du flux pour le poscast Weekly News : | En fait, Ronnie inclut une version simplifiée du flux pour le podcast Weekly News : |
| |
http://fullcirclemagazine.org/feed/podcast | http://fullcirclemagazine.org/feed/podcast |
| |
Ce mécanisme peut être utilisé pour spécifier les articles publiés par un auteur particulier. Comme les articles informant d'une nouveau numéro du FCM sont invariablement de Ronnie, nous pouvons utiliser cette URL pour les filtrer : | Ce mécanisme peut être utilisé pour spécifier les articles publiés par un auteur en particulier. Comme les articles annonçant un nouveau numéro du FCM sont invariablement de Ronnie, nous pouvons utiliser cette URL pour les filtrer : |
| |
http://fullcirclemagazine.org/author/ronnie-2/feed/ | http://fullcirclemagazine.org/author/ronnie-2/feed/ |
The first variable is simply the URL we will be passing on to libcurl, though in PChar format. Pascal strings were from its origin arrays of 256 bytes. Bytes in positions 1 to 255 held the ASCII codes for each character, while position 0 held the total number of characters in the string. Needless to say, this scheme has several limitations, including the handling of strings with more than 255 characters and using multiple-byte codifications (think Unicode). On the other hand, the C programming language - in which most of the Internet has been developed - traditionally uses null-terminated strings. These are simply an area of contiguous memory long enough to hold the string, and a special null character at its end. Luckily, these can also easily be used in Pascal through the Pchar type, which is simply a pointer to a character.** | The first variable is simply the URL we will be passing on to libcurl, though in PChar format. Pascal strings were from its origin arrays of 256 bytes. Bytes in positions 1 to 255 held the ASCII codes for each character, while position 0 held the total number of characters in the string. Needless to say, this scheme has several limitations, including the handling of strings with more than 255 characters and using multiple-byte codifications (think Unicode). On the other hand, the C programming language - in which most of the Internet has been developed - traditionally uses null-terminated strings. These are simply an area of contiguous memory long enough to hold the string, and a special null character at its end. Luckily, these can also easily be used in Pascal through the Pchar type, which is simply a pointer to a character.** |
| |
Combinaison d'éléments | Combiner des éléments |
| |
À ce point, nous avons un moyen de nous connecter au Web pour télécharger un page unique, à partir de son URL. D'autre part, nous avons une URL spécifique qui nous permet d'obtenir du contenu dynamique construit à partir du CMS du FCM. Mettons cela ensemble dans un programme Pascal de 20 lignes (avec des lignes vides et sous un beau format). D'abord, nous avons besoin d'inclure l'unit et de déclarer deux variables : | À ce stade, nous avons un moyen de nous connecter au Web pour télécharger une page unique, à partir de son URL. En revanche, nous avons une URL spécifique qui nous permet d'obtenir du contenu dynamique construit à partir du CMS du FCM. Mettons cela ensemble dans un programme Pascal de 20 lignes (avec des lignes vides et sous un beau format). D'abord, nous avons besoin d'inclure l'unit et de déclarer deux variables : |
| |
uses | uses |
hCurl : pCurl; | hCurl : pCurl; |
| |
La première variable est simplement l'URL que nous voulons passer à libcurl, dans le format PChar. Depuis l'origine, les chaînes Pascal étaient des tableaux de 256 caractères. Les mots dans les positions 1 à 255 contenaient les codes ASCII de chaque caractère, alors que la position 0 contenait le nombre total de caractères de la chaîne. Inutile de dire que ce schéma a plusieurs limitations, en particulier pour la manipulation des chaînes de plus de 255 caractères et l'utilisation des codifications multi-mots (pensez à l'Unicode). D'autre part, le langage de programmation C- dans lequel la part principale de l'Internet a été développé - utilise traditionnellement des chaînes se terminant par zéro. Elles sont simplement une zone de mémoire contiguë assez longue pour contenir la chaîne, avec un caractère spécial zéro à la fin. Heureusement, elles peuvent être aussi utilisées facilement en Pascal par le type PChar, qui est simplement un pointeur vers un caractère. | La première variable est simplement l'URL que nous voulons passer à libcurl, dans le format PChar. Depuis l'origine, les chaînes Pascal sont des rangées de 256 caractères. Les mots dans les positions 1 à 255 contiennent les codes ASCII de chaque caractère, alors que la position 0 contient le nombre total de caractères de la chaîne. Inutile de dire que ce schéma a plusieurs limitations, en particulier pour la manipulation des chaînes de plus de 255 caractères et l'utilisation des codifications multi-mots (pensez à l'Unicode). D'autre part, le langage de programmation C - dans lequel la majeure partie de l'Internet a été développée - utilise traditionnellement des chaînes se terminant par zéro. Elles sont simplement une zone de mémoire contiguë assez longue pour contenir la chaîne, avec un caractère spécial zéro à la fin. Heureusement, elles peuvent être aussi utilisées facilement en Pascal par le type PChar, qui est simplement un pointeur vers un caractère. |
| |
**The second variable is a pointer to the CURL routine that will handle our connection. The following code has been directly copied from the unit’s example: | **The second variable is a pointer to the CURL routine that will handle our connection. The following code has been directly copied from the unit’s example: |
The complete code of this program is available here: http://pastebin.com/QM9m3jug ** | The complete code of this program is available here: http://pastebin.com/QM9m3jug ** |
| |
La seconde variable est un pointeur vers la routine CURL qui gère notre connexion. le code suivant a été copié directement de l'exemple de l'unit : | La seconde variable est un pointeur vers la routine CURL qui gère notre connexion. Le code suivant a été copié directement de l'exemple de l'unit : |
| |
hCurl:= curl_easy_init; | hCurl:= curl_easy_init; |
end; | end; |
| |
Un processus de gestion est paramétré avec curl_easy_init. Si cela fonctionnait (nous avons accès à une bibliothèque dynamique et assez de mémoire libre), nous pouvons alors paramétrer deux options (une sortie verbeuse à l'écran, l'URL que nous voulons analyser). curl_easy_perform fait le vrai travail de téléchargement de la page et, enfin, curl_easy_cleanup libère la mémoire utilisée. | Un processus de gestion est paramétré avec curl_easy_init. Si cela fonctionne (nous avons accès à une bibliothèque dynamique et assez de mémoire libre), nous pouvons alors paramétrer deux options (une sortie verbeuse à l'écran et l'URL que nous voulons analyser). curl_easy_perform fait le vrai travail de téléchargement de la page et, enfin, curl_easy_cleanup libère la mémoire utilisée. |
| |
Le code complet de ce programme est disponible ici : http://pastebin.com/QM9m3jug | Le code complet de ce programme est disponible ici : http://pastebin.com/QM9m3jug |
begin | begin |
f:=TFileStream.Create('fcm.xml',fmCreate);** | f:=TFileStream.Create('fcm.xml',fmCreate);** |
| |
| Si nous compilons et lançons le programme ci-dessus, nous obtenons simplement l'écho sur l'écran du code XML retourné par le serveur du FCM. Pour faire quelque chose d'utile avec ces données, nous pourrions, par exemple, les écrire dans un fichier. Pour être plus précis, nous avons besoin d'obtenir le gestionnaire de CURL pour qu'il le fasse pour nous. Le processus aura lieu en deux étapes. |
| |
| Dans la première étape, nous allons passer au gestionnaire une fonction de rappel pour transformer la structure de ses données internes en flux de mots. Cette fonction a besoin d'être déclarée avec une syntaxe très précise, car elle sera appelée en fait par le gestionnaire de CURL, qui est écrit en C. En fait, c'est un bon exemple de l'utilisation de plusieurs langages de programmation dans le même objet compilé. |
| |
| Function DoWrite(Ptr : Pointer; Size : size_t; nmemb: size_t; Data : Pointer) : size_t; cdecl; |
| |
| begin |
| DoWrite := TStream(Data).Write(Ptr^,Size*nmemb); |
| end; |
| |
| Dans la seconde étape, nous créerons un nouveau flux de fichier et indiquerons au gestionnaire d'utiliser la fonction DoWrite pour le remplir. Aussi, commencez par créer le TFileStram approprié et ouvrez-le : |
| |
| Var |
| f : TFileStream; |
| |
| begin |
| f:=TFileStream.Create('fcm.xml',fmCreate); |
| |
**Continue by setting up hCurl options as before, but add: | **Continue by setting up hCurl options as before, but add: |
| |
In this part of our series on Free Pascal, we deviated a bit from Free Vision and went into the technical details on how to use the CURL library from Pascal to connect to an RSS feed on FCM’s content management system. At this stage, we know how to connect to the server and download an XML file containing a list of recent articles published on the web page. In the next part of our series, we will see how to parse the XML code to retrieve the information we are aiming for: issue numbers and download URLs.** | In this part of our series on Free Pascal, we deviated a bit from Free Vision and went into the technical details on how to use the CURL library from Pascal to connect to an RSS feed on FCM’s content management system. At this stage, we know how to connect to the server and download an XML file containing a list of recent articles published on the web page. In the next part of our series, we will see how to parse the XML code to retrieve the information we are aiming for: issue numbers and download URLs.** |
| |
| Continuez en paramétrant les options de hCurl comme précédemment et ajoutez : |
| |
| curl_easy_setopt(hCurl,CURLOPT_WRITEFUNCTION,[@DoWrite]); |
| curl_easy_setopt(hCurl,CURLOPT_WRITEDATA,[Pointer(f)]); |
| |
| Les niveaux curl_easy_perform and curl_easy_cleanup prennent la même place que précédemment. N'oubliez pas de fermer le flux de fichiers à la fin du programme : |
| |
| f.Free; |
| |
| Le code complet de ce programme est disponible par ce lien : http://pastebin.com/Ayth2cfK |
| |
| Dans cette partie de notre série sur Free Pascal, nous nous sommes un peu éloignés de Free Vision et sommes rentrés dans des détails techniques sur comment utiliser la bibliothèque CURL à partir de Pascal pour se connecter au flux RSS du CMS du FCM. À ce stade, nous savons comment nous connecter au serveur et télécharger un fichier XML contenant une liste des articles récents publiés sur la page Web. Dans la prochaine partie de notre série, nous regarderons comment analyser le code XML pour récupérer l'information que nous cherchons : numéros de publication et URL de téléchargement. |