Aide pour exécuter une requête XHR POST depuis Jeedom

Bonjour à tous,

Je suis à la recherche d’aide pour un projet qui nécessite l’exécution d’une requête XHR Post.
J’ai créé un script PHP (voir plus bas) qui a pour objectif d’exécuter une requête vers un site web, celui-ci marche parfaitement quand je le charge dans un navigateur web, mais je n’arrive pas à l’exécuter depuis Jeedom.
Je pensais pouvoir utiliser le plugin Script, mais que je tente une requête en info ou action script, HTML idem HTTP, cela ne fonctionne malheureusement pas…
Mon objectif est de pouvoir exécuter cette requête XHR Post depuis Jeedom (initié via un scenario), quelqu’un aurait une idée ?

Mille merci par avance pour votre aide !

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);


$latitude = "xxx";
$longitude = "xxx";

$userId = artem;

// Création du timestart
$timestart = round(microtime(true) * 1000);
?>

<script>
    const proxyUrl = 'URL'; 

    // Données à envoyer dans la requête POST
    const data = 'data={ "latitude":"<?php echo strval($latitude); ?>", "longitude": "<?php echo strval($longitude); ?>", "precision": "10", "timestart": "<?php echo strval($timestart); ?>", "test": "0", "IdUser": "<?php echo strval($userId); ?>", "offsetTemps": "-120" }';

    const xhr = new XMLHttpRequest();
    xhr.open("POST", proxyUrl, true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log("Réponse du serveur distant :", xhr.responseText);
        } else {
            console.error("Erreur lors de la requête. Statut :", xhr.status);
        }
    };

    xhr.send(data);
</script>

Bonjour,

Non, c’est du javascript donc ca ne s’executera pas par php lors de l’execution du script coté serveur.
Pourquoi faire cela en javascript? ca n’a pas d’interêt; faites la requete en php

Bonjour Mips,

Merci de l’information, car je ne sais faire ce type de requête que via Javascript :rofl:

d’ailleurs il n’y a même pas besoin de script, une commande http (du plugin script) suffira je pense

Salut,

Tu devrais pouvoir t’en sortir en faisant du full php avec curl https://www.php.net/manual/en/book.curl.php
à la place du JS.
Quelque chose dans ce genre :

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);


$latitude = "xxx";
$longitude = "xxx";

$userId = artem;

// Création du timestart
$timestart = round(microtime(true) * 1000);

// URL du proxy
$proxyUrl = 'URL';

// Données à envoyer dans la requête POST
$data = array(
    "latitude" => strval($latitude),
    "longitude" => strval($longitude),
    "precision" => "10",
    "timestart" => strval($timestart),
    "test" => "0",
    "IdUser" => strval($userId),
    "offsetTemps" => "-120"
);

// Initialisation de cURL
$ch = curl_init($proxyUrl);

// Configuration des options de cURL pour une requête POST
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Retourner la réponse au lieu de l'afficher
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Désactiver la vérification SSL (utilisez avec précaution en production)

// Exécution de la requête
$response = curl_exec($ch);

// Vérification des erreurs
if ($response === false) {
    echo 'Erreur cURL : ' . curl_error($ch);
} else {
    // Traitement de la réponse
    echo 'Réponse du serveur distant : ' . $response;
}

// Fermeture de la session cURL
curl_close($ch);
?>
1 « J'aime »

Dans ce cas, tu peux tenter en NodeJS c’est très proche du javascript - en fait c’est du javascript - et Node est en principe installé sur toutes les box Jeedom, de nombreux plugins l’utilisent.

Merci à tous pour votre aide, je viens de faire la modification en PHP.
J’ai fait travailler une IA et la fin donne maintenant :

// Données à envoyer dans la requête POST
$data = array(
    "latitude" => $latitude,
    "longitude" => $longitude,
    "precision" => "10",
    "timestart" => $timestart,
    "test" => "0",
    "IdUser" => $userId,
    "offsetTemps" => "-120"
);

// URL du serveur proxy
$proxyUrl = 'URL'; // Remplacez par l'URL de votre serveur proxy

$dataString = json_encode($data);
//$dataString = json_encode($data, JSON_PRETTY_PRINT); // Utilisation de JSON_PRETTY_PRINT

$ch = curl_init($proxyUrl);

echo "Vérification 1 :<br>";
print_r($data); // Correction ici
echo "<br>Vérification 2 :<br>";
echo $dataString;
echo "<br>";

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if ($response !== false) {
    echo "Réponse du serveur distant : " . $response;
} else {
    echo "Erreur lors de la requête cURL : " . curl_error($ch);
}

curl_close($ch);

Je n’ai jamais utilisé la fonction CURL, quand je regarde l’inspecteur de mon navigateur. Je ne vois pas de requête post, celle-ci s’exécute côté serveur ? Un moyen de s’assurer du contenu de la requête émise (en dehors de voir ce qui arrive sur le serveur distant) ?

Tu ne verra rien dans l’inspecteur du navigateur, mais tu verra le résultat de ta requête directement dans le navigateur (print_r $data ou bien echo $dataString ça permet d’afficher la requête)

Car en effet PHP est exécuté sur le serveur, pas sur ton navigateur.