Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DannyND

WebService em REST

Recommended Posts

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vocês não estão entendendo a situação rsrsrsrs
Preciso saber como começar.. tipo um hello world =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.