WebServices avec PB (5.70) HTTPRequest()

Informations pour bien débuter en PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

WebServices avec PB (5.70) HTTPRequest()

Message par Marc56 »

(Petit didacticiel à éventuellement mettre dans le topic débutant ?)

Avec PureBasic 5.70 Fred nous apporte une nouvelle fonction à laquelle on ne s'attendait pas, mais qui est très utile: HTTPRequest() Cette fonction n'est pas encore documentée dans l'aide, donc en attendant, je me lance dans ce petit tuto simplifié.

À quoi cela sert-il ? Tout simplement à utiliser les WebServices
Oui, mais, les WebServices, c'est quoi ?
Cette technique existe depuis très longtemps, mais est souvent expliquée d'une manière incompréhensible (fouillis de noms et de normes)

En quelque mots: Un WebServices fonctionne comme une API mais exploitée au travers du protocole HTTP.
C'est tout :wink:

Perso, j’appelle ça un distributeur automatique de données. Des tas d'applications utilisent ce système, notamment les applis sur les téléphones, par exemple pour avoir des infos sur les horaires de bus.

Techniquement, on envoie un formulaire (vers un serveur HTTP) et on reçoit la réponse sous forme d'un flux (le plus souvent XML ou JSON)
Envoi et réception se font sans navigateur. Une question, une réponse. Pas de connexion persistante (fonctionnement sans état)

Il y a plusieurs façons d'envoyer, de recevoir (et de faire d'autres choses)

Je parlerais ici de deux méthodes d'envoi, qui sont les même que celles de formulaires
GET : Les données sont envoyées dans l'URl http://.... ? .... & ... = ... & ...
POST: Les données sont envoyées dans l'environnement

Avantages + et inconvénients -
GET
+ Une seule ligne, donc on peut bookmarquer
- Il faut encoder l'URl à cause des espaces et des accents
- Limitation de la longueur
- Les mots de passe sont dans l'URl

POST
+ Taille de données quasi illimitée
+ Pas besoin d'encoder accents, espaces
- On ne bookmarque que l'adresse et pas les données

Un tas de serveur proposent des services, je vais ici faire un exemple en utilisant un serveur qui propose la conversion de monnaies
Le principe est simple, on envoie https://www.ecb.europa.eu/stats/eurofxr ... -daily.xml
Le serveur retourne un flux XML dans HTTPInfo(HTTPRequest, #PB_HTTP_Response)
Il suffit d'extraire la/les données souhaitées

On peut se servir des fonctions XML de PB, mais comme dans ce exemple je ne cherche qu'une seule valeur, ça va plus vite avec les RegEx mais on peut le faire aussi avec les fonctions String.
(hum, c'est aussi parce que j'ai encore du mal à comprendre les fonctions XML et JSON)

Code : Tout sélectionner

EnableExplicit

InitNetwork()

Define HttpRequest = HTTPRequest(#PB_HTTP_Get, "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")

; Le résultat est reçu sous forme de fichier XML, mais pour une seule valeur il est plus facile d'extraire par RegEx.
; Trouver et extraire USD et valeur dans <Cube currency='USD' rate='1.1606'/>

If HttpRequest
    Define HTTP_Data$ = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
    Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_ErrorCode)
    
    If HTTP_Code$ = "200" ; OK
        ; Extraire le code et sa valeur
        If CreateRegularExpression(0, "(USD). rate=.(\d+\.\d+)./")
            If ExamineRegularExpression(0, HTTP_Data$)
                While NextRegularExpressionMatch(0)
                    Debug " 1 " + RegularExpressionGroup(0, 1) + 
                          " = " + RegularExpressionGroup(0, 2) + 
                          " EUR"
                Wend
            Else
                Debug "Pas de valeur"
            EndIf
            FreeRegularExpression(0)    
        Else
            Debug "RegEx KO"
        EndIf
        
        Debug ~"\n\n\n--- Informations sur la transaction"
        Debug "Code réponse du serveur         : " + HTTP_Code$
        Debug "Réponse XML complète du serveur :"
        Debug RSet("", 80, "-") + #CRLF$ + HTTP_Data$ + #CRLF$ + RSet("", 80, "-")
    Else
        Debug "Erreur serveur : " + HTTP_Code$
    EndIf
EndIf

End
Et voilà :wink:
Vous constatez que c'est très rapide, car il n'y a pas de navigateur, de javascript etc, serveur et client ne font donc presque rien.
Cette technique est utilisée de plus en plus même sur des réseau locaux et pour faire communiquer des programmes incompatibles et se nomme alors ESB (Entreprise Service Bus)

Il existe des tas de serveurs, surtout depuis l'ouverture des données.
À chaque fois, il faut aller voir dans la doc quels sont les adresses et le format des données.
Les serveurs de WebServices sont en général gratuit jusqu'à une certaine quantité de requêtes par heure/jour.
Dans certains cas, il faut s'inscrire pour obtenir une clé qu'on met ensuite dans le formulaire.

Enjoy 8)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Kwai chang caine »

