PHP se METTRE du corps de la requête
Je suis actuellement à l'élaboration d'un cadre Reposant Json API en PHP. Je veux envoyer une Demande à items/:id
pour mettre à jour un enregistrement. Les données seront transférées au application/json
.
Je tiens à appeler l'API avec
curl -H "Content-Type: application/json" -X PUT -d '{"example" : "data"}' "http://localhost/items/someid"
Sur le côté serveur, je ne suis pas en mesure de récupérer le corps de la requête. J'ai essayé
file_get_contents("php://input");
mais cela renvoie une chaîne vide. Aussi un fopen()
/fread()
combinaison ne fonctionne pas.
Lors de l'appel par la POSTE, tout fonctionne très bien, je peux lire le json parfaitement sur le côté serveur. Mais l'API n'est pas Reposante plus. Quelqu'un aurait-il une solution pour cela? Est-il une autre façon d'envoyer et de recevoir Json?
btw, je suis le développement de l'API avec les Slim Cadre.
Oui, ne fonctionne pas.
Génial que vous utilisez slim. J'espère que vous avez de bonnes expériences. J'ai vraiment apprécié mon SLIM api restful création
commentaire dans le manuel suggère que vous pourriez avoir besoin pour envoyer le Contenu de l'en-tête de Longueur (pas sûr si cURL fera automatiquement...) et l'utilisation
fopen
, plutôt que de file_get_contents
. Aucune idée de la façon exacte qui soit, mais il pourrait être intéressant de tenter...curl n'envoyer le Contenu de l'en-tête de Longueur, et également lors de l'envoi manuellement, rien ne change. Aussi fopen ne fonctionne pas.
OriginalL'auteur aladin | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
php://input
est uniquement lisible une fois pour METTRE les demandes:Le Slim framework déjà lit les données à la demande. Prendre les données de l'objet de la Requête, dans laquelle il a été lu.
+1 c'est mon problème à l'aide de la restTonic framework PHP. Le $this->request->variable de données déjà organisé le METTRE corps. J'avais lu php://input dans mon POSTE de gestionnaire et de ne pas voir pourquoi le METTRE gestionnaire ne pouvait pas utiliser la même méthode pour gérer son corps.
OriginalL'auteur deceze
Vous ne pouvez utiliser
file_get_contents( 'php://input', 'r' );
une fois par demande. La récupération de ses valeurs de tronquer les valeurs, ainsi, si vous appelez deux fois, il va renvoyer une chaîne vide. Slim l'objet de demande contient les valeurs que vous avez besoin, de sorte que:La question demeure; vous pouvez uniquement lire à partir de php://input , et Slim a déjà fait. Vous aurez à utiliser Slim demande de l'objet à vos valeurs.
Apparemment, le Slim Cadre de lit le corps de la requête lors de la construction, de sorte php://input a déjà été supprimée. thx!
C'était ce que j'essayais de transmettre, oui.
OriginalL'auteur Berry Langerak
L'exemple de la Manuel PHP utilise fopen pour accéder à php://input en mode de lecture. Avez-vous essayé de le faire de cette façon au lieu?
EDIT: Le page de manuel de PHP:// dit quelques trucs que semble suggérer que METTRE les données peuvent ne pas être disponibles dans certains cas!
Je ne sais pas où tout cela va laisser vous au sujet de METTRE de traitement. Une page semble dire que c'est possible, l'autre semble impliquer qu'il ne fonctionne pas sous le mauvais jeu de circonstances
OriginalL'auteur GordonM
Je lisais le SLIM framework documentation, l'autre jour et il a dit que certains navigateurs ont des problèmes avec PUT et DELETE.
Extrait:
Malheureusement, les navigateurs modernes ne fournissent pas de support natif pour METTRE les demandes. Pour contourner cette limitation, vous assurer que votre formulaire HTML de la méthode “post”, puis ajouter une méthode de remplacer le paramètre de votre formulaire HTML comme ceci:
Source: http://www.slimframework.com/documentation/stable
Je suis un peu nouveau à cela, mais n'cURL simplement renoncer le problème de navigateur? Si il est en train de faire la demande curl via PHP et c'est la ligne de commande équivalente? (Je ne dis pas qu'il est, je dis que serait la ligne de commande cURL bénéficier existe encore)
oui, à l'aide de cURL renonce le problème de navigateur. Aucun navigateur jeu, c'est la façon dont il demande le service.
curl génère des premières requêtes HTTP et vous avez le plein contrôle sur tous les détails de la demande. PUT/POST est juste un verbe HTTP laquelle vous pouvez définir avec
-X PUT
sur la ligne de commande et similaires drapeaux dans d'autres emballages. Oui, curl prend en charge les METTRE, seuls les navigateurs ne le font pas.OriginalL'auteur Jake