DannyND 1 Denunciar post Postado Março 7, 2014 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? Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Março 7, 2014 Exemplo simples: http://developer.marvel.com/docs Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 10, 2014 Na verdade eu queria um exemplo de como fazer o webservice com REST Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 10, 2014 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áriosGET /users/1 - Retorna o usuário de ID 1POST /users - Adiciona um usuário no sistemaPUT /users - Atualiza as informações de um usuárioDELETE /users - Apaga um usuário do sistemaUsando o .htaccess para reescrever as URLs:RewriteEngine OnRewriteRule ^users$ users.phpArquivo 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 Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 10, 2014 Vocês não estão entendendo a situação rsrsrsrsPreciso saber como começar.. tipo um hello world =D Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Março 10, 2014 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. Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 11, 2014 Isso, preciso fornecer dados de usuários, clientes, produtos, etc para um server, afim de ser consumido por um app android. Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 11, 2014 Alguns exemplos já foram dados, ficaria mais fácil se você formulasse dúvidas mais concretas... Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Março 11, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 12, 2014 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. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Março 12, 2014 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. Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 12, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 12, 2014 Não usamos MVC.. criamos tudo "na unha" sem framework (o que acho um erro, mas enfim). Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 12, 2014 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... Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 12, 2014 Caraca.. agora abriu minha cabeça. .valeu mesmo Jonaslhp. .vou testar o> Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 20, 2014 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: http://servidor.com.br/usuarios/12 Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Março 20, 2014 Você vai precisar implantar um sistema de URL's amigáveis. Pesquise sobre o assunto. Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 25, 2014 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() { } Compartilhar este post Link para o post Compartilhar em outros sites
Jonaslhp 39 Denunciar post Postado Março 26, 2014 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 * @see 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 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 Compartilhar este post Link para o post Compartilhar em outros sites
DannyND 1 Denunciar post Postado Março 26, 2014 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 "/ Compartilhar este post Link para o post Compartilhar em outros sites