Appeler un script php
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Appeler un script php



  1. #1
    Jack
    Modérateur

    Appeler un script php


    ------

    Bonjour,

    j'ai une application web constituée d'une base de données et d'un site web qui communique avec cette base. J'ai également une application locale (raspberry Pi) qui a besoin d'écrire dans la base de données. L'application est écrite en C++.
    Comme le site est situé chez un hébergeur externe, les requêtes sql directes sont bloquées et mon appli va donc effectuer des requêtes http qui vont appeler le script updateDB.php situé à la racine du site.

    Lorsque je teste le tout avec le serveur web situé dans mon réseau local, tout fonctionne parfaitement. En revanche, si j'utilise le site distant, ma requête n'est pas comprise. J'ai essayé en C++ avec gestion "classique" des sockets (socket.h), puis avec Qt, avec le même résultat.

    Je joins la fonction de test qui récupère url et port dans une "lineEdit" et affiche ce que renvoie le serveur dans une "textEdit" (critiquez pas trop, c'est du vite fait car l'appli d'origine n'est pas écrite avec Qt)
    Code:
    void client::connexion(){
    	ip = ui.lineEditIP->text();				
    	port = ui.lineEditPort->text().toInt();	
    
    
    	// Création de la socket *********************************************
    	socket = new QTcpSocket(this);
    
    
    	//Résolution de l'adresse du serveur *********************************
    	QHostInfo info = QHostInfo::fromName(ip);
    	if (!info.addresses().isEmpty()) 
    		ip = info.addresses().first().toString();
    	ui.textEdit->append(ip);
    	
    	// Connexion au serveur http *****************************************
    	socket->connectToHost(ip, port);
    
    
    	// Attente de la réponse du serveur **********************************
    	if (socket->waitForConnected(100)) {	// On attend 100 ms maxi
    		ui.textEdit->append("*** Connecté");// si la connexion est acceptée, on l'affiche
    		socket->write("GET /updateDB.php?temp=21.32&ph=5.3 HTTP/1.0\r\n\r\n");
    		socket->waitForBytesWritten(1000);	// on attend que toutes les données soient bien envoyées
    
    
    		// Lecture des données renvoyées par le serveur
    		socket->waitForReadyRead(3000);		// et on attend 3 secondes maxi la réponse du serveur
    		ui.textEdit->append("*** Lecture en cours ...");
    		QString ch = socket->readAll();		// Récupération des données envoyés par le serveur
    		ui.textEdit->append(ch);			// Affichage de ces données
    
    
    		// Fermeture de la connexion *****************************************
    		socket->close();					// On termine la connexion
    		ui.textEdit->append("*** Déconnecté");
    	}
    	else {
    		ui.textEdit->append("Connexion impossible");
    	}
    
    
    }
    Le contenu de la textEdit:
    46.105.57.169
    *** Connecté
    *** Lecture en cours ...
    HTTP/1.1 400 Bad Request
    Date: Tue, 28 Feb 2017 14:59:35 GMT
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 226
    Connection: close
    Server: Apache
    Vary: Accept-Encoding
    Set-Cookie: SERVERID585=202157|WLWQW|WLWQW ; path=/


    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>

    *** Déconnecté
    Pour moi, c'est un problème d'adresse IP car si j'entre l'url du site dans mon navigateur, je vois la liste des fichiers, alors que si j'entre l'adresse IP correspondante, je tombe sur une page de login de mon hébergeur.

    Si quelqu'un a des idées, merci d'avance.

    PS: je ne récupère que la 1ère adresse renvoyée après résolution du nom car il n'y en a pas d'autre. mais je me doute que le problème vient de cette adresse.

    -----
    Dernière modification par Jack ; 28/02/2017 à 15h23.

  2. #2
    pm42

    Re : Appeler un script php

    Tu as pensé que ton hébergeur fait sans doute du site virtuel, c'est à dire n sites/noms sur la même adresse avec résolution justement par le nom ?

  3. #3
    Jack
    Modérateur

    Re : Appeler un script php

    Oui, c'est ça. Je viens de croiser un collègue qui me l'a confirmé. Il m'a conseillé de faire des "http request" à la place. Je suis en train de voir comment le mettre en oeuvre.

  4. #4
    Jack
    Modérateur

    Re : Appeler un script php

    Bon, apperemmment ça existe en .net, mais je ne trouve pas grand chose ailleurs.

    Comment effectuer une requête pour exécuter www.monsite/updateDB.php sans avoir à connaitre l'IP du site en C++?

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Appeler un script php

    Je n'ai pas eu le temps de creuser mais tu as regardé les trucs comme ça ?

    http://doc.qt.io/qt-5/qtnetwork-http-example.html

    Ou :

    https://karanbalkar.com/2014/02/send...t-5-framework/
    Dernière modification par pm42 ; 28/02/2017 à 16h20.

  7. #6
    Jack
    Modérateur

    Re : Appeler un script php

    Merci, j'avais jeté un oeil rapide sur ces classes. Cependant, afin de ne pas avoir à installer Qt sur la Raspberry Pi et du coup remanier tout le projet, je recherche des classes utilisables sans avoir à installer le framework complet. Je vais faire un test avec ceci: http://cpp-netlib.org/0.12.0/index.html

    V
    u l'exemple proposé, ça m'a l'air abordable je suis en train d'installer tout ça ...

  8. #7
    Jack
    Modérateur

    Re : Appeler un script php

    Bon, comme évidemment je continue à rencontrer des tonnes de problèmes avec l'installation de cpp-netlib, j'ai essayé avec QNetworkAccessManager (sous windows) et l'appel du script fonctionne

  9. #8
    pm42

    Re : Appeler un script php

    Je pense que tu peux t'en sortir avec ton code initial mais en envoyant une requête GET en HTTP 1.1.

    Ca donnerait en gros :

    GET /update.php HTTP/1.1
    Host: monsite.org

    C'est comme ça que marche le virtual hosting : le client se connecte sur l'IP puis dit avec le Host: sur quel site il veut aller.
    C'est facile à tester avec un telnet sur l'IP en question puis en passant la requête à la main. Tu as un exemple ici :

    http://www.the-art-of-web.com/system/telnet-http11/

  10. #9
    Jack
    Modérateur

    Re : Appeler un script php

    Excellent, tu m'as bien fait avancer.
    les connexions en telnet sont bloquées, mais en SSL, j'ai fini par trouver un petit problème syntaxique qui m'a bêtement pris une bonne heure: après le Host: monsite.org, il fallait 2 sauts de ligne. J'aurais du m'en douter plus tôt puisque je les avais bien prévus dans le code de ma requête.

    Bon reste un problème, passer de la ligne de commande au code: je me fais jeter lorsque je fais un connect avec ma socket, même avec un port égal à 443.

    il y a un truc spécial pour une connexion en SSL?

  11. #10
    Jack
    Modérateur

    Re : Appeler un script php

    Allez, problème résolu, le connect ne passait pas à cause d'une petite erreur que j'avais faite dans la résolution de nom.

    Un très grand merci à toi pm42

  12. #11
    Bluedeep

    Re : Appeler un script php

    Bonjour

    Je vois que ton problème est résolu mais les choix que tu as fait m'interpellent.
    Pourquoi ne pas avoir simplment exposé un ws pour ta mise à jour de DB ?

  13. #12
    Jack
    Modérateur

    Re : Appeler un script php

    ws = web service?

    Dans ce cas je ne vois pas comment procéder. J'ai une Raspberry Pi qui fait des acquisitions périodiques de grandeurs physiques et je désire que l'historique des ces mesures soit disponible à tout moment, d'où le choix d'héberger la base et le site web de paramétrage et de consultation sur un serveur externe fiable.

    L'appli qui tourne sur la Rpi est écrite en C++ car c'est le langage que je maîtrise le mieux et me permet d'accéder facilement au hardware (I/O, bus I2C, etc).

    Quelle solution aurais-tu mise en oeuvre?
    Dernière modification par Jack ; 01/03/2017 à 12h30.

  14. #13
    Bluedeep

    Re : Appeler un script php

    Citation Envoyé par Jack Voir le message
    Quelle solution aurais-tu mise en oeuvre?
    Je parlais du Ws uniquement sur l'aspect mise à jour par le RPi de la base; tu appelles apparemment une page web , ce que je trouve un peu étrange, d'autant que "philosophiquement" il n'est pas très logique d'utiliser une requête Http en "GET" pour faire une mise à jour, ces requêtes étant supposées idempotentes, même si techniquement ça marche.
    (même si je suis bine conscient que tes échanges sont "privés" donc le fait qu'il fonctionne de manière "hors normes et usages" n'est pas gênant).

    J'aurais trouvé plus logique d'exposer une méthode de mise à jour sur une interface de ws et d'appeler cette méthode via l'appli C++, en utilisant, par exemple, gSoap (il y a peut être mieux pour consommer un ws depuis C++, je ne sais pas).

  15. #14
    pm42

    Re : Appeler un script php

    Citation Envoyé par Bluedeep Voir le message
    J'aurais trouvé plus logique d'exposer une méthode de mise à jour sur une interface de ws et d'appeler cette méthode via l'appli C++, en utilisant, par exemple, gSoap (il y a peut être mieux pour consommer un ws depuis C++, je ne sais pas).
    Dans le cas présent, j'ai l'impression que le plus simple est le mieux...

  16. #15
    Bluedeep

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Dans le cas présent, j'ai l'impression que le plus simple est le mieux...
    Détourner un appel à une page web ne me semble pas une solution "plus simple" que d'exposer un ws mais bon ....

  17. #16
    Philou67

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Dans le cas présent, j'ai l'impression que le plus simple est le mieux...
    Et en terme de sécurité ?
    :'( Plus j'apprends, et plus je mesure mon ignorance

  18. #17
    pm42

    Re : Appeler un script php

    Citation Envoyé par Philou67 Voir le message
    Et en terme de sécurité ?
    Il peut parfaitement mettre une authentification HTTP en Basic ou Digest ce qui pour son besoin devrait largement suffire.

  19. #18
    Bluedeep

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Il peut parfaitement mettre une authentification HTTP en Basic ou Digest ce qui pour son besoin devrait largement suffire.
    Sauf qu'une "basic" sur Internet, même quand les données ne sont pas critiques c'est quand même un peu limite.

  20. #19
    pm42

    Re : Appeler un script php

    Tu as raison. Des tonnes de gens vont aller intercepter le trafic entre son Raspberry et son site hébergé pour trouver la clé et grâce à cela enregistrer des tonnes de températures fausses ce qui va à terme provoquer la fin de la civilisation.

    C'est sur que s'il définissait des WS accédé uniquement en SSL avec un certificat ad-hoc, le tout sur un serveur privé clusterisé et répliqué dans plusieurs datacenter éloignés géographiquement, ce serait mieux.
    Peut-être même qu'une architecture blockchain avec détection des attaques en deep-learning fonctionnant sur des ordinateurs quantiques serait encore plus adaptée.

    Mais la solution ultime est sans doute de tout coder avec une machine virtuelle Forth aussi bien coté serveur que client je pense

  21. #20
    Jack
    Modérateur

    Re : Appeler un script php

    tu appelles apparemment une page web
    Pas tout à fait, j'appelle un script situé dans le même dossier que le site. Du coup le GET ne fait qu'exécuter le script.

    Je reconnais volontiers ne pas être au point concernant les technologies du WEB, n'étant qu'un pauvre électronicien reconverti . Mais je vais lire avec attention le principe de Soap.
    Dernière modification par Jack ; 01/03/2017 à 14h06.

  22. #21
    Bluedeep

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Tu as raison. Des tonnes de gens vont aller intercepter le trafic entre son Raspberry et son site hébergé pour trouver la clé et grâce à cela enregistrer des tonnes de températures fausses ce qui va à terme provoquer la fin de la civilisation.
    Ce n'est pas ce que je dis; je me contente de dire que ici une solution "standard" n'aurait pas été plus compliquée à mettre en oeuvre que celle mise en oeuvre par Jack (en fait, plutôt moins : gSoap aurait permis de générer la partie C++ automatiquement).

    Maintenant, en effet, ça fonctionne et ce n'est pas une archi critique (il faudrait quand même vérifier l’innocuité de la page à l'injection SQL : on ne sait pas ce qu'il y a dans la base en plus des données émises par le RaPi).
    Dernière modification par Bluedeep ; 01/03/2017 à 14h24.

  23. #22
    Jack
    Modérateur

    Re : Appeler un script php

    Je confirme, l'appli n'a rien de critique ni de sensible.

  24. #23
    Ludwig1

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Mais la solution ultime est sans doute de tout coder avec une machine virtuelle Forth aussi bien coté serveur que client je pense
    Salut,
    Je viens de découvrir, ça c'est de la provocation.
    Pour la fois t'es en retard, y a longtemps que c'est fait.


    Cordialement

    Ludwig

  25. #24
    Ludwig1

    Re : Appeler un script php

    Citation Envoyé par pm42 Voir le message
    Mais la solution ultime est sans doute de tout coder avec une machine virtuelle Forth aussi bien coté serveur que client je pense
    Re,

    Je sais que le sujet est très très sensible, mais tout de même, le codage à l'aide de la machine que tu cites n'est pas forcement
    à coté de la plaque, loin de là.
    Tout au début que j'étais venu ici, j'avais pensé trouver des gens qui seraient prêt à monter dans un projet, mais voilà, je me suis trompé.

    Cordialement

    Ludwig

Discussions similaires

  1. Appeler un tableau dans une fonction
    Par Galibble dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 28/02/2015, 14h53
  2. Windows vient de m'appeler !!!?
    Par astroamateur dans le forum Internet - Réseau - Sécurité générale
    Réponses: 7
    Dernier message: 25/06/2013, 09h19
  3. appeler a prix bas la Belgique
    Par invite0b873a35 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 28/02/2013, 15h13
  4. Se faire appeler par son prénom?
    Par Anetheron dans le forum Enseignement : le forum des enseignants
    Réponses: 23
    Dernier message: 11/09/2011, 15h36
  5. configurer VNC pour appeler le viewer
    Par invite4f1cafdb dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 08/11/2007, 17h49