Comment obtenir le corps d'un POST dans php?
- Je soumettre POST à une page php suivantes:
{a:1}
C'est le corps de la demande (une demande POST).
En php, que dois-je faire pour extraire de la valeur?
var_dump($_POST);
n'est pas la solution, pas de travail.
- C'est une bonne question pour les gens qui cherchent à créer des Api RESTful. La plupart ne savent pas comment accéder aux premières données d'entrée soumis à leurs scripts comme il n'est pas disponible via le
$_POST
superglobale. C'est aussi (et surtout) dans le cas de requêtes PUT que le PHP n'a pas de correspondant superglobale. - Double Possible de Comment obtenir une demande de contenu (corps) en PHP?
- Il est intéressant de noter que le nom est $_POST est trompeuse, pas n'importe quel type de données à partir d'un POSTE demande d'être là, mais seulement lorsque le type de contenu application/x-www-form-urlencoded ou multipart/form-data
Vous devez vous connecter pour publier un commentaire.
Pour l'accès au corps d'entité d'une requête POST ou PUT (ou toute autre méthode HTTP):
Aussi, le
STDIN
constante est un déjà-open stream pourphp://input
, de sorte que vous pouvez faire:De la Manuel PHP entrée sur les flux e/Sdocs:
Spécifiquement, vous aurez envie de noter que la
php://input
flux, indépendamment de la façon dont vous accédez à un site web SAPI, n'est pas adressable. Cela signifie qu'il ne peut être lu qu'une seule fois. Si vous travaillez dans un environnement où de grandes HTTP organes compétents des entités sont régulièrement téléchargé vous pouvez maintenir la saisie dans sa forme de flux (plutôt que de mise en mémoire tampon comme le premier exemple ci-dessus).Pour maintenir le flux de ressources quelque chose comme cela peut être utile:
php://temp
vous permet de gérer la consommation de mémoire, car il va automatiquement basculer vers le système de fichier de stockage après une certaine quantité de données stockées (2M par défaut). Cette taille peut être manipulée dans le php.fichier ini ou en ajoutant/maxmemory:NN
, oùNN
est la quantité maximale de données à conserver en mémoire avant d'utiliser un fichier temporaire, en octets.Bien sûr, sauf si vous avez une très bonne raison de chercher sur le flux d'entrée, vous ne devriez pas avoir besoin de cette fonctionnalité dans une application web. La lecture de la requête HTTP du corps de l'entité une fois n'est généralement assez-ne pas garder les clients attendent toute la journée pendant que votre application figures quoi faire.
Noter que php://input n'est pas disponible pour des demandes de la spécification d'un
Content-Type: multipart/form-data
en-tête (enctype="multipart/form-data"
dans les formulaires HTML). C'est le résultat de PHP ayant déjà analysé les données de formulaire dans le$_POST
superglobale.php://input
est vide pourapplication/x-www-form-urlencoded
content-type (en plus demultipart/form-data
)php://input
est. Alors que sur le (Rapide)de CGI configurationsstream_get_contents(STDIN)
ne fonctionne pas,file_get_contents("php://input")
volonté.Une raison possible pour un vide
$_POST
est que la demande n'est pasPOST
, ou pasPOST
plus... Il peut avoir commencé comme post, mais a rencontré une301
ou302
rediriger quelque part, qui est passé àGET
!Inspecter
$_SERVER['REQUEST_METHOD']
pour vérifier si c'est le cas.Voir https://stackoverflow.com/a/19422232/109787 pour une bonne discussion de pourquoi cela ne devrait pas arriver, mais le fait encore.
POST
mais après inspection, il a été, en montrant qu'il étaitGET
. Une fois j'ai ajouté un/
à la fin de mon URL, il a commencé à montrer des POST. Bizarre!valeur de retour dans la gamme
$data
tableau associatif pour vérifier si chaque valeur est codée de la manière que vous désirez. Le "ruisseau-à-datatype" façon de voir les choses, peut-être simpliste, mais il peut ne pas être aussi efficace que de traiter avec l'encodage dans la "forme de flux" à l'aide d'un flux de filtre. Si vous êtes de ne pas traiter les problèmes d'encodage et simplement de la désinfection et de la validation, il vous manque une étape.Vérifier la
$HTTP_RAW_POST_DATA
variablephp://input
.$HTTP_RAW_POST_DATA
n'est pas disponible avecenctype="multipart/form-data"
.Si vous avez installé HTTP extension PECL, vous pouvez faire usage de la
http_get_request_body()
fonction pour obtenir les données du corps comme une chaîne de caractères.Si vous avez la pecl/http extension installée, vous pouvez également utiliser cette:
http_get_request_body()
a été explicitement fait pour obtenir le corps dePUT
etPOST
demandes conformément à la documentation http://php.net/manual/fa/function.http-get-request-body.phpjson_last_error() == JSON_ERROR_NONE
estfalse
, qu'un tableau vide doit être retourné. Que faire si quelqu'un a soumis XML ou YAML? Ajout d'un test pour le Content-Type et à partir de là.$_SERVER
superglobale pour les valeurs utiles pour vérifier.