Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Postman retornando bad request 400

Olá! Estou escrevendo uma API diferente da do curso, no meu caso é um cadastro de usuários.

Eu mudei alguns passos para que eu conseguisse realizar o post através de um formulário html (.jsp na verdade). Se eu uso meu formulário, ao enviar ele manda uma requisição post pro /usuarios e na dev tools do Chrome ele me avisa que a requisição retornou 201, imprime no corpo da página o json do UsuariosDto que criei e até mesmo cadastra no banco (Estou usando o mariaDB). Mas por algum motivo no Postman ele sempre retornar Bad Request (400). No console do eclipse eu recebo a mensagem:

Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'nome' is not present]

No UsuarioController o método que usei para receber os parâmetros foi o @RequestParam e eu passo como parâmetro do método os parâmetros preenchidos do formulário.

Esse é o método no meu UsuarioController.

// Response POST
    @PostMapping
    public ResponseEntity<UsuarioDto> cadastrar(@RequestParam String nome, String cpf, String email, String dataNascimento, UriComponentsBuilder uriBuilder) throws URISyntaxException {
        UsuarioForm form = new UsuarioForm();
        Usuario usuario = form.converter(dataNascimento, nome, cpf, email);
        usuariosRepository.save(usuario);

        URI uri = uriBuilder.path("/usuario/{id}").buildAndExpand(usuario.getId()).toUri();
        return ResponseEntity.created(uri).body(new UsuarioDto(usuario));
    }

Esse é meu UsuarioForm.

public Usuario converter(String dataNascimento, String nome, String cpf, String email) {
        return new Usuario(dataNascimento, nome, cpf, email);

Eu envio no Postman um json assim:

{
    "dataNascimento":"01-02-1992",
    "nome":"Guilherme",
    "cpf":"12345678912",
    "email":"emailguilherme@hotmail.com"
}

De restante do Postman usei as mesmas configurações do professor na aula, content-type e application/json no header.

Como minha api vai ter uma página de cadastro de usuário, achei melhor já fazer um formulário para enviar o post pro banco. Estou fazendo isso da maneira correta?

EDIT Resolvido (parcialmente).

Meu form faz um request com content-type: 'application/x-www-form-urlencoded' que é até onde entendi, o padrão para o tipo de conteúdo que um form envia. Acontece que eu estava tentando enviar esses parâmetros com json, como estou usando @RequestParam no meu UsuarioController, isso não é possível, ele está esperando receber os parâmetros do tipo texto... Acredito que ideal seria tentar enviar por json e receber os parâmetros com @RequestBody como o professor fez na aula. Vou fazer uns testes semelhantes aos do professor mais tarde mas por enquanto foi tudo o que consegui.

Obrigado desde já!

7 respostas
solução!

Oi Guilherme,

Do jeito que você fez então não está trabalhando via REST com JSON, mas sim como uma aplicação web tradicional, com páginas jsp.

Então via postman você realmente não deve enviar os dados via json, mas como application/x-www-form-urlencoded, conforme você mencionou.

Entendi Rodrigo, eu acho que entendi errado o padrão REST. Vou tentar refazer o cadastro usando @RequestBody, fiz o form pois consigo estudar quase todo o processo no meu trabalho mas as políticas de segurança me impedem de instalar o Postman só para estudar rsrs. Se possível poderia dar uma mão no que devo fazer para adequar ao REST?

Oi Guilherme,

Para trabalhar com API você não pode ter páginas html/jsp/thymeleaf, etc.

Se não deixa de ser uma API Rest e se torna uma aplicação web tradicional.

Ah sim, então o correto seria criar uma aplicação que consumisse a API caso eu queira testar o POST sem utilizar o postman?

Sim, uma aplicação frontend(react, angular, etc.)

Mas você pode testar a API de outras maneiras:

  • cURL
  • Soap UI
  • Advanced REST Client(plugin do google chrome)

Entendi, muito obrigado Rodrigo!

Alterei meu Controller para usar o @RequestBody e só o que tenho que fazer é enviar o post com o JSON e ele salva no banco na tabela correta! Desculpe essa é a primeira vez que faço algo assim! Cara que orgulho hahah!