Je suis coincé avec ce problème depuis un petit moment maintenant. J'essaie d'utiliser une API REST pour modifier certains paramètres d'un utilisateur, comme effacer un utilisateur et définir son appareil sur inactif.
Les appels REST sont effectués en php pour lequel je suis assez nouveau. La plupart des appels (get et post) fonctionnent très bien, donc je pense avoir compris le concept de base de php et de curl, mais je ne peux tout simplement pas faire fonctionner les requêtes put. Le problème est que lors de l'appel REST, j'obtiens un code d'état 200 en retour indiquant que tout s'est bien passé, mais lorsque je vérifie la base de données, rien n'a changé et l'appareil est toujours actif.
J'ai passé plusieurs heures à rechercher ce problème ici sur stackexchange ( La requête cURL PUT ne fonctionne pas avec PHP , Php Curl return 200 mais pas de publication , La fonction PHP CURL PUT ne fonctionne pas ) et lire en outre divers tutoriels. Pour moi, mon code a l'air bien et est parfaitement logique car il est similaire à de nombreux exemples que j'ai trouvés en ligne. Alors, aidez-moi à trouver mon erreur.
$sn = "123456789"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn); $data = array("cmd" => "clearUser"); $headers = array( 'Accept: application/json', 'Content-Type: application/json' ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $username = 'XXX'; $password = 'XXX'; curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data)); $output = curl_exec($ch); curl_close($ch);
3 Réponses :
Vous définissez dans l'en-tête 'Content-Type: application / json'. Essayez d'encoder vos $ data en json, puis transférez le jsonEncodeteData:
$dataJson = json_encode($data); curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);
peut-être que cela aide déjà.
l'état 200 peut ne pas être un succès dans le cas d'une requête PUT. Dans une sémantique correcte (implémentation correcte du serveur), PUT réussi renvoie "201 Created" et, si le client envoie un contenu vide ou incorrect, le serveur renvoie "204 No Content".
Les programmeurs paresseux peuvent simplement renvoyer "200 Ok" au lieu de 204 avec le sens "votre requête est correcte, mais il n'y a rien à voir avec les données".
Essayez de vérifier vos données et assurez-vous d'envoyer quelque chose qui n'est pas vide et qui est conforme aux spécifications de l'API.
Pour autant que je sache, vous avez deux problèmes dans votre code.
Content-Type: application / json
est incorrect, je le supprimerais complètement. Content-Length
. Je suggère d'essayer
$sn = "123456789"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn); $data = array("cmd" => "clearUser"); $httpQuery = http_build_query($data); $headers = array( 'Accept: application/json', 'Content-Length: ' . strlen($httpQuery) ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $username = 'XXX'; $password = 'XXX'; curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,$httpQuery); $output = curl_exec($ch); curl_close($ch);
si défini
Content-Type: application / json
peut-êtrecurl_setopt ($ ch, CURLOPT_POSTFIELDS, json_encode ($ data));