Parte 4 – Construindo a API para integração de dados

Neste artigo irei mostrar como construir a API (ou Webservice) para integração de dados, que será responsável por disponibilizar as informações do banco de dados para que diversas plataformas possam as consumir, incluindo nosso aplicativo mobile que iremos desenvolver na sequência.

Em linhas gerais, essa API irá se conectar ao banco de dados, consultar todos os registros salvos na tabela cliente e “montar um pacote” dessas informações, permitindo que um aplicativo mobile, por exemplo, capture esse pacote para listar os dados em um determinado momento.

ATENÇÃO: Para o pleno funcionamento da API, você deverá possuir uma hospedagem e 1 domínio, no qual serão utilizados para consumir os dados, nas quais essas questões ficarão mais claras durante este artigo.

Criando o diretório “API”

O primeiro passo é criar um novo diretório em nosso projeto (via FTP – FileZilla) chamado api, que irá ficar responsável por conter os arquivos de nossa API, incluindo o SlimFramework. Observe a imagem abaixo para ver como e onde será criado:


Slim Framework

Como falamos no início dessa série, para agilizar a construção de nossa API, iremos utilizar o framework Slim (http://www.slimframework.com/), que é uma biblioteca escrita sob a linguagem PHP, que irá garantir construirmos um serviço de acesso aos dados íntegro.

Em seguida, vou baixar a versão mais recente do Slim no site https://github.com/slimphp/Slim/releases. Após fazer o download, extraia a pasta “Slim” (veja aqui) e envie para a pasta api, recém-criada em nosso projeto, via FTP.

Observe abaixo como deverá ficar, até aqui, nosso diretório em questão:

 

Desenvolvendo o código da “API”

Neste momento, temos a base necessária para criar nossa API, permitindo acessar as informações do banco de dados de qualquer plataforma, através de pacotes.

Para isso, através do Notepad++, vamos criar um novo arquivo e salvá-lo, no diretório api, com o nome index.php. É este arquivo que orá ser responsável por receber as requisições, consultar o banco de dados, e gerar o pacote de informações que nosso aplicativo irá consumir.

Abaixo, segue o código-fonte deste arquivo index.php, que irá possibilitar realizar essas operações e realizar a comunicação do aplicativo com o servidor e banco de dados web:

<?php
# Definindo pacotes de retorno em padrão JSON...
header('Content-Type: application/json;charset=utf-8');

# Carregando o framework Slim...
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();

# Iniciando o objeto de manipulação da API SlimFramework
$app = new \Slim\Slim();
$app->response()->header('Content-Type', 'application/json;charset=utf-8');

# Função de teste de funcionamento da API...
$app->get('/', function () {
	echo "Bem-vindo a API do Sistema de Clientes";
});

# Função para obter dados da tabela 'cliente'...
$app->get('/clientes',function(){

	# Variável que irá ser o retorno (pacote JSON)...
	$retorno = array();

	# Abrir conexão com banco de dados...
	$conexao = new MySQLi("SERVIDOR","USUARIO_SERVIDOR","SENHA_DO_USUARIO","BANCO_DE_DADOS");

	# Validar se houve conexão...
	if(!$conexao){ echo "Não foi possível se conectar ao banco de dados"; exit;}

	# Selecionar todos os cadastros da tabela 'cliente'...
	$registros = $conexao->query("select * from cliente");

	# Transformando resultset em array, caso ache registros...
	if($registros->num_rows>0){
		while($cliente = $registros->fetch_array(MYSQL_BOTH)) {
			$registro = array(
						"CODIGO"   => $cliente["CODIGO"],
						"NOME" 	   => utf8_encode($cliente["NOME"]),
						"TELEFONE" => $cliente["TELEFONE"],
						"EMAIL"    => $cliente["EMAIL"],
					);
			$retorno[] = $registro;
		}
	}

	# Encerrar conexão...
	$conexao->close();

	# Retornando o pacote (JSON)...
	$retorno = json_encode($retorno);
	echo $retorno;

});

# Executar a API (deixá-la acessível)...
$app->run();
?>

Algumas considerações sobre esse código:

  • Linhas 14: método de teste da api, que irá resultar uma mensagem de abertura, mostrando que a API está ‘ok’.
    Para acessar a API e consumir esse método, acesse a URL http://diegocavalca.com/articles/sistemadeclientes/api/;
  • Linha 19: assinatura dos método ‘clientes’, responsável por buscar as registros salvos na tabela cliente e retornar esses dados para o usuário que a requisita. Para acessar a API e consumir esse método, acesse a URL http://diegocavalca.com/articles/sistemadeclientes/api/clientes;
  • Linha 25: aqui realizamos a conexão ao banco de dados, onde você deverá informar os dados de sua hospedagem;
  • Linha 50: após a consulta aos dados ser realizada e as informações já tratadas e salvas na variável $retorno (a partir da linha 35), nós geramos um pacote seguinte um padrão JSON, que nada mais é que uma notação de comunicação de dados baseado em texto.
    Esse padrão JSON permitirá que nosso aplicativo mobile “entenda” o que nossa API (mais precisamente no método ‘clientes’) retorna, possibilitando assim listar os dados resultantes na tela para o usuário. Para mais detalhes sobre JSON, acesse http://json.org/json-pt.html.

Em tempo, para o pleno funcionamento desses métodos, precisamos criar e incluir mais um arquivo na pasta api. Por isso, crie um novo arquivo no Notepad++, salve-o como .htaccess e insira o seguinte código-fonte:

RewriteEngine On

# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

Esse arquivo .htaccess é responsável por permitir que os métodos da API escritos no arquivo index.php – com base no SlimFramework – estejam acessíveis através de uma chamada URL, conforme vimos a pouco.

Com isso, terminamos a criação do ambiente web de nosso sistema, que inclui:

  • O banco de dados MySQL, com a tabela cliente;
  • Relatório de clientes;
  • API (Webservice) de integração de dados.

Vejamos abaixo a imagem que mostra, por completo, a estrutura final do ambiente web de nosso projeto e seus detalhes:

Para reforçar, o método da API que irá permitir a integração dos dados com o aplicativo mobile estará disponível através da URL http://diegocavalca.com/articles/sistemadeclientes/api/clientes.

Na próxima aula, pra finalizar essa série, irei desenvolver o aplicativo mobile, que irá consumir a API desenvolvida (e seu método ‘clientes’) para listar os clientes cadastrados no banco de dados MySQL no ambiente web.

Continue: Parte 5 – Criando o aplicativo mobile e integrando dados via API

Written by Diego Cavalca

Graduado em Análise e Desenvolvimento de Sistemas pela UNILINS em 2012, atualmente Mestrando em Ciência da Computação na Universidade Federal de São Carlos (UFSCar).

  • Denis Sousa

    Bom dia Cavalca…

    Parabéns pelos artigos no seu site, estou aprendendo bastante com eles.

    Estou tentando fazer os testes refazer o seu projeto no meu servidor porém quando na etapa de testar o API como apresentado acima com o arquivo index.php está dando um erro, a mensagem é:

    ______________________________________________________________________
    Warning: Unexpected character in input: ” (ASCII=92) state=1 in /home/storage/4/e7/bb/communion/public_html/appontme/sistemadeclientes/api/index.php on line 7

    Warning: Unexpected character in input: ” (ASCII=92) state=1 in /home/storage/4/e7/bb/communion/public_html/appontme/sistemadeclientes/api/index.php on line 7

    Parse error: syntax error, unexpected T_STRING in /home/storage/4/e7/bb/communion/public_html/appontme/sistemadeclientes/api/index.php on line 7
    ______________________________________________________________________

    O erro apontado refere se a essa parte do código:

    _________________________________________________
    # Carregando o framework Slim…
    require ‘Slim/Slim.php’;
    SlimSlim::registerAutoloader();
    ________________________________________________

    Vc tem ideia do que aconteceu?

    Muito obrigado desde de já

    Denis Sousa

  • Ronald Bandeira

    Diego o meu index.php dá este erro:

    PHP Fatal error: Class ‘SlimSlim’ not found in /home/rmob/public_html/sistemadeclientes/api/index.php on line 7

    Como resolvo esse problema?

    Obrigado

    • Ronald Bandeira

      Já resolvi. Faltava umas barras no SlimSlim

      # Carregando o framework Slim…
      require ‘Slim/Slim.php’;
      SlimSlim::registerAutoloader();

      • Creio que com a atualização do site o ‘backslash’ foi ignorado em alguns posts. Obrigado por avisar!

  • Roberto Oliveira

    Parabéns pelo artigo. Teria um exemplo de como minha app android possa fazer uma consulta nesse mesmo banco de dados em vez de retornar todos os registros retornar apenas aquele em que o usuário deseja consultar. Obrigado

    • Rafael S. Silva

      Roberto estou com a mesma duvida não preciso trazer todos os dados e sim realizar consultas você conseguiu fazer? pode me dizer como?

    • Roberto Oliveira

      Não consegui fazer ainda Rafael.

  • Henrique

    Dentro da api/index.php foi apresentado o seguinte erro:

    Warning: require(Slim/Slim.php): failed to open stream: No such file or directory in C:xampphtdocsdiegocavalcaapiindex.php on line 6

    Fatal error: require(): Failed opening required ‘Slim/Slim.php’ (include_path=’.;C:xamppphpPEAR’) in C:xampphtdocsdiegocavalcaapiindex.php on line 6

    Poderia me ajudar?

    • Derik Cesar

      estou com mesmo prolema

      • Filipe Melo

        Eu resolvi essa parte da seguinte forma:

        Coloquei a Pasta SLIM fora da pasta api, coloquiei na raiz, entao ficou:
        www/Slim

        Coloquei pasta API tambem na raíz, ficou:
        www/Api

        No index.php da API basta colocar:
        require ‘../Slim/Slim/Slim.php’;

        Vai funcionar

  • José Rodrigues Filho

    Boa noite, no meu caso não aparece nenhum dado quando entro em http://MEU-IP/articles/sistemadeclientes/api/clientes, pois da page not found, o resto esta certo, alguem sabe o que pode ser ? PHP 5.3 Ubuntu 12.04

    • Isac Ferreira

      Resolvi.

      Ativei o a2enmod rewrite, mudei o arquivo /etc/apache2/sites-available/default e reiniciei o apache2:

      De

      Options FollowSymLinks +ExecCGI
      AllowOverride None

      Para

      Options FollowSymLinks +ExecCGI
      AllowOverride All

      Vlw

  • Fred

    Diego, excelente artigo… facilita muito o trabalho de integração…. só estou com uma dúvida, como faço para colocar algum mecanismo de segurança para restringir o acesso à API.

  • Desconsidere a 1ª postagem! na versão mais nova do SLIM esta faltando slim.php baixei a versão Slim-2.6.2
    agora esta legal!

  • Mateus

    estou apresentando um problema com o apk já gerado, aparece a seguinte mensagem no App, ( o servidor não conseguiu processar o pedido. Tente novamente mais tarde… Porém no emulador do xdk funciona.

  • Isac Ferreira

    Olá, Diego. Excelente artigo, bem explicado.

    Como sugestão, era bom você informar as versões que você usou.

    Agora o problema:

    O /api/index.php funciona tranquilo. Mas o /api/clientes não está funcionando, diz erro 404.

    Tem como você me ajudar?

    Sds,

    • Isac Ferreira

      Resolvi.

      Ativei o a2enmod rewrite, mudei o arquivo /etc/apache2/sites-available/default e reiniciei o apache2:

      De

      Options FollowSymLinks +ExecCGI
      AllowOverride None

      Para

      Options FollowSymLinks +ExecCGI
      AllowOverride All

      Vlw

  • Alexandre Silva

    Olá Diego,
    Como posso fazer para aplicar uma clausula where?
    Tipo minha primeira tela tem um listview com os nomes dos bairros, então ao clicar num bairro abre outra pagina com os nomes dos clientes e, ao clicar no cliente abre outra pagina com os detalhes do mesmo.
    Desde já obrigado,

  • Wellington Pinho

    quando coloco o .htaccess Ele da erro interno no servidor, e ao tirar o arquivo da pasta tudo volta a funcionar. Posso usar esta api sem o .htaccess?

  • Bruno Rafael Fabri

    Olá Diego,
    no meu index.php não aparece

    Bem-vindo a API do Sistema de Clientes a tela fica toda branca
    o que pode ser ?

  • Bruno Teonácio

    Olá Diego,
    no meu o /api/clientes fica em 404 Page Not Found. poderia ajudar?

  • Rodrigo Gomes Pedrosa

    https://uploads.disquscdn.com/images/1f754459b5086f4231259c627e0797a93770989dd881d60ddcb660379bd58548.jpg https://uploads.disquscdn.com/images/57300fa379d78b6fdb87bbe3f5c6728c2af7965cd1845cdcf21b37146935f058.jpg

    Olá Diego Cavalca, o sistema está todo configurado corretamente, mas o sistema da API está retornando caracteres especiais, tipo: “São Pedro” a API está retornando “u00c3u0087 Pedro” O que posso fazer para resolver está questão, me ajudem aí pessoal.

  • Filipe Melo

    Diego, a minha pagina que equivale a sua api/clientes está retornando NotFound 404.
    A pasta API esta mostrando o reste corretamente.

    Pode me ajudar?

  • Francisco Alberto Coelho

    Baixei a versão Slim-2.3.0 e funcionou com as seguintes configurações:

    # Carregando o framework Slim…
    require ‘Slim/Slim/Slim.php’;
    SlimSlim::registerAutoloader();

    # Iniciando o objeto de manipulação da API SlimFramework
    $app = new SlimSlim();
    $app->response()->header(‘Content-Type’, ‘application/json;charset=utf-8’);

    Depois vejo como funcionar com a nova versão do Slim

  • Regina

    Diego, Criei um codigo semelhante ao seu mas dla erro de ausencia do arquivo slim.php. A versão que baixei foi a ultima 3.8.2.1. Pode me ajudar?