HTTPRequest() Envoyer des données à un script Php

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

HTTPRequest() Envoyer des données à un script Php

Message par falsam »

PB Version : 5.70

■ Syntaxe : HTTPRequest( Type, URL$, [, Data$ [, Flags [, Headers()]]] )

- Type #PB_HTTP_Get, #PB_HTTP_Post, Etc ....
- URL$ Domaine et nom du script invoqué

- Data$ Variables qui seront envoyés aux script Php (Falcultatifs)
- Flags 0 pour le moment (Falcultatifs)
- Headers() Map contenant des entêtes HTTP (Falcultatifs)

■ Objectif : Envoyer une structure de contact à un script Php.

1 - Sécuriser le script PHP afin de ne pas pouvoir l'utiliser depuis un navigateur par exemple.
     On se servira de la map Header() pour envoyer une information de sécurisation.
     Le nom de l'application et un numéro de version par exemple.

Code : Tout sélectionner

NewMap Header.s()
Header("User-Agent")   = "Application/5.0.0.1"
Dans le script php on testera cette information

Code : Tout sélectionner

if ($_SERVER['HTTP_USER_AGENT'] == 'Application/5.0.0.1'){
}
2 - Préparer les données de contact à transmettre au script Php.

Code : Tout sélectionner

; Contact
Structure NewContact
  name.s
  age.i
  city.s
EndStructure
Define Contact.NewContact, UserData.s

With Contact
  \name = "John"
  \age = 31
  \city = "New York"
EndWith
La structure de contact sera transmise via un objet JSON. Le code est simple.

Code : Tout sélectionner

