O artigo de hoje abordará as perguntas básicas sobre o REST na primavera. Será especialmente útil para programadores iniciantes.
O guia oficial do Pivotal, que fala sobre tópicos de preparação.

O Spring REST faz parte do Spring MVC. Portanto, grande parte do Spring MVC será usado no REST e vice-versa. Para uma visão mais aprofundada do Spring MVC, leia este artigo .
Para que foi criado o REST?Para entender o conceito de REST, você precisa analisar o acrônimo em seus componentes:
- Representacional - os recursos no REST podem ser representados de qualquer forma - JSON, XML, texto ou até HTML - depende de quais dados são mais adequados para o consumidor
- Estado - ao trabalhar com REST, você deve se concentrar no estado do recurso, não nas ações com o recurso
- Transferência - REST inclui a transferência de dados de recursos, de qualquer forma apresentada, de um aplicativo para outro.
REST é a transferência de estados de recursos entre um servidor e um cliente.
O que é um recurso?Um recurso no REST é tudo o que pode ser transferido entre um cliente e um servidor.
Aqui estão alguns exemplos de recursos:
- Notícias
- Temperatura em São Petersburgo na segunda-feira às 4 da manhã
- Salário do empregado
- Seleção de banco de dados
- Resultado da pesquisa
CRUD de quê?As ações no REST são determinadas pelos métodos http.
Get
, Post
, Put
, Delete
, Patch
e outros.
Os mais usados são denotados pela sigla CRUD:
- Criar -
POST
- Ler -
GET
- Atualização -
PUT
- Excluir -
DELETE
O REST é seguro? Como você pode protegê-lo?Por padrão, o REST não é seguro.
Você pode configurar a segurança com autenticação básica, JWT, OAuth2
.
O que são operações de salvamento?Estas são operações que não modificam recursos. Aqui está uma lista deles:
O que é uma operação idempotente? Por que a idempotência é importante?Métodos idempotentes são métodos com cada invocação cujo resultado será o mesmo.
Ou seja, o resultado após 1 chamada de um método desse tipo será o mesmo após 10 chamadas desse método.
Isso é importante para uma API tolerante a falhas. Suponha que um cliente queira atualizar um recurso usando uma solicitação POST? Se o POST não for um método idempotente, uma chamada múltipla causará atualizações inesperadas de recursos. Usando métodos idempotentes, você se protege de muitos erros.
O REST é bem dimensionado?Sim O REST é bem dimensionado porque não armazena estado.
Isso significa que ele não armazena informações da sessão do usuário no servidor.
As informações do cliente não devem ser armazenadas no servidor, mas devem ser transmitidas sempre que forem necessárias. É isso que ST significa em REST, State Transfer. Você passa o estado, não o armazena no servidor.
O REST também é interoperável - isso significa que diferentes programas escritos em diferentes idiomas podem interagir nele. Isso vem de 2 fatores:
- Clientes HTTP interoperáveis. Clientes diferentes devem enviar as mesmas solicitações http.
- Interoperabilidade no nível dos tipos de mídia. Clientes diferentes devem enviar e receber corretamente os mesmos recursos.
O que é um HttpMessageConverter?HttpMessageConverter
converte a solicitação em um objeto e vice-versa.
O Spring possui várias implementações dessa interface, e você pode criar suas próprias.
Nesse caso, DispatcherServlet
não usa Model and View.
No REST, Model e View não existem. Existem apenas os dados fornecidos pelo controlador e a representação do recurso quando a mensagem é convertida de um tipo de mídia (json, xml ...) em um objeto.
Lista de Conversores:
BufferedImageHttpMessageConverter
- Converte um BufferedImage
para (de) código de imagem.
Jaxb2RootElementHttpMessageConverter
- converte xml em (de) um objeto marcado com anotações jaxb2. Registre se o jaxb2 estiver no caminho de classe.
MappingJackson2HttpMessageConverter
- converte JSON em (de) um objeto. Registre se Jackson 2 estiver no caminho de classe.
StringHttpMessageConverter
- converte todos os arquivos de mídia em texto / sem formatação.
Como funciona a anotação @RestController?@RestController
é colocado na classe do controlador em vez de @Controller
. Ela ressalta que essa classe não opera em modelos, mas em dados. Consiste @RequestBody
e @RequestBody
.
@Controller @ResponseBody public interface RestController
Por que @ResponseBody?A @ResponseBody
é colocada em métodos que funcionam com dados, não com modelos. Não precisa ser especificado explicitamente se o @RestController
usado.
Os métodos regulares retornam Model
e os métodos anotados @ResponseBody
retornam objetos que são convertidos em arquivos de mídia usando o HttpMessageConverter
.
O que a anotação @RequestMapping faz?Esta anotação é usada para mapear solicitações para classes e métodos do controlador.
Anteriormente, era usado para métodos de classe para indicar o URI, método http, tipo de dados enviados etc. Nas versões mais recentes do Spring, ele foi substituído pelas anotações @GetMapping
, @PostMapping
etc.
Agora é usado apenas para indicar o URI para a classe do controlador.
O que são anotações @GetMapping, @PostMapping, @DeleteMapping e outras?Essas são anotações mais restritas para o mapeamento de métodos http.
@GetMapping
- lida com solicitações@PostMapping
- lida com solicitações de postagem@DeleteMapping
- manipula solicitações de exclusão@PutMapping
- manipula solicitações de colocação@PatchMapping
- lida com solicitações de patch
Tudo o que está escrito abaixo também é característico de outras anotações.
Anotação @GetMapping é simplesmente uma anotação que contém @RequestMapping (método = RequestMethod.GET) .
Também permite ajustar o método manipulador.
Seus parâmetros (eles são convertidos em parâmetros similares @RequestMapping):
path
- URIheaders
- cabeçalhosname
- nome do manipuladorparams
- parâmetrosproduces
- tipo de dados retornados (JSON, XML, texto). Usado no RESTconsumes
- tipo de dados recebidos. Usado no REST
Por padrão, a anotação segue o caminho para o método.
@GetMapping("managers") = @GetMapping(path = "managers")
Por que usar a anotação @RequestParam?Essa anotação é usada para que os métodos manipuladores possam obter parâmetros de uma solicitação http.
Uma solicitação com parâmetros: http://localhost:8080/getByName/name=Ivan
.
O código a seguir colocará a sequência Ivan
no name
da variável.
@GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) {
Por que usar a anotação @PathVariable?Esta anotação obtém uma parte específica do URI.
URI: http://localhost:8080/getById/23
O código a seguir colocará 23
na variável id
.
@GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) {
O que significam os diferentes códigos para respostas http?GET - 200 OK
POST - 200 OK, 201 criado, 204 sem conteúdo
PUT - 200 OK, 201 criado, 204 sem conteúdo
DELETE - 204 Sem Conteúdo, 202 Aceito
Por que preciso da anotação @ResponseStatus?Permite definir um código de resposta. Normalmente, o próprio Spring define o código de resposta desejado, mas há momentos em que você precisa substituí-lo.
@PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...}
Em vez de usar anotações, você pode retornar um ResponseEntity
e definir manualmente o código de resposta.
O uso de ResponseEntity
e @ReponseStatus
juntos não é recomendado.
O que é um ResponseEntity?Esta é uma classe especial que representa uma resposta http. Ele contém o corpo da resposta, o código de status e os cabeçalhos. Podemos usá-lo para ajustar a resposta http.
É um tipo universal e qualquer objeto pode ser usado como um corpo:
@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }
Por que @RequestBody?Você pode usar a anotação @RequestBody
em um parâmetro de método para que o corpo da solicitação seja convertido nesse parâmetro.
@PostMapping("accounts")
Você pode usar @Validated
junto com @RequestBody
para verificar uma solicitação.
O que é um RestTemplate? Quais são as suas vantagens?RestTemplate é um cliente especial no Spring para enviar solicitações http. Ele fornece APIs convenientes para chamar facilmente pontos de extremidade REST em uma única linha.
RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
Você pode aprender mais sobre o uso neste artigo .