Merci de cette explication plus qu'utile et intéressante. 8)
Et comment sait on si on s'adresse à un service plutôt qu'à un site normal, puisque apparemment rien ne l'indique dans l'adresse ? surement en testant cette fonction... (Ou alors j'ai encore rien compris :oops: )
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Marc56 »

Merci KCC, heureux de voir que ça a intéressé au moins une personne :wink:

On ne peut pas savoir si on s'adresse à un webservice ou à un site classique puisque tous les deux utilisent le même protocole HTTP(S)
Mais cela n'a pas d'importance puisqu'on n'appelle jamais un webservice directement par un navigateur.
Soit l'appel est inclus dans une page comme élément, soit il est appelé par un programme (PB ou autre) ou par un script.

Ce n'est pas conçu pour être interactif avec un utilisateur. C'est une question qui appelle une réponse.
Pas d'intermédiaire (navigateur) pour formater la sortie ou interpréter un javascript

Si tu ouvre dans FF le webservice que j'ai donné en exemple au début
https://www.ecb.europa.eu/stats/eurofxr ... -daily.xml
Tu vois juste le retour (un fichier XML)
Si tu regarde la source de la page (CTRL+U) tu vois qu'il n'y a même pas d'entête HTML

Un webservice, c'est comme une API mais qu'on utilise au travers du protocole HTTP
Pour l'utiliser il faut d'abord aller chercher la doc qui indique le format à donner à la requête et sous quelle forme les données seront retournées.
Certains serveurs proposent aussi le "menu" de leurs services sous forme de fichier WSDL
https://fr.wikipedia.org/wiki/Web_Servi ... n_Language

Donc pour en revenir à PureBasic, tu peux l'utiliser pour construire à la fois serveur et client et donc te passer totalement des usine à gaz souvent Java qui sont proposées d'habitude.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Ollivier »

, super ton explication. Il faudrait trouver un exemple assez simple, genre avec Qwant, et l'écrire comme un dialogue entre deux personnes, entre balises code, pour comprendre le côté simple de la chose.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Kwai chang caine »

Merci KCC, heureux de voir que ça a intéressé au moins une personne
De rien Marc, déjà apparement on est 2 maintenant, et en plus sans vouloir faire du lèche pompe binaire, tes sujets sont toujours intéressants pour ma part.
Par contre, soit je comprends pas.... :oops: soit je vois pas si je vais m'en servir.... :wink:

Mais je ne vais rien t'apprendre en te disant qu'en ce moment je suis le groin dans le HTML et toute sa famille jusqu'au genoux :lol:
Et avoir une réponse simple à une question simple...ce serait le rêve dans le monde du WEB
Et en te lisant je me suis dit que ALLELUIA, .... un des pontes du web à quand même compris que bien souvent c'est juste ce genre de réponses que l'on désire, mais pour cela il faut passer par le parsing, l'analyse, le DOM, et tout le toutim pour juste avoir une liste de liens par exemple :|

Le malheur dans tout ça, c'est que je ne connais pas le pourcentage de sites qui ont eu la générosité de créer des services comme tu les expliquent.
Le pied serait qu'un jour ce soit inclus dans le HTML ou JS, etc ...afin que qu'on envoie une demande et que l'on ai ce genre de réponse sans passer par des robots, et des combines qui au final alourdissent le flux du site, car quand quelqu'un désire une liste de quelque chose, la plupart du temps, soit par incapacité... comme "mooooa" :mrgreen: soit par manque de précautions, il doit y aller sans vaseline et défoncer le site de requête pour juste avoir une petite liste, je ne suis pas sûr que le site soit gagnant.

Maintenant presque tout est web, et la récupération de données est une des activités qui est de plus en plus demandée dans les entreprises, c'est pas pour rien que les navigateurs deviennent HEADLESS, et les "SELENIUM" se portent de mieux en mieux.

Donc pour une fois j'ai compris du premier coup, enfin j'espère :oops: , on fait la demande et si il n'y a pas de réponse correcte c'est que y'a pas de service pour ce site :|

Encore merci du partage de ton savoir 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: WebServices avec PB (5.70) HTTPRequest()

Message par MLD »

Merci Marc pour le partage
Bonjour a KCC et Ollivier au passage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Kwai chang caine »

:wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
cowpowah
Messages : 41
Inscription : mer. 02/juin/2010 12:41

Re: WebServices avec PB (5.70) HTTPRequest()

Message par cowpowah »

Ça c'est une super nouvelle! (bon juste quand je viens de terminer mon programme et bataillé avec CURL, mais bon... :mrgreen: )

Prochaine étape, le websocket?? :mrgreen:
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: WebServices avec PB (5.70) HTTPRequest()

Message par PAPIPP »

Bonjour Marc56

J'ai à la suite d'une erreur de constante non trouvée remplacé la ligne suivante :

Code : Tout sélectionner

  Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_ErrorCode)
par

Code : Tout sélectionner

   Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
Est-ce la bonne constante ?

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: WebServices avec PB (5.70) HTTPRequest()

Message par Marc56 »

PAPIPP a écrit :Bonjour Marc56
J'ai à la suite d'une erreur de constante non trouvée remplacé la ligne suivante :

Code : Tout sélectionner

  Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_ErrorCode)
par

Code : Tout sélectionner

   Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
Est-ce la bonne constante ?
A+
Oui, Fred à changé (depuis la 5.70 B3) suite à une suggestion
https://www.purebasic.fr/english/viewto ... 26#p528226
En effet, ErrorCode (texte renvoyé par le serveur) n'est pas forcément une erreur, mais un indicateur d'état.
StatusCode est la dénomination standard (w3c) du message (première ligne du message de retour suivi d'une ligne vide)

:wink:
Répondre