PHP curl PUT request

Hello la communauté,
Utilisateur du plugin ima Protect mais triste de ne pas pouvoir piloter mon alarme avec je me suis un peu pencher sur le code du plugin et sur ce que IMA Protect pouvait exposer … j’ai réussi a consommer leur WS pour changer le statut de l’alarme … :slight_smile: … depuis Postman … je me suis donc dit c’est gagné avec Jeedom … et la mes compétences PHP m’ont rattrapée …et oui elles sont quasi inexistante … :frowning: … du coup je vous demande un peu d’aide :roll_eyes: … l’opération du ws à invoquer est un put, j’ai réussit à bye passer le problème de cross domaine …xscrf … mais la je me heurte à l’alimentation du body qui est tout le temps vide … :frowning: … du coup j’ai un bad request exception … a mon avis c’est un problème basique dans un appel curl en php mais après pleins de googlelisation et de tests je n’y arrive pas.
Ci dessous mon code php :

$request_headers = array(
			'X-CSRFToken: ' . $xcsfrToken,
			'Referer: https://pilotageadistance.imateleassistance.com'
		);
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_COOKIE, "sessionid=".$sessionId."; csrftoken=".$xcsfrToken);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if ($request_headers && !empty($request_headers)) {
	curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
	$string=implode(",",$request_headers);
	log::add('alarme_IMA', 'debug', "Request headers $string");
}

$data = http_build_query([
'status' => 'off'
]);

curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_PUTFIELDS, $data);
$result = curl_exec($ch);

Le code HTTP que j'obtiens est un 400 .. soit un badRequestException ...et le message "Bad status PUT param : None ... comme si rien n'était passé dans le body ... :thinking:

la réponse du serveur IMA est un 400 … du coup j’ai passé les couches d’authentification et de vérification de cross domain … c’est une erreur côté serveur qui me dit que le body n’a pas les bons paramètres ou que le body est vide … via postman je connais les bons paramètres … donc à priori le body est vide … est-il possible en php d’avoir un mode verbose sous jeedom et de voir le contenu de la requête … principalement le body
Avez-vous une idée ?
Chris9440

Hello,

T’es sur que c’est pas plutôt du HTTP POST que tu dois faire ? La tu fais du PUT.

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

et $data correspond par exemple à :
{"centralId":"123","ttmSessionId":"456"}

Donc la tu envoi 2 paramètres en post :

  • centralId = 123
  • ttmSessionId = 456

Tu peux t’inspirer de mon code ici : https://github.com/mguyard/Jeedom-Diagral_eOne/blob/95e2e6e1116b919a090dc24e61d048a39d7f6666/3rparty/Diagral-eOne-API-PHP/class/Diagral/Diagral_eOne.class.php#L1447

Si c’est bien du PUT, montre nous ton postman.
Et j’ai un doute mais le http_build_query c’est plutôt pour forger les requêtes GET non ?

je te confirme que c’est bien un put et le content type est bien de type url encoded

je suis bcp plus allaise avec le java … sinon je vais faire cela en java … via un déclenchement de script pearl ou bach …mais je prefererais faire cela en php…mais je maitrise pas du tout

Essaye ca :

$params = array(
   'status' => 'off'
);
$data = http_build_query($params, null, '&', PHP_QUERY_RFC3986);

a la place de ca :

$data = http_build_query([
‹ status › => ‹ off ›
]);

même résultat …:frowning:

Sur ta capture postman on voit aussi un 404 Bad request. T’es sur qu’il te donne bien un retour postman ?

Dans le code du plugin je vois ca :

if ($httpcode==404) return self::IMA_IGNORED; // j'ai un 404 précisément toutes les 7 minutes, un bug de fonctionnement du site probablement...

ça faisait parti de mes tests … :slight_smile:

Oui mais tu as pas le paramètre code dans ton code php.
Faudrait faire ca :

$params = array(
   'status' => 'off',
   'code' => '1234'
);
$data = http_build_query($params, null, '&', PHP_QUERY_RFC3986);

pareil
Ci-dessous le code php
$request_headers = array(
'X-CSRFToken: ’ . $xcsfrToken,
‹ Referer: https://pilotageadistance.imateleassistance.com ›
);

	//			'Content-Type: ' . 'application/x-www-form-urlencoded'
	$ch = curl_init ($url);
	curl_setopt($ch, CURLOPT_COOKIE, "sessionid=".$sessionId."; csrftoken=".$xcsfrToken);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($ch, CURLOPT_VERBOSE, 1);
  	
  	if ($request_headers && !empty($request_headers)) {
		curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
		$string=implode(",",$request_headers);
		log::add('alarme_IMA', 'debug', "Request headers $string");
	}
  
    $params = array(
       'status' => 'off',
       'code' => 'XXX'
    );
    $data = http_build_query($params, null, '&', PHP_QUERY_RFC3986);
    
  	curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_PUTFIELDS, $data);
	$result = curl_exec($ch);
	$httpcode = curl_getinfoResult : HTTP/1.1 100 Continue  HTTP/1.1 400 Bad Request Date: Fri, 06 Nov 2020 18:57:04 GMT Content-Type: application/json Content-Length: 28 Connection: keep-alive X-Frame-Options: SAMEORIGIN Vary: Cookie Set-Cookie: sessionid=sc8ugsn3rxelteqjxz8n6uusg1im14vp; expires=Fri, 06-Nov-2020 19:17:04 GMT; HttpOnly; Max-Age=1200; Path=/ Set-Cookie: TS01de1ea5=01277f05fc54610bd1adb6de888185b5be638623350a36149c1aae5f1d0c31490015f94b3b4396eab3a0ee581128a9d3fcb059fe6dd27e20fb522912ae16fd96f865422cce; Path=/; Domain=.pilotageadistance.imateleassistance.com; Secure; HTTPOnly  "Bad status PUT param: None"($ch, CURLINFO_HTTP_CODE);
  	$error = curl_error($ch);
	curl_close($ch);
    $resultArr=json_decode($result,true);

et la réponse http :

peut on activer un niveau de debug ou voir dans une log le contenu de la requette http evoquée ??

Si comme ca : https://github.com/mguyard/Jeedom-Diagral_eOne/blob/95e2e6e1116b919a090dc24e61d048a39d7f6666/3rparty/Diagral-eOne-API-PHP/class/Diagral/Diagral_eOne.class.php#L1491

Tu sais que tu peux généré du code php_curl depuis Postman. Regarde les différences au niveau des données PUT envoyé

Merci pour ton support et ton retour… le week end etant dedie a la famille je regarderais tout cela a tete reposee durant le week end…je ne manquerais pas de te tenir au courant
Bon week

1 « J'aime »

merci @mguyard tu m’as sauvé … et merci à postman de générer du code php

Et alors la solution c’est ?
Indiqué aussi le sujet en résolu

Oui pardon dans l’excitation d’avoir réussit j’en ai oublié le principal … partager la solution … :slight_smile:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://pilotageadistance.imateleassistance.com/proxy/api/1.0/hss/XXXXX/status",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "status=off&code=XXXX",
  CURLOPT_HTTPHEADER => array(
    "X-CSRFToken: $csrfToken",
    "Referer: https://pilotageadistance.imateleassistance.com",
    "Content-Type: application/x-www-form-urlencoded",
    "Cookie: sessionid=$sessionId; csrftoken=$csrfToken; TS01de1ea5=$TS01de1ea5"
  ),
));  

je pense que c’est le forçage de la version de http version qui corrige mon soucis

CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1

Mais la syntaxe postman du curl php est nickel … je la conserve tel quel … :slight_smile:

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.