web-dev-qa-db-fra.com

Comment obtenir le corps d'un POST en php?

Je soumets comme POST à une page php ce qui suit:

{a:1}

C'est le corps de la requête (une requête POST).
En php, que dois-je faire pour extraire cette valeur?

var_dump($_POST); 

n'est pas la solution, ne fonctionne pas.

229

Pour accéder au corps d'entité d'une demande POST ou PUT (ou de toute autre méthode HTTP):

$entityBody = file_get_contents('php://input');

En outre, la constante STDIN est un flux déjà ouvert vers php://input, de sorte que vous pouvez également effectuer les opérations suivantes:

$entityBody = stream_get_contents(STDIN);

Depuis le entrée manuelle PHP sur les flux d’E/S docs :

php: // input est un flux en lecture seule qui vous permet de lire des données brutes à partir du corps de la demande. Dans le cas de POST requêtes, il est préférable d'utiliser php: // input au lieu de $HTTP_RAW_POST_DATA comme ne dépend pas de directives php.ini spéciales. De plus, dans les cas où $HTTP_RAW_POST_DATA n'est pas renseigné par défaut, il s'agit d'une alternative potentiellement moins gourmande en mémoire que l'activation de always_populate_raw_post_data. php: // L'entrée n'est pas disponible avec enctype = "multipart/form-data".

Spécifiquement, vous voudrez noter que le flux php://input, quel que soit le moyen d'y accéder dans un SAPI Web, n'est pas recherchée . Cela signifie qu'il ne peut être lu qu'une seule fois. Si vous travaillez dans un environnement où des corps d'entités HTTP volumineux sont régulièrement téléchargés, vous pouvez conserver l'entrée sous sa forme de flux (plutôt que de la mettre en mémoire tampon comme dans le premier exemple ci-dessus).

Pour maintenir la ressource de flux, cela peut être utile:

<?php

function detectRequestBody() {
    $rawInput = fopen('php://input', 'r');
    $tempStream = fopen('php://temp', 'r+');
    stream_copy_to_stream($rawInput, $tempStream);
    rewind($tempStream);

    return $tempStream;
}

php://temp vous permet de gérer la consommation de mémoire car il basculera de manière transparente sur le stockage du système de fichiers après le stockage d'une certaine quantité de données (2M par défaut). Cette taille peut être manipulée dans le fichier php.ini ou en ajoutant /maxmemory:NN, où NN est la quantité maximale de données à conserver en mémoire avant l'utilisation d'un fichier temporaire, en octets.

Bien sûr, à moins que vous n'ayez une très bonne raison de rechercher dans le flux d'entrée, vous ne devriez pas avoir besoin de cette fonctionnalité dans une application Web. Il suffit généralement de lire le corps d'entité de la requête HTTP une seule fois. Ne laissez pas les clients attendre toute la journée pendant que votre application détermine quoi faire.

Notez que l'entrée php: // n'est pas disponible pour les demandes spécifiant un en-tête Content-Type: multipart/form-data (enctype="multipart/form-data" dans les formulaires HTML). Cela résulte du fait que PHP a déjà analysé les données du formulaire dans le super-global $_POST.

484
rdlowrey

Une raison possible pour un $_POST vide est que la requête n'est pas POST, ou pas POST ... Elle a peut-être commencé en tant que publication, mais a rencontré un 301 ou 302 redirige quelque part, qui passe à GET!

Inspectez $_SERVER['REQUEST_METHOD'] pour vérifier si c'est le cas.

Voir https://stackoverflow.com/a/19422232/109787 pour une bonne discussion sur les raisons pour lesquelles cela ne devrait pas se produire alors que cela se produit toujours.

10
Legolas

valeur de retour dans un tableau

 $data = json_decode(file_get_contents('php://input'), true);
4
umesh bhanderi

Vérifiez la variable $HTTP_RAW_POST_DATA)

3
linepogl

Si vous avez l'extension pecl/http installée, vous pouvez également utiliser ceci:

$request = new http\Env\Request();
$request->getBody();
2
spinkus

Si vous avez installé l'extension HTTP PECL, vous pouvez utiliser la fonction http_get_request_body() pour obtenir les données du corps sous forme de chaîne.

2
shivanshu patel

http_get_request_body() a été explicitement créé pour obtenir le corps des requêtes PUT et POST conformément à la documentation http://php.net/manual/fa/function.http-get -request-body.php

1
Yehuda Schwartz