file_get_contents('php://input') renvoie toujours une chaîne vide
Je suis en train de construire un PHP API RESTful, à la suite de cette tutoriel. La fonction suivante, qui doit renvoyer les données transmises avec la demande, lorsque le " put " la méthode utilisée, la valeur null est retournée à chaque fois:
file_get_contents('php://input')
.
J'ai même téléchargé et testé le code complet de l'exemple dans le tutoriel et il renvoie toujours null.
Je suis à l'aide de cURL et la commande suivante afin de tester le " put " méthode:
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan
.
J'ai gâché jours et je n'ai toujours pas réussi à lire les données json. Ce que je fais mal?
Vous n'êtes pas, par hasard, la lecture de
Nope, j'ai essayé de lire une seule fois.
php://input
plus d'une fois? Voir le Note ici - php.net/manual/...Nope, j'ai essayé de lire une seule fois.
OriginalL'auteur Igor | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, j'ai été en mesure d'exécuter ce code et il a bien fonctionné:
Si cela ne fonctionne pas, vérifiez la console d'erreurs et de vos paramètres php:
tail -f /path/to/the/php/log/file
de sorte que vous pouvez réellement voir la sortie de ces php appels.file_get_contents(file://input): failed to open stream: no suitable wrapper could be found
qui peut indiquer soit une faute de frappe de la "file://input" de la chaîne ou le fait queallow_url_fopen
est désactivé en php (voir #5 en cas de doute)rappelez-vous,
file_get_contents
ne fonctionne que lorsqueallow_url_fopen
est définie sur true dans votre configuration PHP. c'est quelque chose qui est défini dans le php.ini, mais vous pouvez également modifier les paramètres au moment de l'exécution par l'écriture de quelque chose le long des lignes de code suivant avant le code des autres:C:\Users\Igor\Desktop\curl>curl -i -X PUT -d '{"address":"Sunset"}' http://local host/server.php HTTP/1.1 200 OK Date: Thu, 03 Oct 2013 07:53:54 GMT Server: Apache/2.2.21 (Win64) PHP/5.3.8 X-Powered-By: PHP/5.3.8 Content-Length: 0 Content-Type: text/html
Toujours rien. allow_url_fopen est trop.essayez d'exécuter curl sans
-i
drapeau et ajouter le-v
drapeau pour voir ce qu'il se passe. j'ai pratiquement jamais exécuter *ampli à piles sur windows, il peut donc y avoir quelque chose de funky y passe. aussi, essayez juste de la sortie d'une chaîne de caractères arbitraire dans cette réponse juste pour s'assurer que vous pouvez voir la sortie. Aussi, avez-vous regarder dans votre php_log pour voir si il n'y avait aucune erreur ne se produise?J'ai remplacé le
-i
drapeau avec-v
et toujours obtenu le même résultat. J'ai également ajouté print_r ("erreur") pour voir si elle allait se montrer et il l'a fait, mais$data
était encore vide. Le fichier journal est vide aussi. Peut-être que je devrais réinstaller wamp???J'ai même installé WAMP, XAMP et sur une autre machine et exécuté ce code et j'ai eu une chaîne de caractères vide. À l'aide de la
-v
drapeau m'a montré que tous les octets ont été envoyés. Je n'ai pas l'obtenir.vous n'avez toujours pas répondu à la question sur l'affichage de vos logs d'erreur php
OriginalL'auteur Kristian
J'ai écrit un headerfile avec ce code:
Il vérifie le bon content-type et il lit uniquement les données post, comme spécifié dans l'entête Content-Length.
Lors de la réception d'un JSON valide il a créé un Tableau global $_POST_JSON.
De sorte que vous pouvez travailler avec votre JSON-le Contenu similaire, comme vous le faites avec url-encodé valeurs POST.
Exemple:
OriginalL'auteur Radon8472
J'avais eu cette erreur trop, ma solution est de changer le format de données raw.
Je l'obtenir à partir doc php où il dire
OriginalL'auteur Timtcng.sen
Le bon appel de fonction est:
Vous devriez obtenir un message d'erreur disant que
php:input
n'existe pas...Dans tous les cas,
PUT
est prévu pour le téléchargement de fichiers sur le serveur, en supposant que le serveur la prend en charge. Habituellement, vous devriez utiliserPOST
avec unContent-Type
en-tête approprié pour le contenu.file_get_contents('php://input')
, j'ai édité la question.Votre question lit encore
php:input
...encore désolé il est tard et je suis fatigué
En regardant les notes dans le manuel, il ressemble à
PUT
les demandes ne sont pas vraiment idéales pour cela. EssayezPOST
à la place.Mais...
null
n'est pas une valeur de retour pourfile_get_contents
. Il peut renvoyer une chaîne de caractères, oufalse
. Jamaisnull
. Êtes-vous sûr que vous n'avez pas une faute de frappe quelque part? Comme peut-être le nom de la variable que vous utilisez pour stocker la chaîne de caractères?OriginalL'auteur Niet the Dark Absol
Sur Windows, la combinaison de " single "double" citations " ne semble pas fonctionner. L'utilisation d'échappement pour les citations dans vos données json (ci-dessous) & il doit travailler
OriginalL'auteur sambha
Je vois le problème,
Vous devez ajouter filename.php à la fin de l'url de la requête ou de la nécessité de réécrire les règles du serveur .fichier htaccess pour contourner ce problème.
remplacer {filename.php} avec le nom de fichier approprié. 🙂
OriginalL'auteur Mandan Sharma
Comme il est indiqué ailleurs sur le web,
php://input
contenu ne pas passer à travers si la requête est redirigée. Peut-être que votre serveur web a une redirection à partir d'une URL commençant par www pour une URL sans les www, ou à partir d'Url à l'aide de HTTP vers des Url en utilisant le protocole HTTPS. Vérifier vos journaux de serveur web pour vérifier cela, et d'agir en conséquence pour éviter la redirection lors de l'émission d'appels vers le service web.OriginalL'auteur Giulio Piancastelli