IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

requête HTTP POST


Sujet :

Langage PHP

  1. #1
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut requête HTTP POST
    Bonjour à tous,

    Je viens vers vous car j'ai un soucis de compréhension de logique.

    Mon But:
    Un Arduino MKR1000 lit des capteurs et crée des donnée toutes les 10 sec.
    Cet Arduino envoi des données vers un site web qui affiche toutes les 10 sec les données reçues.

    État des lieux,
    Arduino acquisition des donnée OK
    Connexion via WIFi OK

    Serveur Web nginx sur Raspberry: OK

    Requête HTTP GET depuis Arduino ok, --> Arduino se connecte bien au serveur web nginx.

    Envoi de la requête HTTP POST, ???? pas d'erreur lors de l’exécution du code, mais

    la page tsttemp.php sensée recevoir les données émise en POST par l’Arduino ne reçoit rien.

    En réponse à la requête POST, je reçoit bien la page tsttemp.php sur l'Arduino, mais les valeurs du POST sont vide

    Sur le Raspberry, la même page ne reçoit rien non plus..

    Je me demande si là je n'ai ps problème de compréhension, car il semble ue ce serait l’émetteur (client) de la
    requête POST qui recevrait la "bonne" réponse du serveur WEB, et pas les autres clients.

    Donc, ma question serait de comment faire pour que le serveur reçoivent le POST de l'Arduino et que tous les clients
    puissent voir les donnée
    Est ce que le principe est erroné ??

    Sur beaucoup de tuto, on trouve des programme pour l'Arduino, mais pas d'explication sur le PHP.
    Il semblerait que ce soit l'Arduino qui serve de serveur WEB, et donc qui renverrai la "bonne "page HTML avec son
    adresse IP comme URL.

    Suis-je complètement perdu ?: OUI
    suis-je à la masse ???

    Merci de votre aide

    Michel

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Hum je ne suis pas sûr de comprendre.

    Où est la base de données ?

    Classiquement, il y a 2 grandes familles à bien distinguer :

    A. Lecture des données
    -- Raspberry : le serveur HTTP Nginx attend des clients
    -- Client : demande la dernière relève de mesures au serveur Nginx en GET (Chrome / Firefox)
    -- Raspberry : Nginx exécute un script PHP (ex. show.php) qui va chercher les mesures dans la bdd et les restitue au client (HTML/CSS)

    B. Acquisition des données
    -- Arduino : fait des mesures
    -- Arduino : pousse les mesures vers un serveur HTTP (Nginx) en POST (Raspberry)
    -- Raspberry : Nginx reçoit les mesures poussées par Arduino en POST, un script PHP (ex. insert.php) les insère en base de données (MySQL / MariaDB / etc.)

    J'ai volontairement placé A. avant B. car ces 2 familles n'ont pas d'ordre d'exécution.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre habitué
    Homme Profil pro
    Electron libre since 80's
    Inscrit en
    Juillet 2016
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Electron libre since 80's
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 92
    Points : 137
    Points
    137
    Par défaut
    la page tsttemp.php sensée recevoir les données émise en POST par l’Arduino ne reçoit rien.
    Vérifier la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	$_out;
    	$_json;
    	if(!empty($_GET))
    	{	$_json=$_GET;
    		$_out['.debug']['.method']='get';
    	}
    	else if(!empty($_POST))
    	{	$_json=json_decode(stripslashes($_POST),true);
    		$_out['.debug']['.method']='post';
    	}
    	else if(!empty(file_get_contents("php://input")))
    	{	$_json=json_decode(stripslashes(file_get_contents("php://input")),true);
    		$_out['.debug']['.method']='input';
    	}
    	else
    	{	$_out['.debug']['.method']=='nada';
    	}
    	$_out['.debug']['JSON']=$_json;
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  4. #4
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    Bonjour,

    Séb,
    La base de donnée se trouve sur le raspberry, c'est une base mariaDB(Mysql).
    Le serveur WEB aussi (nginx)

    C'est effectivement la méthode B que j'ai envisagé(comprise). Mais je n'arrive pas à pousser les
    données de l'Arduino vers le serveur HTTP.
    Je ne comprend pas ce que je dois faire, une page php ? une config du serveur?, un envoi spécial depuis l'arduino?.......

    xor AX AX

    J'ai copier ton code dans la page index.pph du site /var/www/tsttemp, mais je ne reçoit aucun messages
    de ton code
    Voici le retour du serveur vers l'Arduino (je n'ai pas mis le code après la balise '<html>......
    Send OK Maintenant je lis.....


    HTTP/1.1 200 OK
    Server: nginx/1.22.1
    Date: Tue, 12 Dec 2023 15:19:57 GMT
    Content-Type: text/html; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: close

    d7

    Site tsttemp debut du php
    Bonjour !
    array(0) {
    }
    fin du php de départ
    Si cela vous éclaire

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    C'est effectivement la méthode B que j'ai envisagé(comprise)
    Y'a pas de méthode B.
    Ce sont 2 choses distinctes à mettre en œuvre.

    Mais je n'arrive pas à pousser les données de l'Arduino vers le serveur HTTP.
    Je ne comprend pas ce que je dois faire, une page php ? une config du serveur?, un envoi spécial depuis l'arduino?
    C'est le B. dont je parlais.
    Quelles sont les possibilités offertes par l'Arduino ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    Bonjour Sèb,

    Hahaaa voila qui est éclairant... Si j'ai bien compris:
    Donc une page qui lit les données située dans la DB via le serveur nginx.
    Une page qui sert à recevoir les donnée ,une autre à les stocker dans la DB..

    C'est plus ou moins là où j'en suis.

    J'ai suivit un tuto qui permet de stocker des donnée dans une base de donnée MariaDB.
    Il y a une page formulaire qui transmet les donnée à une autre page qui se connecte à la DB
    et y insert les nouvelles données.
    Donc cette partie semble acquise.

    il me reste juste la partie envoyer, recevoir les données entre l'Arduino et le serveur Raspberry/nginx.

    L'Arduino est pour l'instant utilisé en tant que client, je transmet une requête HTTP vers le
    serveur Raspberry/nginx et je reçoit en retour la page HTML émise par le serveur.

    Dans les recherche sur le net, il semblerait que l'Arduino via le wifi se connecte au serveur
    Raspberry/nginx, lui envoi des requêtes, et reçoit de l'HTML du serveur.(comme tous les clients web)

    En théorie, l'Arduino devrait aussi pouvoir servir de serveur WEB pour émettre une page HTML vers
    un client Web (mais je ne l'ai pas essayé car cela ne me semblait pas nécessaire).

    J'ai donc crée une page PHP sur le site du Raspberry dont le code (simplifié) est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $temp = $_POST['temp']
    echo( 'la temp est :' . $temp
     ?>
     
    <html>
    ....................
    je m'attendais donc à recevoir( sur l'Arduino) un retour avec les données que j'avais transmisse
    avec la requête HTTP POST(depuis l'Arduino)

    Mais je ne reçoit rien. Le code HTML oui, mais les variables du POST ainsi le DUMP sont vide

    C'est pourquoi je pense faire une erreur dans le concept de l'ensemble.

    Or, en relisant ton point B, si l'Arduino pousse des donnée vers le serveur, n'importe quelle
    page php doit pouvoir relire ces données, puis les traiter et les envoyer vers la DB.

    mais je n'y arrive pas....

    michel

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Donc une page qui lit les données située dans la DB via le serveur nginx.
    Une page qui sert à recevoir les donnée ,une autre à les stocker dans la DB..
    C'est le même script qui reçoit les données et les insère en base.

    Il y a une page formulaire qui transmet les donnée à une autre page qui se connecte à la DB
    et y insert les nouvelles données.
    Tu ne veux pas saisir les données à la main, non ?
    Alors cela ne sert à rien, si ce n'est pour le principe et l'apprentissage.

    J'ai donc crée une page PHP sur le site du Raspberry dont le code (simplifié) est:
    ...
    Mais je ne reçoit rien. Le code HTML oui, mais les variables du POST ainsi le DUMP sont vide
    Fais simple pour commencer, un simple perroquet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php header('Content-Type: text/plain') /* Retour texte pour simplifier */ ?>
    Données reçues de l'Arduino :
    $_REQUEST => <?php print_r($_REQUEST) ?>
    $_GET => <?php print_r($_GET) ?>
    $_POST => <?php print_r($_POST) ?>
    Avec ceci tu auras un retour de ce que PHP voit de la requête de l'Arduino.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    J'ai donc crée une page index.php qui ne contient que ton code "perroquet"

    Le retour sur l'Arduino est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    HTTP/1.1 200 OK
    Server: nginx/1.22.1
    Date: Wed, 13 Dec 2023 14:49:39 GMT
    Content-Type: text/plain;charset=UTF-8
    Transfer-Encoding: chunked
    Connection: close
     
    60
    Données reçues de l'Arduino :
    $_REQUEST => Array
    (
    )
    $_GET => Array
    (
    )
    $_POST => Array
    (
    )
     
     
     
    0
    cela signifie que l'Arduino n’envoie rien avec sa requête HTTP POST ??

    Dans un explorateur sur le Raspberry l'adresse http://tsttemp affiche
    Données reçues de l'Arduino :
    $_REQUEST => Array
    (
    )
    $_GET => Array
    (
    )
    $_POST => Array
    (
    )
    L'Arduino envoi toutes les trente seconde la même requête HTTP POST avec
    juste la chaine "machaine" qui change en fonction de la mesure de la sonde temp et rh

    Pour info la requête HTTP POST est constituée comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Serial.println("connected to server");
          // Make a HTTP request:
          client.println(F("POST http://tsttemp/index.php HTTP/1.1"));
          client.println(F("Host: 192.168.1.8"));
          client.println(F("Content-Type: application/x-www-form-urlencoded"));
          client.println(F("Connection: close"));
          client.println();
          client.println(F("User-Agent: Arduino/1.0"));
          client.print(F("Content-Length: "));
          client.println(machaine.length());
          client.println();
          client.println(machaine);
          client.println(F("Connection: close"));
          client.println();
    j'ai remplacer la ligne client.println(machaine) par : client.println("bonjour"), mais je n'ai toujours pas de contenu dans $_post.

    Le code Arduino manque quelque chose ???

    Je pense bien que la page php qui recevra le contenu du POST sera aussi la page qui insérera les mesure dans la DB,
    mais j'avance pas à pas (pour comprendre et faciliter le deboggage ...... quoique......)


    merci de tes efforts

    michel

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 193
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    Bizarre comment tu formes ta requête HTTP.
    À savoir : l'en-tête est réputée terminée quand il y a 2 retours à la ligne successifs.
    Par ailleurs, le corps de la requête n'est pas bien formé. Tu ne peux pas juste envoyer du texte comme ça

    Essaie un GET tout simple pour commencer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client.println(F("GET /index.php?foo=bar"));
    client.println(F("Host: 192.168.1.8"));
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  10. #10
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    Bizarre,
    La requête GET ne me retourne rien même la tienne....
    Par contre la requête POST retourne quelque chose (cfr post précedent.

    Alors que je suis "presque" sur d'avoir reçu quelque chose du GET, là je n'ai plus rien...

    Je vais retourner aux bases.......

  11. #11
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut retour au base
    Bonjour,,

    Après bien des essai, je suis retourné à la base/

    Une requête GET et on voit.

    L"Arduino MR1000 que j'utilisait donne des signe de fatigue.
    Je l'ai remplacé par un MKR1010 (les bibliothèque pour le Wifi ne sont pas les même, mais ok.

    Avec le MKR1010, j'ai demarrer WIreshak sur mon PC linux et comme j'y ai un serveur Apache2, je travaile avec.

    l semble qu'il y avait deux erreurs, une dans la requête GET, qui doit contenir la code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mwifi.println(F("Content-Type: text/html; charset=utf-8"));
    et la seconde sur le temps de réponse...

    J'ai mis un delais de 500 millisecondes avant de faire la lecture, et du coup la requête GET marche à tous les coup.

    J'ai crée un fichier /var/www/html/post.php pour verifier les données émise.

    Cependant, lorsque j'envoi la requête POST avec juste la chaine "bonjour", il n'y a pas d'erreurs, mais le retour du serveur de donne rien
    Je reçoit :
    $_REQUEST => Array
    (
    )
    $_GET => Array
    (
    )
    $_POST => Array
    (
    Dans wireshark, j'ai mis un filtre sur le protocole HTTP, et je vois bien la requête POST envoyée par l'Arduino,
    le serveur me renvoi un code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTTP/1.1 200 OK (text plain )
    Dans lequel se trouve le texte reçu par l'arduino, mais les trois array sont vide??

    J'ai oubliè un "merci" ou un "SVP" dans la requête ???

    Après avoir reçu la réponses du serveur, l'Arduino renvoi encore un ou deux informations dont la description est :"Continuation"

    Pour le moment l'Arduino est programmé pour envoyer toutes les 30 secondes la chaine "bonjour"

    Donc quelque chose ne vas pas......


    Mais quoi ???

    Michel

  12. #12
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut Solution
    Bonjour,

    Le problème est résolu (enfin je trouve)

    voir le lien:
    https://www.developpez.net/forums/d2.../#post11991142

    Ou je détaille un peu plus

    Un grand Merci à tous.

    Michel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [j2ee 1.3]sendRedirect et HTTP POST
    Par Glob dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/05/2006, 10h33
  2. HTTPS - POST côté client
    Par Julaie95 dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 29/03/2006, 15h37
  3. Requette HTTP POST
    Par CrazySeb dans le forum C++
    Réponses: 7
    Dernier message: 25/02/2006, 15h17
  4. HTTP POST
    Par jmjmjm dans le forum Web & réseau
    Réponses: 17
    Dernier message: 12/11/2005, 22h05
  5. [HTTP][POST] passassion de variable
    Par Yodalf dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 04/09/2004, 21h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo