Je construis une API RESTful PHP, à la suite de this tutorial. La fonction suivante, qui doit renvoyer les données envoyées avec la demande lorsque la méthode 'put' est utilisée, renvoie null à chaque fois:
file_get_contents('php://input')
.
J'ai même téléchargé et testé l'exemple de code complet dans le didacticiel, qui renvoie toujours la valeur null.
J'utilise cURL et la commande suivante pour tester la méthode 'put':
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan
.
J'ai perdu des jours sur ce sujet et je n'ai toujours pas pu lire les données JSON. Qu'est-ce que je fais mal?
Tout d'abord, j'ai pu exécuter ce code et cela a bien fonctionné:
--Terminal---------
//I ran this curl request against my own php file:
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/test.php
--PHP--------------
//get the data
$json = file_get_contents("php://input");
//convert the string of data to an array
$data = json_decode($json, true);
//output the array in the response of the curl request
print_r($data);
Si cela ne fonctionne pas, vérifiez la console pour les erreurs et vos paramètres php:
tail -f /path/to/the/php/log/file
afin que vous puissiez réellement voir le résultat de ces appels php.file_get_contents(file://input): failed to open stream: no suitable wrapper could be found
qui peut indiquer une faute de frappe de la chaîne "file: // input" ou le fait que allow_url_fopen
est désactivé dans php (voir # 5 en cas de doute)rappelez-vous, file_get_contents
ne fonctionne que lorsque allow_url_fopen
est défini sur true dans vos paramètres PHP. C’est quelque chose qui est défini dans php.ini, mais vous pouvez également modifier les paramètres au moment de l’exécution en écrivant quelque chose dans les lignes du code suivant avant l’autre code:
ini_set("allow_url_fopen", true);
Comme noté ailleurs sur le Web , php://input
le contenu ne passe pas si la requête est redirigée. Peut-être que votre serveur Web a une redirection depuis une URL commençant par www vers une URL sans www, ou depuis des URL utilisant HTTP vers des URL utilisant HTTPS. Vérifiez les journaux de votre serveur Web pour vérifier cela et agissez en conséquence pour éviter la redirection lorsque vous appelez le service Web.
J'ai écrit un fichier d'en-tête avec ce code:
if($_SERVER["REQUEST_METHOD"] == "POST" && $_SERVER["CONTENT_TYPE"] == "application/json")
{
$data = file_get_contents("php://input", false, stream_context_get_default(), 0, $_SERVER["CONTENT_LENGTH"]);
global $_POST_JSON;
$_POST_JSON = json_decode($_REQUEST["JSON_RAW"],true);
// merge JSON-Content to $_REQUEST
if(is_array($_POST_JSON)) $_REQUEST = $_POST_JSON+$_REQUEST;
}
Il vérifie le type de contenu correct et lit uniquement le nombre d'entrées de publication, comme spécifié dans l'en-tête Content-Length . Lors de la réception d'un fichier JSON valide, il a créé un tableau global $ _POST_JSON.
Vous pouvez donc utiliser votre contenu JSON de la même façon que vous le feriez avec des valeurs POST codées en URL.
Exemple:
echo $_POST_JSON["address"];
// or
echo $_REQUEST["address"];
J'avais aussi cette erreur, ma solution est de changer le format de données en brut.
Je l'obtiens de doc php où il dit
:php://input is not available with enctype="multipart/form-data".
L'appel de fonction correct est:
file_get_contents("php://input");
Vous devriez recevoir un message d'erreur disant que php:input
n'existe pas ...
Dans tous les cas, PUT
est destiné au téléchargement de fichiers sur le serveur, à condition que le serveur le prenne en charge. En général, vous utiliseriez POST
avec un en-tête Content-Type
approprié au contenu.
Sous Windows, la combinaison de "guillemets" simples "doubles" ne semble pas fonctionner. Utilisez escape pour les guillemets dans vos données JSON (comme ci-dessous) et cela devrait fonctionner
curl -X PUT -d "{\"address\":\"Sunset Boulevard\"}" http://localhost/clients/ryan
Je vois le problème,
Vous devez ajouter filename.php à la fin de l'URL de la requête ou réécrire les règles du serveur dans le fichier .htaccess pour résoudre ce problème.
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan/{filename.php}
remplacez {nom_fichier.php} par le nom de fichier approprié. :)