Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde galera,
Preciso criar um webservice em REST para um App Android, mas não sei nem por onde começar.
Li alguns artigos, mas nada muito direto.
Alguém pode ajudar? Mostrar um exemplo simples.. algo assim?
Na verdade eu queria um exemplo de como fazer o webservice com REST
O que o Evandro passou é um exemplo simples de uma API/WS feita usando REST. Algo ainda mais simples:
GET /users - Retorna uma lista de usuários
GET /users/1 - Retorna o usuário de ID 1
POST /users - Adiciona um usuário no sistema
PUT /users - Atualiza as informações de um usuário
DELETE /users - Apaga um usuário do sistema
Usando o .htaccess para reescrever as URLs:
RewriteEngine On
RewriteRule ^users$ users.php
Arquivo users.php
<?php
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'POST':
$user = new User;
$user->setName( $_POST['name'] );
$users->create( $user );
echo json_encode( array('status' => 200 ) );
break;
case 'GET':
if ( isset( $_GET['id'] ) )
$data = $users->get( $user, $_GET['id'] );
else
$data = $users->getAll( $user );
echo json_encode( array( 'status' => 200, 'content' => $data ) );
break;
//Demais métodos DELETE, PUT...
}
?>
Primeiramente, mapeie todos os recursos que precisa para seu webservice, depois, planeje as URLs para acessar casa serviço.
Pode ser via htaccess ou por um roteamento do seu sistema.
Depois parta para a implementação, o exemplo que o Evandro passou está muito bacana para começar
Vocês não estão entendendo a situação rsrsrsrs
Preciso saber como começar.. tipo um hello world =D
RESTful é uma arquitetura que fornece um meio de alcançar um ecossistema já pronto.
O seu ecossistema já está pronto?? O que você precisa fornecer via REST? Produtos? Usuários? Fotos?
O Hello, World já foi dado, tanto na documentação da Marvel quanto na explicação do @Jonaslhp.
Isso, preciso fornecer dados de usuários, clientes, produtos, etc para um server, afim de ser consumido por um app android.
Alguns exemplos já foram dados, ficaria mais fácil se você formulasse dúvidas mais concretas...
O seu ecossistema já está pronto?? O que você precisa fornecer via REST? Produtos? Usuários? Fotos?
Isso, preciso fornecer dados de usuários, clientes, produtos, etc para um server, afim de ser consumido por um app android.
Isso já está pronto pra ser acessado por uma "navegação normal"?
A primeira parte é básica e não muda nada do que você já deveria estar acostumada, quando todas as ações estiverem prontas e funcionando, entraremos com o suporte a requisições RESTful
Já existe um sistema online pronto com os dados.
O que preciso é disponibilizar alguns desses dados no Service para o app android consumir.
O que preciso saber é: Como disponibilizar os dados do meu banco mysql online em um service REST.
O que o Evandro quis dizer é para criar o acesso, por hora, pelo navegador (URL) para o que você deseja disponibilizar. Não precisa possuir tela para o retorno, um echo/print/var_dump é o suficiente por agora. Se você exibir os dados como json fica interessante também. Parecido com o exemplo do post #4.
O que preciso saber é: Como disponibilizar os dados do meu banco mysql online em um service REST.
Se você já tem tudo pronto, como faz para acessar os dados do sistema sem o REST? Exemplo:
http://seuservidor.com.br/api/usuarios.php?acao=listarTodosOsUsuarios
Não usamos MVC.. criamos tudo "na unha" sem framework (o que acho um erro, mas enfim).
MVC é independente de framework, e vice-versa. Se atente ao seguinte:
Suponhamos que você tenha um arquivo usuarios.php, que retorna a lista de todos os usuários cadastrados no sistema, algo parecido com:
<?php
$sql = "SELECT `id`, `nome`, `idade` FROM `usuarios`;";
$query = mysqli_query( $sql );
if ( mysqli_num_rows( $query ) > 0 ) {
$retorno = array();
while( $resultado = mysqli_fetch_array( $query ) ) {
$retorno[] = array(
'id' => $resultado['id'],
'nome' => $resultado['nome'],
'idade' => $resultado['idade']
);
}
echo json_encode( array( 'content' => $resultado ) );
} else {
echo json_encode( array( 'msg' => 'Nenhum usuário disponível.' ) )
}
Então, para acessar essa lista de usuário SEM o RESTful, seria algo mais ou menos assim:
http://seuservidor.com.br/usuarios.php
E, para acessar um único usuário com base no seu ID, você teria um arquivo mais ou menos assim:
<?php
$id = (int)$_GET['id'];
$sql = "SELECT `id`, `nome`, `idade` FROM `usuarios` WHERE `id` = " . $id ";";
$query = mysqli_query( $sql );
if ( mysqli_num_rows( $query ) > 0 ) {
$resultado = mysqli_fetch_array( $query );
$retorno = array(
'id' => $resultado['id'],
'nome' => $resultado['nome'],
'idade' => $resultado['idade']
);
echo json_encode( array( 'content' => $resultado ) );
} else {
echo json_encode( array( 'msg' => 'Nenhum usuário disponível para este ID.' ) );
}
E para acessar:
http://seuservidor.com/usuarios.php?id=1
O retorno:
{
id: 1,
nome: "Usuário do Imasters Fórum PHP",
idade: 190
}
Transformando isto para RESTful, tudo o que você precisaria fazer é criar um arquivo único que manipule todos os verbos HTTP de um serviço, e redirecione para o método arquivo correto. Exemplo:
usuarios.php:
<?php
require 'usuarios_acoes.php';
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'GET':
if ( isset( $_GET['id'] ) ) {
echo listar_usuario_por_id( $_GET['id'] );
} else {
echo echo listar_todos_usuarios();
}
break;
case 'POST':
//chama função para inserir o usuário
//echo inserir_usuario();
break;
case 'PUT':
//chama função para editar o usuário
//echo editar_usuario($_GET['id']);
break;
case 'DELETE':
//chama função para deletar o usuário
//echo deletar_usuario($_GET['id']);
break;
default:
echo json_encode( 'Método HTTP não permitido.' );
break;
}
E no arquivo usuarios_acoes.php:
<?php
function listar_todos_usuarios()
{
$sql = "SELECT `id`, `nome`, `idade` FROM `usuarios`;";
$query = mysqli_query( $sql );
if ( mysqli_num_rows( $query ) > 0 ) {
$retorno = array();
while( $resultado = mysqli_fetch_array( $query ) ) {
$retorno[] = array(
'id' => $resultado['id'],
'nome' => $resultado['nome'],
'idade' => $resultado['idade']
);
}
return json_encode( array( 'content' => $resultado ) );
} else {
return json_encode( array( 'msg' => 'Nenhum usuário disponível.' ) )
}
}
function listar_usuario_por_id( $id )
{
$id = (int)$_GET['id'];
$sql = "SELECT `id`, `nome`, `idade` FROM `usuarios` WHERE `id` = " . $id ";";
$query = mysqli_query( $sql );
if ( mysqli_num_rows( $query ) > 0 ) {
$resultado = mysqli_fetch_array( $query );
$retorno = array(
'id' => $resultado['id'],
'nome' => $resultado['nome'],
'idade' => $resultado['idade']
);
return json_encode( array( 'content' => $resultado ) );
} else {
return json_encode( array( 'msg' => 'Nenhum usuário disponível para este ID.' ) );
}
}
Bastaria então fazer apenas uma reescrita em um arquivo .htaccess:
RewirteEngine On
RewirteRule ^usuarios/?$ usuarios.php [QSA]
E então, para acessar seu sistema via RESTful:
Pegar todos os usuarios:
GET http://seuservidor.com.br/usuarios
Pegar somente um pelo ID:
GET http://seuservidor.com.br/usuarios/1
A parte mais 'difícil' do RESTful é retornar os cabeçalhos corretos e manter uma semântica adequada na URL. Por exemplo, em caso de retorno com sucesso, dispare um header 200:
header("HTTP/1.1 200 OK");
Evite também de fazer coisas assim:
GET usuarios/listar
Se você já está usando GET, quer dizer que você quer recuperar alguma informação, então, use apenas:
GET usuarios/
Ou, outro exemplo:
PUT usuarios/editar/1/
Isto é errado, faça:
PUT usuarios/
E envie o ID e os dados a serem editados pelo corpo do PUT quando fazer a requisição...
Claro que são só exemplos para você pegar a idéia...
Caraca.. agora abriu minha cabeça. .valeu mesmo Jonaslhp. .vou testar o>
Quando tendo fazer o GET pelo id não retorna o resultado esperado, mas sim continua a listagem completa "/
Só passa com o id quando faço da seguinte forma:
http://servidor.com.br/usuarios.php?id=12
Não funciona quando tento:
Você vai precisar implantar um sistema de URL's amigáveis. Pesquise sobre o assunto.
Você vai precisar implantar um sistema de URL's amigáveis. Pesquise sobre o assunto.
Opa.. consegui fazer a URL amigável funfar e os GET estão ok também, mas estou com dificuldade para criar o POST.
Pode enviar um exemplo de como criar a função para o POST?
<?php
/* apenas operação de inclusão */
require 'usuarios_acoes.php';
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'POST':
//chama função para inserir o usuário
echo inserir_usuario();
break;
default:
echo json_encode( 'Método HTTP não permitido.' );
break;
}
usuarios_acoes.php
<?php
function inserir_usuario()
{
}Qual especificamente sua dúvida? Qual sua dificuldade ao criar o POST?
Quem vai usar o $_POST é quem vai consumir seu webservice. Você só precisa usar a variável global para recuperar os dados. Exemplo:
<?php
case 'POST':
//chama função para inserir o usuário
$post = filter_input_array( INPUT_POST , array(
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_SANITIZE_STRING,
) );
if ( count( $_POST ) > 0 && count( $post ) > 0 ) {
echo inserir_usuario( $post );
} else {
echo json_encode( 'Post inválido' );
}
break;
function inserir_usuario( $post ) {
$nome = $post['nome'];
$email = $post['email'];
if ( empty( $nome ) || empty( $nome ) ) {
return json_encode( 'Dados inválidos' );
}
$sql = "INSERT INTO `usuarios` (`nome`, `email`) VALUES ('" . $nome . "', '" . $email . "');";
$query = mysqli_query( $sql );
if ( $query ) {
/*
* A variável $link deve ser a conexão do banco de dados. Ex.:
* $link = mysqli_connect("localhost", "my_user", "my_password", "world");
*
* @see [http://www.php.net/manual/pt_BR/function.mysqli-connect.php](http://www.php.net/manual/pt_BR/function.mysqli-connect.php)
* @see [http://www.php.net/manual/pt_BR/mysqli.insert-id.php](http://www.php.net/manual/pt_BR/mysqli.insert-id.php)
*/
return json_encode( array( 'id' => (int)mysqli_insert_id( $link ) ) );
}
}
Ou seja, dentro do *switch*, você vai tratar e receber os dados usando a variável global $_POST. E no arquivo usuarios_acoes.php, você vai inserir os dados no banco recebendo como parâmetro os dados do $_POST. Eu usei como exmeplo a função [filter_input_array](http://www.php.net/manual/pt_BR/function.filter-input-array.php) para facilitar, pois ela já *sanitiza* os dados vindos via POST e guarda tudo num array. Assim você não precisa encher sua função *inserir_usuario()* de parâmetros...ele recebe apenas um.
Uma maneira fácil de você testar requisições POST, se usar o Google Chorme, é instalando uma extensão nele:
https://chrome.google.com/webstore/detail/rest-console/cokgbflfommojglbmbpenpphppikmonn?hl=en-US
Olá Jonaslhp,
A minha dúvida era exatamente como filtrar e tratar as os dados vindos do POST.
Estou fazendo da seguinte forma:
<?php
/ apenas envia os pedidos /
require 'pedidos_acoes.php';
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'POST':
//chama função para inserir pedidos
$post = filter_input_array( INPUT_POST , array(
'cd_cliente' => FILTER_SANITIZE_STRING,
'id_status' => FILTER_SANITIZE_STRING,
) );
if ( count( $_POST ) > 0 && count( $post ) > 0 ) {
echo inserir_pedidos( $post );
} else {
echo json_encode( 'Post inválido' );
}
break;
default:
echo json_encode( 'Método HTTP não permitido.' );
break;
}
<?php
function inserir_pedidos()
{
require_once('mysqli.php');
$cd_cliente = $post['cd_cliente'];
$id_status = $post['id_status'];
if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {
return json_encode( 'Dados invalidos' );
}
$sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');";
$query = mysqli_query( $sql );
if ( $query ) {
return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) );
}
}
Mas está retornando "Dados inválidos".
Já estava usando o Postman do Chorme para as requisições, mas o POST não funciona "/
Ao criar a função inserir_pedidos(), voc6e está fazendo assim:
function inserir_pedidos() {
//...
}
E deve ser assim:
function inserir_pedidos( $post ) {
//...
}
Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado.
Outro ponto é aqui:
if ( empty( $cd_cliente ) || empty( $id_status ) ) {
Deveria ser:
if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {
E também não use o
require_once('mysqli.php');
Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use:
global $MySQLi;
Logo no começo da função.
***Estes exemplos são apenas didáticos.
>
Olá Jonaslhp,
A minha dúvida era exatamente como filtrar e tratar as os dados vindos do POST.
Estou fazendo da seguinte forma:
<?php
/ apenas envia os pedidos /
require 'pedidos_acoes.php';
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'POST':
//chama função para inserir pedidos
$post = filter_input_array( INPUT_POST , array(
'cd_cliente' => FILTER_SANITIZE_STRING,
'id_status' => FILTER_SANITIZE_STRING,
) );
if ( count( $_POST ) > 0 && count( $post ) > 0 ) {
echo inserir_pedidos( $post );
} else {
echo json_encode( 'Post inválido' );
}
break;
default:
echo json_encode( 'Método HTTP não permitido.' );
break;
}
<?php
function inserir_pedidos()
{
require_once('mysqli.php');
$cd_cliente = $post['cd_cliente'];
$id_status = $post['id_status'];
if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {
return json_encode( 'Dados invalidos' );
}
$sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');";
$query = mysqli_query( $sql );
if ( $query ) {
return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) );
}
}
Mas está retornando "Dados inválidos".
Já estava usando o Postman do Chorme para as requisições, mas o POST não funciona "/
TESTE NO CHORME:
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.tcix.com.br/danny/arquivos.png&key=1e11c866dbeaacb5f149632dd3c381b233b31e6ca26e4cd926744a0b1a31f595" alt="arquivos.png" />
>
Ao criar a função inserir_pedidos(), voc6e está fazendo assim:
function inserir_pedidos() {
//...
}
E deve ser assim:
function inserir_pedidos( $post ) {
//...
}
Perceba que deve inserir o parâmetro $post ao criar a função. Se está recebendo a mensagem "Dados inválidos", é porque o método HTTP é POST, não está vazio e está chamando corretamente a função para inserir. Experimente fazer esta mudança e retorne aqui com o resultado.
Outro ponto é aqui:
if ( empty( $cd_cliente ) || empty( $id_status ) ) {
Deveria ser:
if ( empty( $cd_cliente ) || empty( $cd_cliente ) ) {
E também não use o
require_once('mysqli.php');
Dentro da função. Use fora, no começo do código para poder reutilizar em outras função e poupar processamento. Aí para usar a variável deste arquivo dentro da função, use:
global $MySQLi;
Logo no começo da função.
***Estes exemplos são apenas didáticos.
FUNCIONOU ... segue os códigos:
pedidos.php
<?php
/ apenas envia os pedidos /
require 'pedidos_acoes.php';
switch( $_SERVER['REQUEST_METHOD'] ) {
case 'POST':
//chama função para inserir pedidos
$post = filter_input_array( INPUT_POST , array(
'cd_cliente' => FILTER_SANITIZE_STRING,
'id_status' => FILTER_SANITIZE_STRING,
) );
if ( count( $_POST ) > 0 && count( $post ) > 0 ) {
echo inserir_pedidos( $post );
} else {
echo json_encode( 'Post inválido' );
}
break;
default:
echo json_encode( 'Método HTTP não permitido.' );
break;
}<?php
function inserir_pedidos($post)
{
require_once('mysqli.php');
$cd_cliente = $post['cd_cliente'];
$id_status = $post['id_status'];
if ( empty( $cd_cliente ) || empty( $id_status ) ) {
return json_encode( 'Dados invalidos' );
}
$sql = "INSERT INTO ti_pedidos (cd_cliente,id_status) VALUES ('".$cd_cliente."', '".$id_status."');";
$query = $MySQLi->query($sql) OR trigger_error($MySQLi->error, E_USER_ERROR);
if ( $query ) {
return json_encode( array( 'id' => (int)mysqli_insert_id( $MySQLi ) ) );
}
}
Muito obrigada pela ajuda.. vou marcar como Resolvido =D
Leu o post #21?
Leu o post #21?
Li sim, mas só vi depois que tinha mandando o outro post.. desculpe rsrs
Valeu pela ajuda o>
Uma última dúvida:
Quando a requisição é por ID, é obrigatório que seja inteiro?
Tenho uma tabela que o ID é o código do produto e nesse código pode existir letras entre os números.
Exemplo: http://127.0.0.1/site/produtos/F000600188
O começo da minha função é esse:
function listar_produto_por_id($id)
{
require_once('mysqli.php');
$id = (int)$id;
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";
....
}Não é obrigatório, usei no exemplo mais como um caguete (?) mesmo...No PHP + MySQL, costumo criar o ID sendo um campo numérico com auto incremento... Para validar, você pode fazer assim:
$id = filter_var($id, FILTER_SANITIZE_STRING);
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";
Ou ainda utilizar expressões regulares:
$id = preg_replace("/[0-9a-z]/i", "", $id);
$sql = "SELECT cd_produto, nm_produto FROM ti_produtos where cd_produto='".$id."'";
Com a expressão acima, o preg_replace vai limpar a variável retirando tudo que não for número ou letra de a-z.
Enfim, pode fazer a validação que quiser, ou melhor, a validação necessária para cada caso. Não é obrigatório usar o ID como um número inteiro não. :coolio:
Exemplo simples: http://developer.marvel.com/docs