Inicialização Spring consumindo e produzindo JSON
1. Visão geral
Neste tutorial, mostraremoshow to build a REST service to consume and produce JSON content with Spring Boot.
Também daremos uma olhada em como podemos empregar facilmente a semântica HTTP RESTful.
Para simplificar, não vamosinclude a persistence layer, masSpring Data torna isso simples de adicionar também.
2. Serviço REST
Escrever um serviço JSON REST no Spring Boot é simples, já que essa é a opinião padrão quandoJackson está no classpath:
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService service;
@GetMapping("/{id}")
public Student read(@PathVariable String id) {
return service.find(id);
}
...
Anotando nossoStudentController with@RestController,we’ve told Spring Boot to write the return type of the read method para o corpo de resposta. Since we also have a @RequestMapping at the class level, seria o mesmo para quaisquer outros métodos públicos que adicionarmos.
Embora simples,this approach lacks HTTP semantics. Por exemplo, o que deve acontecer se não encontrarmos o aluno solicitado? Em vez de retornar um código de status 200 ou 500, convém retornar um 404.
Vamos dar uma olhada em como obter mais controle sobre a própria resposta HTTP e, por sua vez, adicionar alguns comportamentos RESTful típicos ao nosso controlador.
3. Crio
Quando precisamos controlar outros aspectos da resposta além do corpo - como o código de status - podemos retornar umResponseEntity:
@PostMapping("/")
public ResponseEntity create(@RequestBody Student student) throws URISyntaxException {
Student createdStudent = service.create(student);
if (createdStudent == null) {
return ResponseEntity.notFound().build();
} else {
URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(createdStudent.getId())
.toUri();
return ResponseEntity.created(uri)
.body(createdStudent);
}
}
Aqui, estamos fazendo muito mais do que apenas retornar oStudent criado na resposta. Additionally, we respond with a semantically clear HTTP status and, if creation succeeded, a URI to the new resource.
4. Read
Como mencionado antes, se quisermos ler um únicoStudent, é mais claro semanticamente retornar um 404 se não conseguirmos encontrar o aluno:
@GetMapping("/{id}")
public ResponseEntity read(@PathVariable("id") Long id) {
Student foundStudent = service.read(id);
if (foundStudent == null) {
return ResponseEntity.notFound().build();
} else {
return ResponseEntity.ok(foundStudent);
}
}
Aqui, podemos ver claramente a diferença de nossa implementação inicial deread().
Desta forma, o objetoStudent será devidamente mapeado para o corpo da resposta e retornado com um status adequado ao mesmo tempo.
5. Atualizar
A atualização é muito semelhante à criação, exceto que é mapeada para PUT em vez de POST, e URI contém umid do recurso que estamos atualizando:
@PutMapping("/{id}")
public ResponseEntity update(@RequestBody Student student, @PathVariable Long id) {
Student updatedStudent = service.update(id, student);
if (updatedStudent == null) {
return ResponseEntity.notFound().build();
} else {
return ResponseEntity.ok(updatedStudent);
}
}
6. Excluir
A operação de exclusão é mapeada para o método DELETE. URI também contém oid do recurso:
@DeleteMapping("/{id}")
public ResponseEntity
Não fizemosimplement specific error handling, porque o métododelete() na verdade falha ao lançar umException.
7. Conclusão
Neste artigo, vimos como consumir e produzir conteúdo JSON em um serviço CRUD REST típico desenvolvido com uma Spring Boot. Além disso, demonstramos como implementar o controle adequado do status da resposta e o tratamento de erros.
Para manter as coisas simples, não partimos para a persistência desta vez, masSpring Data REST fornece uma maneira rápida e eficiente de construir um serviço de dados RESTful.
O código-fonte completo para o exemplo éavailable over on GitHub.