web-dev-qa-db-fra.com

file_get_contents ('php: // input') retourne toujours une chaîne vide

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?

11
Igor

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:

  1. l'URL curl que vous avez utilisé, assurez-vous que l'URL fonctionne réellement et ne renvoie pas d'erreurs.
  2. ouvrez une autre fenêtre de terminal/console et exécutez tail -f /path/to/the/php/log/file afin que vous puissiez réellement voir le résultat de ces appels php.
  3. souvent les gens obtiennent cette erreur: 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)
  4. assurez-vous que votre code est correct, et par là, je veux dire, assurez-vous de ne pas taper des arguments ou des arguments incorrects ... des éléments qui ne sont pas nécessairement soulignés dans netbeans.
  5. 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);
    
8
Kristian

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.

3
Giulio Piancastelli

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"];
2
Radon8472

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".
2
Timtcng.sen

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.

1

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
1
sambha

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é. :)

0
Mandan Sharma