Eu envio como POST para uma página php o seguinte:
{a:1}
Este é o corpo da solicitação (uma solicitação POST).
No php, o que devo fazer para extrair esse valor?
var_dump($_POST);
não é a solução, não está funcionando.
Eu envio como POST para uma página php o seguinte:
{a:1}
Este é o corpo da solicitação (uma solicitação POST).
No php, o que devo fazer para extrair esse valor?
var_dump($_POST);
não é a solução, não está funcionando.
Respostas:
Para acessar o corpo da entidade de uma solicitação POST ou PUT (ou qualquer outro método HTTP):
$entityBody = file_get_contents('php://input');
Além disso, a STDIN
constante é um fluxo já aberto para php://input
, portanto, você pode alternativamente:
$entityBody = stream_get_contents(STDIN);
Na entrada manual do PHP nos documentos de fluxos de E / S :
php: // input é um fluxo somente leitura que permite ler dados brutos do corpo da solicitação. No caso de solicitações POST, é preferível usar php: // input em vez de
$HTTP_RAW_POST_DATA
não depender de diretivas especiais do php.ini. Além disso, nos casos em que$HTTP_RAW_POST_DATA
não é preenchido por padrão, é uma alternativa potencialmente menos intensiva em memória para ativar always_populate_raw_post_data. php: // input não está disponível com enctype = "multipart / form-data".
Especificamente, você deve observar que o php://input
fluxo, independentemente de como você o acessa em uma SAPI da web, não é procurável . Isso significa que ele só pode ser lido uma vez. Se você estiver trabalhando em um ambiente em que grandes corpos de entidades HTTP são carregados rotineiramente, convém manter a entrada em sua forma de fluxo (em vez de armazená-la em buffer, como no primeiro exemplo acima).
Para manter o recurso de fluxo, algo como isto pode ser útil:
<?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
permite que você gerencie o consumo de memória, pois ele mudará de maneira transparente para o armazenamento do sistema de arquivos após o armazenamento de uma certa quantidade de dados (2M por padrão). Esse tamanho pode ser manipulado no arquivo php.ini ou anexando /maxmemory:NN
, onde NN
está a quantidade máxima de dados a serem armazenados na memória antes de usar um arquivo temporário, em bytes.
Obviamente, a menos que você tenha um bom motivo para procurar no fluxo de entrada, não precisará dessa funcionalidade em um aplicativo da web. A leitura do corpo da entidade de solicitação HTTP uma vez é geralmente suficiente - não deixe os clientes esperando o dia todo enquanto o aplicativo descobre o que fazer.
Observe que php: // input não está disponível para solicitações que especificam um Content-Type: multipart/form-data
cabeçalho ( enctype="multipart/form-data"
em formulários HTML). Isso resulta do PHP já ter analisado os dados do formulário no $_POST
superglobal.
php://input
está vazia para application/x-www-form-urlencoded
o tipo de conteúdo, bem como (para além multipart/form-data
)
php://input
está. Então, enquanto as configurações de CGI (rápidas) stream_get_contents(STDIN)
não funcionarem, funcionará file_get_contents("php://input")
.
valor de retorno na matriz
$data = json_decode(file_get_contents('php://input'), true);
$data
matriz associativa para verificar se cada valor está codificado da maneira que você deseja. A maneira de ver as coisas "fluxo para tipo de dados" pode ser simplista, mas pode não ser tão eficiente quanto lidar com a codificação no "formulário de fluxo" usando um filtro de fluxo. Se você não está lidando com problemas de codificação e simplesmente limpando e validando, está faltando uma etapa.
Uma possível razão para um vazio $_POST
é que a solicitação não está POST
, ou não está POST
mais ... Ela pode ter começado como postagem, mas encontrou um 301
ou 302
redirecionado para algum lugar, para o qual foi alternada GET
!
Inspecione $_SERVER['REQUEST_METHOD']
para verificar se é esse o caso.
Consulte https://stackoverflow.com/a/19422232/109787 para obter uma boa discussão sobre por que isso não deveria acontecer, mas ainda acontece.
POST
mas depois de inspecionar, estava mostrando que sim GET
. Depois de adicionar um /
no final do meu URL, ele começou a mostrar POST. Esquisito!
Verifique a $HTTP_RAW_POST_DATA
variável
php://input
. $HTTP_RAW_POST_DATA
não está disponível com enctype="multipart/form-data"
.
Se você instalou a extensão HTTP PECL, poderá usar a http_get_request_body()
função para obter dados do corpo como uma sequência.
Se você possui a extensão pecl / http instalada, também pode usar:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
estiver false
, que uma matriz vazia deve ser retornada. E se alguém tiver enviado XML ou YAML? Adicione um teste para o tipo de conteúdo e vá a partir daí.
$_SERVER
superglobal para obter valores úteis a serem verificados.
http_get_request_body()
foi feito explicitamente para obter o corpo PUT
e as POST
solicitações de acordo com a documentação http://php.net/manual/fa/function.http-get-request-body.php
$_POST
superglobal. Isso também é (especialmente) verdadeiro no caso de solicitações PUT, pois o PHP não possui superglobal correspondente.