PureBasic

Forums PureBasic
Nous sommes le Jeu 13/Déc/2018 2:36

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 
Auteur Message
 Sujet du message: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Mar 02/Oct/2018 13:45 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1432
(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:
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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Mer 03/Oct/2018 20:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6567
Localisation: Isere
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Jeu 04/Oct/2018 7:35 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1432
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/eurofxref/eurofxref-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_Services_Description_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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Ven 05/Oct/2018 0:51 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3220
, 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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Ven 05/Oct/2018 16:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6567
Localisation: Isere
Citation:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Ven 05/Oct/2018 17:13 
Hors ligne

Inscription: Jeu 05/Fév/2009 17:58
Messages: 844
Merci Marc pour le partage
Bonjour a KCC et Ollivier au passage


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Ven 05/Oct/2018 18:16 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6567
Localisation: Isere
:wink:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Dim 25/Nov/2018 16:51 
Hors ligne

Inscription: Mer 02/Juin/2010 12:41
Messages: 23
Ç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:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Mar 27/Nov/2018 8:36 
Hors ligne

Inscription: Sam 23/Fév/2008 17:58
Messages: 537
Bonjour Marc56

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

Code:
  Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_ErrorCode)

par
Code:
   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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: WebServices avec PB (5.70) HTTPRequest()
MessagePosté: Mar 27/Nov/2018 8:41 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1432
PAPIPP a écrit:
Bonjour Marc56
J'ai à la suite d'une erreur de constante non trouvée remplacé la ligne suivante :
Code:
  Define HTTP_Code$ = HTTPInfo(HTTPRequest, #PB_HTTP_ErrorCode)
par
Code:
   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/viewtopic.php?p=528226#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:


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye