Page 1 sur 1

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

Publié : ven. 05/oct./2018 23:09
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())

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

Publié : ven. 05/oct./2018 23:11
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 ^-^';
	}
?> 

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

Publié : sam. 06/oct./2018 8:34
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)

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

Publié : sam. 06/oct./2018 13:52
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.

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

Publié : sam. 06/oct./2018 14:53
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.

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

Publié : sam. 06/oct./2018 20:37
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:

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

Publié : dim. 07/oct./2018 12:23
par Fig
Merci pour l'exemple ! Image

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

Publié : ven. 02/août/2019 11:29
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);

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

Publié : ven. 23/août/2019 8:55
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.

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

Publié : ven. 23/août/2019 11:49
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..