Introdução

O Yii fornece um conjunto de ferramentas para simplificar a tarefa de implementar APIs RESTful Web Service. Em particular, o Yii suporta os seguintes recursos sobre APIs RESTful:

  • Prototipagem rápida com suporte para APIs comuns de Active Record;
  • Negociação de formato do Response (suporte JSON e XML por padrão);
  • Serialização de objeto configurável com suporte a campos de saída selecionáveis;
  • Formatação adequada para a coleção e dados e validação de erros;
  • Suporte a HATEOAS;
  • Roteamento eficiente com verificação dos verbs (métodos) HTTP;
  • Construído com suporte aos métodos OPTIONS e HEAD;
  • Autenticação e autorização;
  • Data caching e HTTP caching;
  • Limitação de taxa;

Abaixo, utilizamos um exemplo para ilustrar como você pode construir um conjunto de APIs RESTful com um mínimo de codificação.

Suponha que você deseja expor os dados do usuário via APIs RESTful. Os dados do usuário estão guardados na tabela user e você já criou a classe active record app\models\User para acessar os dados do usuário.

Criando um Controller (Controlador)

Primeiramente, crie uma classe controller app\controllers\UserController como a seguir,

namespace app\controllers;

use yii\rest\ActiveController;

class UserController extends ActiveController
{
   public $modelClass = 'app\models\User';
}

A classe controller estende de yii\rest\ActiveController, que implementa um conjunto comum de ações RESTful. Especificando modelClass como app\models\User, o controller sabe qual o model que pode ser usado para a recuperação e manipulação de dados.

Configurando Regras de URL

Em seguida, modifique a configuração do componente urlManager na configuração da aplicação:

'urlManager' => [
   'enablePrettyUrl' => true,
   'enableStrictParsing' => true,
   'showScriptName' => false,
   'rules' => [
       ['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
   ],
]

A configuração acima primeiramente adiciona uma regra de URL para o controller user de modo que os dados do usuário podem ser acessados e manipulados com URLs amigáveis e métodos HTTP significativos.

Ativando o Input via JSON

Para fazer a API aceitar dados no formato JSON, configure a propriedade parsers do componente de aplicação request para usar o yii\web\JsonParser para realizar input via JSON:

'request' => [
   'parsers' => [
       'application/json' => 'yii\web\JsonParser',
   ]
]

Observação: A configuração acima é opcional. Sem esta configuração, a API só iria reconhecer os formatos de input application/x-www-form-urlencoded e multipart/form-data.

Testando

Com o mínimo de esforço acima, você já terminou sua tarefa de criar as APIs RESTful para acessar os dados do usuário. As APIs que você criou incluem:

  • GET /users: listar todos os usuários página por página;
  • HEAD /users: mostrar a informações gerais da listagem de usuários;
  • POST /users: criar um novo usuário;
  • GET /users/123: retorna detalhes do usuário 123;
  • HEAD /users/123: mostra informações gerais do usuário 123;
  • PATCH /users/123 e PUT /users/123: atualiza o usuário 123;
  • DELETE /users/123: deleta o usuário 123;
  • OPTIONS /users: mostra os métodos suportados em relação à URL /users;
  • OPTIONS /users/123: mostra os métodos suportados em relação à URL /users/123.

Observação: O Yii vai pluralizar automaticamente nomes de controllers para uso em URLs (também chamadas endpoints). Você pode configurar isso usando a propriedade yii\rest\UrlRule::$pluralize.

Você pode acessar suas APIs com o comando curl mostrado abaixo,

$ curl -i -H "Accept:application/json" "http://localhost/users"

HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self, 
     <http://localhost/users?page=2>; rel=next, 
     <http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

[
   {
       "id": 1,
       ...
   },
   {
       "id": 2,
       ...
   },
   ...
]

Tente alterar o tipo de conteúdo para application/xml e você vai ver o resultado retornado em formato XML:

$ curl -i -H "Accept:application/xml" "http://localhost/users"

HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self, 
     <http://localhost/users?page=2>; rel=next, 
     <http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <item>
       <id>1</id>
       ...
   </item>
   <item>
       <id>2</id>
       ...
   </item>
   ...
</response>

O seguinte comando irá criar um novo usuário, enviando uma solicitação POST com os dados do usuário em formato JSON:

$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/users" -d '{"username": "example", "email": "user@example.com"}'

HTTP/1.1 201 Created
...
Location: http://localhost/users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8

{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789}

Dica: Você também pode acessar suas APIs via navegador, digitando a URL http://localhost/users. No entanto, você pode precisar de alguns plugins do navegador para enviar cabeçalhos de solicitações específicas.

Como você pode ver, no cabeçalho da resposta, há informações sobre a contagem total, número de páginas, etc. Há também links que permitem navegar para outras páginas de dados. Por exemplo, http://localhost/users?page=2 lhe daria a próxima página dos dados de usuário.

Usando os parâmetros fields e expand, você também pode especificar os campos que devem ser incluídos no resultado. Por exemplo, a URL http://localhost/users?fields=id,email só retornará os campos id e email.

Observação: Você deve ter notado que o resultado de http://localhost/users inclui alguns campos confidenciais, Tal como password_hash, auth_key. Você certamente não quer que eles apareçam no resultado da sua API. Você pode e deve filtrar esses campos, conforme descrito na seção Response Formatting.

Resumo

Usando o framework API RESTful do Yii, você implementa uma URL desses campos, conforme descrito na seção de ações do controller, um controller para organizar as ações que implementam as URLs para um único tipo de recurso.

Os recursos são representados como modelos de dados, que se estendem a partir da classe yii\base\Model. Se você estiver trabalhando com bancos de dados (relacional ou NoSQL), é recomendado que você use ActiveRecord para representar recursos.

Você pode usar yii\rest\UrlRule para simplificar o roteamento para suas URLs da API.

Embora não seja exigido, é recomendável que você desenvolva suas APIs RESTful como uma aplicação separada, diferente do seu frontend e backend para facilitar a manutenção.