Aller au contenu
c-lol

Api Post & Php

Recommended Posts

HC2 : V3.590

 

Salut à  tous, 

 

je viens m'en remettre aux spécialistes du dev,  après plusieurs heures sur le même problème.

 

Lors d'une requête POST vers la HC2, j'ai l'erreur suivante : 

 

{"type":"ERROR","reason":"MISSING_PARAMETER","message":"name: missing required parameter"}

 

Mais quel est ce paramètre requis?

 

La doc développer de Fibaro dit qu'il y a un exemple de commande avec un formatage JSON pour le body. Même en copiant collant j'ai l'erreur.

 

J'ai essayé en codant, avec l'outil REST Console, PHP et c'est le même.

 

Pour info voici le code PHP

<?php
	$ipHc2 = "192.168.1.10";
	$tcpPort = "80";
	$request = "/api/globalVariables";
	$userName = "myusername";
	$password = "mypassword";
				
	$data = array("name" => "Hagrid", "value" => "36", "readOnly" => false, "isEnum" => false);
	$data_string = json_encode($data);  
	$url = 'http://'.$userName.':'.$password.'@'.$ipHc2.':'.$tcpPort .$request;				
				 
	$ch = curl_init($url);    

	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    

	$result = curl_exec($ch);
	curl_close($ch);
	echo $result;
?>

et pour les tests avec REST CONSOLE

 

Request URI : http://192.168.1.10:80/api/globalVariables

 

Request Method : POST

 

CONTENT HEADER CONTENT TYPE : application/json

 

REQUEST PAYLOAD RAW BODY : "name":"test","value":"999","readOnly":false,"isEnum":false

 

CUSTOM HEADER : X-Fibaro-Version:2

 

BASIC AUTHENTIFICATION : myusername/mypassword

 

 

Resultat : 

 

RAW BODY : 

  • {"type":"ERROR","reason":"MISSING_PARAMETER","message":"name: missing required parameter"}

RESPONSE HEADER : 

  1. Status Code: 400
  2. Date: Sat, 13 Dec 2014 16:26:24 GMT
  3. Cache-Control: no-cache, no-store
  4. Server: 0.9
  5. Connection: close
  6. Transfer-Encoding: chunked
  7. Content-Type: application/json;charset=UTF-8

 

REQUEST BODY : 

  1. Request Url: http://192.168.100.10:80/api/globalVariables
  2. Request Method: POST
  3. Status Code: 400
  4. Params: {}

 

REQUEST HEADER : 

  1. Content-Type: application/json
  2. Authorization: Basic YMLtaW46YWR4=
  3. X-Fibaro-Version: 2
  4. Accept: */*
  5. Connection: keep-alive
  6. Origin: chrome-extension: //rest-console-id
  7. User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

 

Dans le REQUEST BODY je vois params:{} le problème vient peut etre de là ??!!

 

J'ai fais une requête GET pas de problème particulier.

 

J’espère avoir été assez explicite et si vous avez une idée je suis preneur.

 

Merki

 

  •  

 

Partager ce message


Lien à poster
Partager sur d’autres sites

La soc développeur est pour la V4 tu trouveras dans le menu haut du forum un lien vers la documentation de l'api de la V3 et en français en Plus

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourtant le plugin xbmc de ADN182 créé les variables dans la HC2. C'est du python mais il devrait être possible de faire pareil.

Je vais continuer mais investigations.

 

Vivement que la V4 soit stable :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Nous sommes d'accord je dis juste que l'api a changé entre la V3 et la V4 et que les infos sur la doc développeur concerne uniquement la V4 donc il faut prendre comme référence pour la V3 l'ancienne doc qui n'existe plus sur le site Fibaro.

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Plus de docs, plus de dev  :(

J'ai vu la doc en haut mais elle ne traite pas du REST/JSON ou alors je suis miro (dimanche matin :) ).

Il y a une copie de la doc quelque part sur le net?

Partager ce message


Lien à poster
Partager sur d’autres sites

MAJ en V4 faite!! Aprés toute la reconf des scenes et module, je me rattaque à  mon probleme de la derniere fois.

J'ai reussi à  créer une variable simple dont voici le code php

<?php
				$ipHc2 = "192.168.1.10";
				$tcpPort = "80";
				$request = "/api/globalVariables";
				$userName = "mysuername";
				$password = "mypassword";
				$data = array("name" => "simple", "value" => "val1", "readOnly" => false, "isEnum" => 0);      
				$data_string = json_encode($data);  

				$url = 'http://'.$userName.':'.$password.'@'.$ipHc2.':'.$tcpPort .$request;				
				 
				$ch = curl_init($url);    

				curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
				curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    

				$result = curl_exec($ch);
				curl_close($ch);
				echo $result;
			?>

Mais voila maintenant je cherche à  créer une variable avec plusieurs valeurs. J'ai donc fait 

<?php
				$ipHc2 = "192.168.1.10";
				$tcpPort = "80";
				$request = "/api/globalVariables";
				$userName = "myusername";
				$password = "mypassword";
				$data = array("name" => "multi", "value" => "0", "readOnly" => false, "isEnum" => 1, "enumValues" => array("val1","val2"));      
				$data_string = json_encode($data);  

				$url = 'http://'.$userName.':'.$password.'@'.$ipHc2.':'.$tcpPort .$request;				
				 
				$ch = curl_init($url);    

				curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
				curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
				curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    

				$result = curl_exec($ch);
				curl_close($ch);
				echo $result;
			?>

voila ce que me retourne la requête

 

 

 

{"name":"multi","value":"0","readOnly":false,"isEnum":true,"enumValues":[],"created":1421156759,"modified":1421156759}

 

la variable 'multi' est bien créé dans le HC2 mais aucune valeur.

 

Une idée?

Partager ce message


Lien à poster
Partager sur d’autres sites

Sur l' API REST de la V4 il faut faire un PUT et pas un POST pour créer un variable avec le nom de la variable derrière /api/globalVariables/ comme ceci

PUT 192.168.1.1/api/globalVariables/Multi 

avec en body le json formé ainsi

{"name":"Multi","value":"a","isEnum":true,"enumValues":["a","b","c"]}

;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok je vais essayer ça!!!

Pourquoi faut-il utiliser PUT? POST fonctionne, d'ailleurs je viens de faire un script en lua pour les virtuals Devices ici

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de faire des tests sur mon virtual device en LUA. J'en ai conclus que le POST est à  utiliser pour une création et le PUT pour une mise a jour.

 

Ensuite pour le body, il faut mettre la valeur de "isEnum" à  1. Si on met true on a une erreur "unsigned Int".

 

En mettant "isEnum":1 on a comme retour "isEnum":true

 

Concernant les valeurs dans le [array] ca passe toujours pas.

 

Voici le debug du VD

 

 

[DEBUG] 19:35:37:payload = {"name":"multi","value":"a","isEnum":1,"enumValues":["a","b","c"]}


[DEBUG] 19:35:37: response = {"name":"multi","value":"a","readOnly":false,"isEnum":true,"enumValues":[],"created":1421174137,"modified":1421174137}

 

je continu à  chercher.

Partager ce message


Lien à poster
Partager sur d’autres sites

- Tu ne peux pas te fier àla sortie du debug qui corrige au passage des choses pour garantir l'affichage ;).

- Lors de la création d'un variable globale prédéfinie tu es bien obligé de passer une valeur au moment de la création non ? Donc c'est bien PUT qu'il faut utiliser.

- Pour le payload

{"name":"Multi","value":"a","isEnum":true,"enumValues":["a","b","c"]}

et la manière correcte de faire, en tout cas c'est comme cela qui Fibaro utilise sa propre API ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

×