Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera.
Estou precisando muito de uma ajuda, estou criando uma rest api e resolvi utilizar o Slim, o GET funciona perfeitamente, porem o POST está indo vazio, já segui uns 10 tutorias e sempre gravava apenas o ID na tabela do MySQL, isso por que o mesmo é auto increment, então resolvi verificar o retorno após o inserir, e pude observar que o POST sempre vai vázio, já tentei descobrir o por que e ainda não consegui, já instalei WAMP, XAMP, EasyPHP, Bitnami (pois desconfiava que poderia ser o Apache) porem em nenhum deu certo.
Código:
<?php
/* Require Slim and plugins */
require 'Slim/Slim/Slim.php';
/* Register autoloader and instantiate Slim */
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->response()->header('Content-Type', 'application/json;charset=utf-8');
$app->get('/', function () {
echo "Helena Starter > Acompanha Fácil API";
});
$app->post('/users','addUser');
$app->get('/users','getUsers');
$app->run();
function getConn(){
return new PDO(
'mysql:host=localhost;dbname=hs.outjob.acompanhafacil.v100',
'root',
'',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
}
function addUser(){
$request = \Slim\Slim::getInstance()->request();
$user = json_decode($request->getBody());
$sql = "Insert Into tb_users(nome, usuario, senha) Values(:nome,:usuario,:senha)";
$conn = getConn();
$stmt = $conn->prepare($sql);
$stmt->bindParam("nome",$user->nome);
$stmt->bindParam("usuario",$user->usuario);
$stmt->bindParam("senha",$user->senha);
$stmt->execute();
$user->id = $conn->lastInsertId();
echo json_encode(array($user->id));
}
function getUsers(){
$stmt = getConn()->query("Select * From tb_users");
$users = $stmt->fetchAll(PDO::FETCH_OBJ);
echo "{users:".json_encode($users)."}";
}
?>
Script da tabela:
DROP TABLE IF EXISTS `tb_users`;
CREATE TABLE `tb_users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nome` varchar(60) DEFAULT NULL,
`usuario` varchar(30) DEFAULT NULL,
`senha` varchar(255) DEFAULT NULL,
`tipo` int(255) DEFAULT NULL,
`fone` varchar(20) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`endereco` varchar(70) DEFAULT NULL,
`complemento` varchar(20) DEFAULT NULL,
`numero` varchar(10) DEFAULT NULL,
`id_cidade` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1;
Agradeceria muito se alguém pude-se indicar onde está o erro, já verifiquei o .htaccess e aparentemente está normal, não sei mais o que pode ser.
Bom dia, primeiramente obrigado pelo seu tempo Beraldo.
O teste na realidade já fiz pegando o $request->getBody() e imprimindo na tela, e o mesmo veio vazio, para testar o rest estou utilizando uma ferramenta do chrome.
Sou um pouco leigo em PHP, más dentro da função addUser(), não possui $_POST.
Lembrando que estou enviando os dados via curl.
Sou um pouco leigo em PHP, más dentro da função addUser(), não possui $_POST.
Sim, não possui mesmo.
Por isso eu falei pra testar direto com $_POST, pra garantir que não é algum problema interno do Slim.
Apenas adicione:
print_r($_POST);
Imprimiu Array()
É um array vazio.
Você não está enviando parâmetros no POST. O problema não está no PHP, está na forma como você está fazendo a requisição
Um simples teste via cURL no terminal:
curl -F "campo=valor" http://seusite.com/users/
Com curl deu certo, agora estou com dúvidas se o problema está nas ferramentas que estava utilizando ou no rest, pois utilizei 3 diferentes ferramentas para teste e o resultado era o mesmo, até habilitei o debug no slim e retornou uma mensagem sobre depreciação de função, não recordo ao certo.
Parece bobo mas o que pude observar é que com as ferramentas eu envio campo:valor, já com o curl envio campo=valor, isso pode ter algo relacionado com o não post?
Com curl deu certo, agora estou com dúvidas se o problema está nas ferramentas que estava utilizando ou no rest
Com certeza é. Afinal, deu certo ao usar curl no terminal
Parece bobo mas o que pude observar é que com as ferramentas eu envio campo:valor, já com o curl envio campo=valor, isso pode ter algo relacionado com o não post?
Tudo depende de como a aplicação processa os dados.
Não há regra. Você precisa ver na documentação de cada uma qual é o formato correto para envio
Via curl no terminal, é "campo=valor", mas uma aplicação gráfica pode receber em qualquer formato, desde que envie no formato correto depois para o servidor
Olá, peguei uma dica com um colega e estou fazendo o post com o seguinte ContentType: application/x-www-form-urlencoded
Dessa vez o $_POST teve retorno, como se o formato Json de envio estive-se inválido, não grava na tabela más resulta em: Array([{"nome":"Fulano de Tal"}] =>)
Finalmente rolou, enviei exatamente como o curl envia, campo=valor, ai deu certo, enviando como json não deu.
Muito obrigado por sua ajuda, foi fundamental na solução do problema.
Dentro da função addUser(), dê um print_r em $_POST e veja o que é exibido. Se você requisitar a URL pelo método POST, tem que aparecer algo