Backend HTTP – Criando uma simples API REST com APACHE e PHP

Métodos dos Endpoints

Agora que nosso sistema irá chamar o método adequado segundo a Tabela de Roteamento, devemos criar estes métodos de fato. Para o exemplo deste artigo, como utilizamos métodos como: Usuario::obterUsuario, ou seja, classe Usuario, método obterUsuario, criaremos a classe dentro de um arquivo com o mesmo nome, dentro da pasta classes.

Crie o arquivo classes/Usuario.php, com o seguinte conteúdo:

 

Observe que cada método será chamado de acordo com a URI chamada. Como na tabela de roteamento,, utilizamos expressões regulares para poder obter trechos da URI, os matches serão passados pelo parametro $params. Caso o leitor execute as requisições criadas, estas strings devem ser retornadas corretamente.

Observe também que a primeira requisição pode ser testada facilmente em uma nova guia, porém as outras duas não funcionarão desse jeito, pois o navegador utiliza o método GET por padrão. Para testa-las, o leitor pode utilizar plugins para navegador ou serviços online, para que possa fazer requisições POST, DELETE ou outras. Eu utilizo o plugin Advanced REST Client para Google Chrome.

 

Formato de Resposta

Os formatos de resposta comuns para requisições REST são JSON, PNG/JPG (para imagens) e XML, sendo que o formato JSON tende a ser o formato mais utilizado para retornar os registros dos modelos de nossa plataforma. Uma resposta de uma requisição pedindo um usuário pode ter este formato:

 

Onde status é um código de retorno tabelado pelo próprio desenvolvedor, por exemplo, o status 1 pode significar OK (requisição completa com sucesso), o status 2 pode significar FORBIDDEN, onde pode significar que o usuário não tem permissão pra fazer aquela requisição. Lembrando que são somente exemplos, os status de retorno são definições do desenvolvedor. Caso a API se torne pública, é papel do desenvolvedor disponibilizar uma tabela descrevendo o significado de cada status para que o front-end possa fazer o tratamento correto, mostrando uma mensagem de erro ou refazendo a requisição de outra forma.

A requisição também retorna o que foi pedido, neste caso está definido no índice user, passando um único mapa com a resposta da requisição. Caso a requisição retorne mais de um registro, este mapa pode ser substituído por uma lista de mapas, com todos os registros de retorno. Mais uma vez reforçando a liberdade do desenvolvedor em desenvolver o formato de retorno que desejar, prezando o bom-senso e as boas práticas.

Iremos criar uma classe de apoio para auxiliar-nos nas requisições. Crie o arquivo classes/RequestUtil.php com a seguinte classe:

 

Observe que a classe só possui métodos estáticos e por estar dentro do diretório classes, ela pode ser acessada à partir de qualquer ponto da nossa aplicação.

O método RequestUtil::SendResponse($r) recebe um array contendo a resposta da requisição e à envia para o cliente, passando cabeçarios HTTP informando que a resposta é um JSON e para não realizar Cache, além de transformar o array do PHP em uma string JSON válida através da função json_encode e sai da aplicação.

O método RequestUtil::SendError($http_code, $errno, $errstr), pelo contrário, envia uma resposta de erro mais padronizada, sendo passado para esse método o código HTTP de resposta (por exemplo, podemos passar o erro 404 caso o endpoint não exista, ou 500 caso tenha ocorrido algum erro no servidor), além do código de erro, que como mencionado anteriormente, é definido pelo desenvolvedor. O método também recebe um parametro $errstr, que é uma string representativa do erro, para que desenvolvedores que utilizem a API possam entender rapidamente o erro sem a necessidade de consultar o manual.

 

Comentários