2
votes

Pourquoi la requête PHP cURL PUT ne fonctionne-t-elle pas malgré l'obtention du code d'état 200 en retour?

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);


1 commentaires

si défini Content-Type: application / json peut-être curl_setopt ($ ch, CURLOPT_POSTFIELDS, json_encode ($ data));


3 Réponses :


0
votes

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à.


0 commentaires

0
votes

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.


0 commentaires

0
votes

Pour autant que je sache, vous avez deux problèmes dans votre code.

  1. Content-Type: application / json est incorrect, je le supprimerais complètement.
  2. Vous n'avez pas d'en-tête 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);


0 commentaires