If CreateJSON(0)
  InsertJSONStructure(JSONValue(0), @Contact, NewContact)
  UserData = ComposeJSON(0, #PB_JSON_PrettyPrint)
EndIf
Rien de bien compliqué.

3 - Exécuter la requête HTTP

Code : Tout sélectionner

Url.s = "http://s242132022.onlinehome.fr/hr/demojson.php"
HTTPRequest(#PB_HTTP_Post, Url, UserData, 0, Header())
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: HTTPRequest() Envoyer des données à un script Php

Message par falsam »

■ Code PureBasic (demojson.pb) que vous pouvez tester.

Code : Tout sélectionner

EnableExplicit

; Url of the php script
Define Url.s = "http://s242132022.onlinehome.fr/hr/demojson.php"

; Authentication of the transacion. HTTP header to send to the Php script. 
NewMap Header.s()
Header("User-Agent")   = "Application/5.0.0.1"

; Contact
Structure NewContact
  name.s
  age.i
  city.s
EndStructure
Define Contact.NewContact, UserData.s

With Contact
  \name = "John"
  \age = 31
  \city = "New York"
EndWith

; Insert the content of the Structure "Contact" into a JSON object
If CreateJSON(0)
  InsertJSONStructure(JSONValue(0), @Contact, NewContact)
  UserData = ComposeJSON(0, #PB_JSON_PrettyPrint)
EndIf

; Executes the HTTP request
Define Result =  HTTPRequest(#PB_HTTP_Post, Url, UserData, 0, Header())

If Result
  Debug  HTTPInfo(Result, #PB_HTTP_Response )    
  FinishHTTP(Result)
  
Else
  
  Debug "Error"
  Debug HTTPInfo(Result, #PB_HTTP_ErrorCode)
EndIf
■ Script Php (demojson.php) qui va recevoir les données.

Code : Tout sélectionner

<?php
	//Test authentication(Header)
	if ($_SERVER['HTTP_USER_AGENT'] == 'Application/5.0.0.1'){
		echo 'Authorized access' . "\r";
		
		// Receives the json file 
		$userdata = json_decode(file_get_contents('php://input'));
		
		// Return the result
		echo "Hello " . $userdata->name . "\r";
		echo "Your age " . $userdata->age . "\r";
		echo "You live in " . $userdata->city;
		
	} else {
		
		echo 'No authorization. Go away ^-^';
	}
?> 
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: HTTPRequest() Envoyer des données à un script Php

Message par Kwai chang caine »

Maintenant je sais qui je suis et ou j'habite :mrgreen:
Marche nickel, merci FALSAM de cette présentation claire et détaillée, comme dab 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HTTPRequest() Envoyer des données à un script Php

Message par Ar-S »

Merci pour ces exemples, ça m'intéresse beaucoup. Faut que je m'y mettre à cette 5.70.
Je trouve tout de même cette syntaxe étrange

Code : Tout sélectionner

Result =  HTTPRequest(#PB_HTTP_Get
Dans mon esprit ça aurait du avoir la tronche d'un #PB_HTTP_Post vu qu'on envoie quelque chose.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: HTTPRequest() Envoyer des données à un script Php

Message par falsam »

Ar-S a écrit :Dans mon esprit ça aurait du avoir la tronche d'un #PB_HTTP_Post vu qu'on envoie quelque chose.
et #PB_HTTP_Get parce que j'ai des données en retour :mrgreen:

Si ça a une importance pour l'envoie d'un formulaire HTML, je pense que de dans cet exemple ça n'a aucune importance car on ne récupère pas les données avec la méthode PHP $_POST ou $_GET.

J'ai modifié le source PureBasic avec la méthode POST.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: HTTPRequest() Envoyer des données à un script Php

Message par Marc56 »

GET et POST ne sont que des mots clé et ne représentent pas l'action réelle.
Dans les deux cas il peut y avoir retour d'information ou pas. C'est le serveur qui décide.
Par convention, on utilise GET pour une requête qui ne modifie pas les données serveur (ex: appel d'une image) et POST dans le cas contraire.

Avantages (+) et Inconvénients (-) et dans quel cas utiliser plutôt l'une que l'autre

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
- Les données sont conservées dans le cache

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

Référence officielle: RFC 2616 (Chapitre 9.3 et 9.5)

:wink:
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: HTTPRequest() Envoyer des données à un script Php

Message par Fig »

Merci pour l'exemple ! Image
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: HTTPRequest() Envoyer des données à un script Php

Message par microdevweb »

Un grand merci pour ce tuto, qui va me être très utile.

J'ai juste un petit soucis avec les accents

Grand Duché de Luxembourg

aux lieu de Grand Duché de Luxembourg

EDIT : le problème est résolus comme ceci (en PHP)

Code : Tout sélectionner

$name = utf8_decode($userdata->name);
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: HTTPRequest() Envoyer des données à un script Php

Message par microdevweb »

Je me permet de poster la méthode inverse pour récupérer des données d'un de vos sites

Voici un exemple d'un des sites que je crée actuellement sans les bonnes adresses évidement.

Code de la page php

Code : Tout sélectionner

<?php
if ($_SERVER['HTTP_USER_AGENT'] == 'Application/8.4.2.1') {
    require_once 'Database.php';
    $db = new Database();
    $stm = $db->createStatement("SELECT id,id_dispached,old_member,new_member FROM dispached_edit");
    if ($stm->execute()) {
        $res = $stm->fetchAll(PDO::FETCH_ASSOC);
        $json = json_encode($res);
        unset($db);
        echo $json;
    }else{
        echo 'ERROR';
    }
}else{
    die('access denied');
}
Code de la class PHP Database.php qui sert à la connection mySql

Code : Tout sélectionner

class Database {
//  local parameters
    const db_host = 'localhost';
    const db_name = 'udf_db';
    const db_user = 'root';
    const db_psw = 'root';
 
//    online parameters   
//    const db_host = 'localhost';
//    const db_name = 'your db name';
//    const db_user = 'your user name';
//    const db_psw = 'your password';
    
    private $connection = null;
    private $statement = null;
    /* CONSTRUCTOR
     * -> create also PDO
     */
    function __construct() {
        try{
            $this->connection = new PDO('mysql:host='. self::db_host.';dbname='.self::db_name, self::db_user,self:: db_psw);
        } catch (PDOException $ex) {
            die($ex->getMessage());
        }
        
    }
    /* DESTRUCTOR
     * -> destruct aldo PDO
     */
    function __destruct() {
        $this->connection = null;
    }
    
    /* CREATE A STATEMENT
     * create a new statement
     */
    function createStatement($request){
        $this->statement = $this->connection->prepare($request);
        return $this->statement;
    } 
}

Le code PB pour lire les données en provenance du site

Code : Tout sélectionner

Global NewMap Header.s()
Header("User-Agent")   = "Application/8.4.2.1" ; set your proper secure agent
#host = "http://localhost/Your local website location/"
;#host = "https://Your distant website location/"
Procedure load()
  Structure _grid
    id.s
    id_dispached.s
    old_member.s
    new_member.s
  EndStructure

  Protected NewList myGrid._grid()
  #JSON = 0

  Protected Url.s = #host+"getEditGrid.php"

  Protected http = HTTPRequest(#PB_HTTP_Get, Url, "", 0, Header())
  If http
    Protected json.s = HTTPInfo(http,#PB_HTTP_Response)
    FinishHTTP(http)
    If json <> "ERROR"
      Debug json
      If ParseJSON(#JSON,json)
        ExtractJSONList(JSONValue(#JSON),myGrid())
      EndIf
      ForEach myGrid()
        Debug myGrid()\id
        Debug myGrid()\id_dispached
      Next
    EndIf
  Else
    MessageRequester("HTTP Error",HTTPInfo(Result, #PB_HTTP_ErrorMessage),#PB_MessageRequester_Error)
  EndIf
EndProcedure

load()


Voila j'espère que Falsam ne m'en voudra pas pour ce petit ajout.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HTTPRequest() Envoyer des données à un script Php

Message par Ar-S »

Attention tout de même aux infos que vous faites transiter. L'user agent n'est pas un gage de sécurité. Très facile à changer sur un navigateur.
Je dis ça pour les données perso/rgpd tout ça..
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre