Enviar dados POST via json bruto com carteiro


107

Eu tenho Postman (aquele que não abre no Chrome) e estou tentando fazer uma solicitação POST usando json bruto.

Na guia Body, selecionei "raw" e "JSON (application / json)" com este corpo:

{
    "foo": "bar"
}

Para o cabeçalho, tenho 1, Content-Type: application/json

No lado do PHP, estou fazendo apenas print_r($_POST);por agora, e estou obtendo um array vazio.


Se eu usar jQuery e fizer:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Estou recebendo conforme o esperado:

Array
(
    [foo] => bar
)

Então, por que não está funcionando com o Postman?


Capturas de tela do Postman:

insira a descrição da imagem aqui

e cabeçalho:

insira a descrição da imagem aqui


Tente $ _REQUEST em vez de $ _POST e var_dump () em vez de print_r ()
Profundo

@Deep recebo array(1) {["foo"]=> string(3) "bar"}com jQuery e ainda um array vazio com Postman:array(0) {}
Dallas

Postman not send request
Deep

@smerny em sua postagem fieldse foonão corresponderá, portanto, não funcionará. Não tenho certeza se é um erro de digitação, mas certifique-se de que correspondem
meda

@meda, isso foi um erro de digitação, mas se eu tivesse campos, ele ainda deveria ter saída no arquivo var de $ _REQUEST ou $ _POST
Dallas

Respostas:


38

Ao contrário jQuery, para ler raw, JSONvocê precisará decodificá-lo em PHP.

print_r(json_decode(file_get_contents("php://input"), true));

php://input é um fluxo somente leitura que permite ler dados brutos do corpo da solicitação.

$_POSTsão variáveis ​​de formulário, você precisará alternar para o botão de formrádio em postmanseguida, use:

foo=bar&foo2=bar2

Para postar cru jsoncom jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});

sim postagem exata json vs variáveis ​​de postagem são diferentes
meda

43

Basta marcar a opção JSON na lista suspensa ao lado de binário; quando você clica em bruto. Isso deve servir

habilidade synon passar json para carteiro


4
este é um post bastante antigo .. mas se você olhar a pergunta você verá que eu fiz exatamente isso. você pode querer ler a pergunta, a resposta selecionada e os comentários sobre a resposta selecionada para entender melhor o problema e a solução.
Dallas

1
Claro, mas isso realmente localizou o problema que eu tinha; Eu tinha "Texto" selecionado, não application / json, embora isso já tenha sido mencionado na seção Cabeçalhos. É confuso; se você escolher "Texto", todo o "código" HTTP POST será exibido, incluindo o JSON, que eu esperava que funcionasse, já que é uma chamada POST completa, não apenas o json.
Ted de

7

A resposta da meda é completamente legítima, mas quando copiei o código, ocorreu um erro!

Em algum lugar do "php://input"há um caractere inválido (talvez uma das aspas?).

Quando digitei o "php://input"código manualmente, funcionou. Levei um tempo para descobrir!


1
Ainda bem que rolei um pouco mais para baixo e vi isso - eu estava tendo o mesmo problema. Bom achado!
Charlie Stanard de

2
Parece que alguém corrigiu em uma edição da postagem de meda. Mas eu olhei para o histórico de edição e descobri que a postagem original tinha 200c 200b(caracteres de largura zero) entre o "n" e o "p" em "entrada". Não tenho certeza de como ele terminou com isso, mas está consertado agora.
Dallas

6

Eu estava enfrentando o mesmo problema, o seguinte código funcionou para mim:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);


1

Instale o aplicativo nativo Postman, a extensão do Chrome foi descontinuada. (O meu estava abrindo na própria janela, mas ainda funcionava como aplicativo do Chrome)


2
Isso não responde à pergunta.
jhpratt de

@jhpratt realmente faz. Eu tive o mesmo problema. Quando usei o app Postman, funcionou. A pergunta é: então por que não está funcionando com o Postman?
Jaroslav Štreit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.