Introdução ao Spring Data REST

Introdução ao Spring Data REST

1. Visão geral

Este artigo explicará os fundamentos deSpring Data RESTe mostrará como usá-lo para construir uma API REST simples.

Em geral, o Spring Data REST é construído sobre o projeto Spring Data e facilita a criação de serviços da Web REST direcionados à hipermídia que se conectam aos repositórios do Spring Data - todos usando HAL como o tipo de hipermídia principal.

Ele retira muito do trabalho manual geralmente associado a essas tarefas e simplifica bastante a implementação da funcionalidade básica CRUD para aplicativos da web.

2. Dependências do Maven

As seguintes dependências do Maven são necessárias para nosso aplicativo simples:


    org.springframework.boot
    spring-boot-starter


    org.springframework.bootspring-boot-starter-data-rest

    org.springframework.boot
    spring-boot-starter-data-jpa


    com.h2database
    h2

Decidimos usar o Spring Boot neste exemplo, mas o Spring clássico também funcionará bem. Também optamos por usar o banco de dados incorporado H2 para evitar qualquer configuração extra, mas o exemplo pode ser aplicado a qualquer banco de dados.

3. Escrevendo o aplicativo

Começaremos escrevendo um objeto de domínio para representar um usuário do nosso site:

@Entity
public class WebsiteUser {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;
    private String email;

    // standard getters and setters
}

Todo usuário tem um nome e um email, além de um ID gerado automaticamente. Agora podemos escrever um repositório simples:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository {
    List findByName(@Param("name") String name);
}

Esta é uma interface que permite realizar várias operações com objetosWebsiteUser. Também definimos uma consulta personalizada que fornecerá uma lista de usuários com base em um determinado nome.

A anotação@RepositoryRestResource é opcional e é usada para personalizar o terminal REST. Se decidirmos omiti-lo, o Spring criará automaticamente um endpoint em “/websiteUsers” em vez de “/users“.

Finalmente, iremos escrever um padrãoSpring Boot main class to initialize the application:

@SpringBootApplication
public class SpringDataRestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringDataRestApplication.class, args);
    }
}

É isso aí! Agora temos uma API REST totalmente funcional. Vamos dar uma olhada em ação.

4. Acessando a API REST

Se executarmos o aplicativo e formos parahttp://localhost:8080/ em um navegador, receberemos o seguinte JSON:

{
  "_links" : {
    "users" : {
      "href" : "http://localhost:8080/users{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile"
    }
  }
}

Como você pode ver, há um endpoint “/users” disponível e já tem as opções “?page“, “?size” e “?sort”.

Também existe um ponto de extremidade padrão “/profile”, que fornece metadados do aplicativo. É importante observar que a resposta está estruturada de uma maneira que segue as restrições do estilo de arquitetura REST. Especificamente, ele fornece uma interface uniforme e mensagens auto-descritivas. Isso significa que cada mensagem contém informações suficientes para descrever como processá-la.

Ainda não há usuários em nosso aplicativo, então ir parahttp://localhost:8080/users mostraria apenas uma lista vazia de usuários. Vamos usar curl para adicionar um usuário.

$ curl -i -X POST -H "Content-Type:application/json" -d '{  "name" : "Test", \
"email" : "[email protected]" }' http://localhost:8080/users
{
  "name" : "test",
  "email" : "[email protected]",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/1"
    },
    "websiteUser" : {
      "href" : "http://localhost:8080/users/1"
    }
  }
}

Vamos dar uma olhada nos cabeçalhos de resposta também:

HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/users/1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked

Você notará que o tipo de conteúdo retornado é “application/hal+json“. HAL é um formato simples que oferece uma maneira consistente e fácil de criar um hiperlink entre recursos em sua API. O cabeçalho também contém automaticamente o cabeçalhoLocation, que é o endereço que podemos usar para acessar o usuário recém-criado.

Agora podemos acessar este usuário emhttp://localhost:8080/users/1

{
  "name" : "test",
  "email" : "[email protected]",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/1"
    },
    "websiteUser" : {
      "href" : "http://localhost:8080/users/1"
    }
  }
}

Você também pode usar curl ou qualquer outro cliente REST para emitir solicitações PUT, PATCH e DELETE. Também é importante observar que o Spring Data REST segue automaticamente os princípios do HATEOAS. HATEOAS é uma das restrições do estilo de arquitetura REST e significa que o hipertexto deve ser usado para encontrar seu caminho através da API.

Por fim, vamos tentar acessar a consulta personalizada que escrevemos anteriormente e encontrar todos os usuários com o nome "test". Isso é feito indo parahttp://localhost:8080/users/search/findByName?name=test

{
  "_embedded" : {
    "users" : [ {
      "name" : "test",
      "email" : "[email protected]",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/users/1"
        },
        "websiteUser" : {
          "href" : "http://localhost:8080/users/1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/search/findByName?name=test"
    }
  }
}

5. Conclusão

[.iframe-fluid] ## Este tutorial demonstrou os fundamentos da criação de uma API REST simples com Spring Data REST. O exemplo usado neste artigo pode ser encontrado no linkGitHub project.