REST API em PHP

Existem abordagens especiais que padronizam APIs para a conveniência geral tanto dos desenvolvedores da API quanto de seus usuários.

Uma dessas abordagens é a REST API. Sua base está na ideia de que para operações CRUD é necessário utilizar vários métodos do protocolo HTTP.

Para obter dados - o método GET, para criar dados - o método POST, para alterar dados - o método PUT, para excluir dados - o método DELETE.

Como exemplo, vamos considerar uma API que manipula usuários. Vamos ver como ficariam as URLs para várias ações.

Obtendo todos os usuários:

urlGET http://api.loc/users/

Obtendo um usuário pelo seu id:

urlGET http://api.loc/user/1/

Criando um usuário:

urlPOST http://api.loc/user/

Alterando um usuário pelo seu id:

urlPUT http://api.loc/user/1/

Excluindo um usuário pelo seu id:

urlDELETE http://api.loc/user/1/

Vamos ver como uma REST API é implementada em PHP. Existe um certo problema aqui. O fato é que tanto o PHP quanto o CURL suportam apenas os métodos GET e POST:

api.loc/index.php<?php
  $method = $_SERVER['REQUEST_METHOD'];
  var_dump($method); // apenas GET e POST
?>

Portanto, para implementar uma REST API, teremos que recorrer a um truque. Sua essência está no fato de que, na realidade, os dados serão transmitidos apenas pelos métodos GET e POST, mas nós iremos simular o trabalho de outros métodos usando um cabeçalho HTTP personalizado. Vamos chamá-lo, por exemplo, de HTTP-X-HTTP-METHOD.

Assim, poderemos obter o conteúdo deste cabeçalho da seguinte forma:

api.loc/index.php<?php
  $method = $_SERVER['HTTP-X-HTTP-METHOD'];
?>

Agora podemos escrever a implementação da API:

api.loc/index.php<?php
  $method = $_SERVER['HTTP-X-HTTP-METHOD'];
  
  switch ($method)  {
    case 'GET':
      // ...
    break;
    case 'POST':
      // ...
    break;
    case 'PUT':
      // ...
    break;
    case 'DELETE':
      // ...
    break;
  }
?>
Задание 1

Implemente uma REST API para produtos de uma loja virtual.

Задание 2

Teste o funcionamento da API implementada usando a biblioteca CURL.