file_get_contents (“php: // input”) ou $ HTTP_RAW_POST_DATA, qual é o melhor para obter o corpo da solicitação JSON?

120

file_get_contents("php://input")ou $HTTP_RAW_POST_DATA- qual é o melhor para obter o corpo da solicitação JSON?

E qual tipo de solicitação ( GETou POST) devo usar para enviar dados JSON ao usar o lado do cliente XmlHTTPRequest?

Minha pergunta foi inspirada nesta resposta: Como postar JSON para PHP com curl

Cite essa resposta:

De uma perspectiva de protocolo file_get_contents("php://input")é realmente mais correto, já que você não está realmente processando dados de formulário de várias partes http.

Manuel Bitto
fonte

Respostas:

195

Na verdade, php://inputpermite que você leia dados POST brutos.

É uma alternativa com menos memória intensiva para $ HTTP_RAW_POST_DATA e não precisa de nenhuma diretiva php.ini especial .

php://inputnão está disponível com enctype="multipart/form-data".

Referência: http://php.net/manual/en/wrappers.php.php

zaf
fonte
12
Além disso, a partir do PHP 5.6, ele $HTTP_RAW_POST_DATAé considerado obsoleto e php://inputpode ser reutilizado.
Chris Forrence
Veja também enable_post_data_reading.
Pacerier
json_decode (file_get_contents ('php: // input'), true) isso oferece suporte no PHP 7.1 para obter valores $ _GET da URL?
Kailas
$ HTTP_RAW_POST_DATA tornou-se obsoleto a partir do PHP 7
Daniel
15

php: // input é um fluxo somente leitura que permite a você 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, pois não depende de diretivas especiais do php.ini . Além disso, para os casos em que $ HTTP_RAW_POST_DATA não é preenchido por padrão, é uma alternativa potencialmente menos intensiva de memória para ativar always_populate_raw_post_data.

Fonte: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
fonte
4
Além disso, a partir do PHP 5.6, ele $HTTP_RAW_POST_DATAé considerado obsoleto e php://inputpode ser reutilizado.
Chris Forrence
14

file_get_contents (php: // input) - obtém os dados POST brutos e você precisa usar isso quando você escreve APIs e precisa de entrada XML / JSON / ... que não pode ser decodificada para $ _POST pelo PHP algum exemplo:

enviar por string JSON post

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
fonte
3

As regras usuais devem ser aplicadas para a forma como você envia a solicitação. Se a solicitação for para recuperar informações (por exemplo, um resultado de 'dica' de pesquisa parcial ou uma nova página a ser exibida, etc ...), você pode usar GET. Se os dados que estão sendo enviados fazem parte de uma solicitação para alterar algo (atualizar um banco de dados, excluir um registro, etc.), use o POST.

Do lado do servidor, não há razão para usar a entrada bruta, a menos que você queira pegar todo o bloco post / get data de uma só vez. Você pode recuperar as informações específicas que deseja através dos arrays _GET / _POST como de costume. Bibliotecas AJAX, como MooTools / jQuery, lidarão com a parte difícil de fazer as chamadas AJAX reais e codificar os dados do formulário em formatos apropriados para você.

Marc B
fonte
Esse é o ponto: eu quero pegar todo o bloco post / get data de uma só vez, porque JSON é um formato sem variável, ele representa apenas os dados.
Manuel Bitto
@Kucebe Não vejo por que isso é necessário, por que não colocar os dados JSON em um campo POST e pronto?
Pekka
Se você deseja o bloco JSON inteiro, por que não atribuir o bloco de texto JSON a um campo de formulário e enviá-lo assim? <input type="hidden" name="data" value="json data here" />é totalmente aceitável e permite que você recupere-o trivialmente do lado do servidor com $ _REQUEST ['dados'].
Marc B,
3
Incorporar JSON em um campo POST anula a finalidade da tag de tipo de conteúdo HTTP e não é tão bom para depuração no Fiddler e depuradores de navegador (que podem entender JSON). Além disso, muitas bibliotecas JavaScript de terceiros POSTAR cargas úteis JSON como aplicativo / json.
CyberMonk
2

Para dados JSON, é muito mais fácil fazer o POST como tipo de conteúdo "application / json". Se você usar GET, terá que codificar em URL o JSON em um parâmetro e é meio confuso. Além disso, não há limite de tamanho ao fazer o POST. O tamanho de GET é muito limitado (4K no máximo).

ZZ Coder
fonte
2
Freqüentemente, há um limite de tamanho para o POST, mas geralmente é bem alto. Verifique o seu php.ini.
Brad
2

Sua segunda pergunta é fácil, GET tem uma limitação de tamanho de 1-2 kilobytes no servidor e no navegador, portanto, qualquer tipo de quantidade de dados maior você teria que enviar por meio do POST.

Pekka
fonte