Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
15
respostas

Erro html MODAL para enviar a requisição

Olá pessoal, tudo bom? Estou tentando enviar um formulário com metodo PUT, para realizar a transferência de saldo de uma conta para outra. Mas não estou conseguindo. Alguém pode me ajudar?

vou colocar o corpo completo do html, como também o controller que recebe a informação, e o json do postman que uso no metodo put, e que lá consigo realizar a transferência.

<!DOCTYPE html>
<html lang="pt-br" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <!-- CSS do Bootstrap -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <title>Página index</title>

    <!-- Estilo Pagina -->
    <style>
    /* Modal CSS */
    .modal {
        display: none;
        position: fixed;
        z-index: 1;
        padding-top: 100px;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        overflow: auto;
        background-color: rgb(0, 0, 0);
        background-color: rgba(0, 0, 0, 0.4);
    }

    .modal-content {
        background-color: #fefefe;
        margin: auto;
        padding: 20px;
        border: 1px solid #888;
        width: 50%;
    }

    .close {
        color: #aaaaaa;
        float: right;
        font-size: 28px;
        font-weight: bold;
    }

    .close:hover,
    .close:focus {
        color: #000;
        text-decoration: none;
        cursor: pointer;
    }

    /* Estilo da tabela */
    table {
        border-collapse: collapse;
        width: 80%;
        margin: 20px auto;
    }

    th, td {
        text-align: center;
        padding: 10px;
    }

    th {
        background-color: #f2f2f2;
    }

    tr:nth-child(even) {
        background-color: #f2f2f2;
    }

    /* Estilo Formulário Para não aparecer */

    .formulario{
        display: none;
    }



    </style>

    <script>

        <!-- Consultar clientes -->
        function consultarClientes() {
            limparConteudo();

            fetch('/clientes/listar')
                .then(response => response.json())
                .then(clientes => {
                    var tabela = document.createElement('table');
                    tabela.innerHTML = '<tr><th>CPF</th><th>Nome</th></tr>';
                    clientes.forEach(cliente => {
                        var linha = document.createElement('tr');
                        linha.innerHTML = '<td>' + cliente.cpf + '</td><td>' + cliente.nome + '</td>';
                        tabela.appendChild(linha);
                    });
                    document.body.appendChild(tabela);
                });
        }
        <!-- Consultar contas -->

        function consultarContas() {
            limparConteudo();

            fetch('/contas/listar')
                .then(response => response.json())
                .then(contas => {
                    var tabela = document.createElement('table');
                    tabela.innerHTML = '<tr><th>Cpf</th><th>Agencia</th><th>Conta</th><th>Saldo</th></tr>';
                    contas.forEach(conta => {
                        var linha = document.createElement('tr');
                        linha.innerHTML = '<td>' + conta.cpf + '</td><td>' + conta.agencia + '</td><td>' + conta.nconta + '</td><td>' + conta.saldo + '</td>';
                        tabela.appendChild(linha);
                    });
                    document.body.appendChild(tabela);
                });
        }

        <!-- Limpa conteúdo -->

        function limparConteudo() {
            // Remove a tabela, se existir
            var tabela = document.querySelector('table');
            if (tabela) {
                tabela.remove();
            }
        }
         <!-- Limpa conteúdo -->
15 respostas

<!-- Mostrar formulario -->

        function mostrarFormulario() {
            var formulario = document.querySelector('.formulario');
            formulario.style.display = 'block';
            }

         <!-- obtenha o elemento do formulário pelo ID -->
        const form = document.getElementById('formTransferenciaSaldo');

        document.getElementById('formTransferenciaSaldo').addEventListener('click', (event) => {
        event.preventDefault();

        const formData = new FormData(form);
        const data = Object.fromEntries(formData.entries());

        const jsonData = {
        origem: {
        cpf: data.cpfOrigem,
        agencia: data.agenciaOrigem,
        nconta: data.ncontaOrigem,
        valorTransferencia: Number(data.valorTransferencia),
        operacao: Number(data.operacao)
        },
        destino: {
        cpf: data.cpfDestino,
        agencia: data.agenciaDestino,
        nconta: data.ncontaDestino
        }
        };

        // envie os dados como JSON para o servidor usando fetch API
        fetch('/transferencia/transferir', {
        method: 'PUT',
        headers: {
        'Content-Type': 'application/json'
        },
        body: JSON.stringify(jsonData)
        })
        .then(response => response.json())
        .then(data => console.log(data))
        .catch(error => console.error(error));
        });



    </script>


</head>
<body>
<button id="btnClientes" onclick="consultarClientes()">Consultar clientes</button>
<button id="btnContas" onclick="consultarContas()">Consultar contas</button>
<button id="btnTransferir" onclick="mostrarFormulario()">Transferir</button>

<!-- formulário de envio -->
<form method="PUT" name="formTransferenciaSaldo" action="http://localhost:8080/transferencias/transferir"
      class="formulario" id="formTransferenciaSaldo">
    <h2>Transferência de valor</h2><br>
    <h3>Origem</h3><br>
    <label>Agencia</label>
    <input type="text" name="agenciaOrigem" placeholder="Digite o número da agência"/><br>
    <label>Conta</label>
    <input type="text" name="ncontaOrigem" placeholder="Digite o número da conta"/><br>
    <label>CPF</label>
    <input type="text" name="cpfOrigem" placeholder="Digite o numero do CPF"/><br>
    <label>Valor</label>
    <input type="number" name="valorTransferencia" placeholder="R$ 00.00"/><br>
    <label>Operação</label>
    <select name="operacao">
        <option value="0">TED</option>
        <option value="1">DOC</option>
        <option value="2">PIX</option>
    </select>

    <h3>Destino</h3><br>
    <label>Agencia</label>
    <input type="text" name="agenciaDestino" placeholder="Digite o número da agência"/><br>
    <label>Conta</label>
    <input type="text" name="ncontaDestino" placeholder="Digite o número da conta"/><br>
    <label>CPF</label>
    <input type="text" name="cpfDestino" placeholder="Digite o numero do CPF"/><br>
    <input type="submit" value="Enviar"/>
</form>


</body>
</html>

@RestController @RequestMapping("/transferencias") public class TransferenciaController {

@Autowired
TransferenciaService transferenciaService;


@PutMapping("transferir")
@Transactional
@CacheEvict (value = "serviceList", allEntries = true)
public void transferir(@RequestBody TransferenciaRequest request, UriComponentsBuilder uriBuilder){
    DadosTransferir origem = request.getOrigem();
    DadosTransferir destino = request.getDestino();
    transferenciaService.transferir(origem, destino);


}

}

DTO 1

public class TransferenciaRequest {

private DadosTransferir origem;
private DadosTransferir destino;

}

DTO2 public record DadosTransferir( String agencia, String nconta, String cpf, BigDecimal saldo, BigDecimal valorTransferencia, Operacao operacao){

public DadosTransferir(Transferencia transferencia, Operacao operacao){
    this(transferencia.getAgencia(), transferencia.getNconta(), transferencia.getCpf(), transferencia.getValorTransferencia(), transferencia.getSaldo(), operacao);
}

}

Json do postman

{ "origem": { "cpf": "46189049095", "agencia": "004", "nconta": "00005-1", "valorTransferencia": 5000, "operacao": 2 }, "destino": { "cpf": "65813400060", "agencia": "007", "nconta": "00008-1" } }

Oi Lúcio!

Qual erro acontece quando você dispara a requisição?

Olá Professor Rodrigo (você existe...rs..brincadeira, vejo seus cursos direto...) o Erro é esse!

This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Feb 24 08:37:13 BRT 2023 There was an unexpected error (type=Unsupported Media Type, status=415). Content-Type 'application/x-www-form-urlencoded' is not supported.

:D

Pelo erro a requisição não está enviando o header Content-type, mas no seu código ele está configurado certinho. Veja na aba Network do DevTools do browser como a requisição está sendo enviada.

deu isso professor Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A requsição não está sendo disparada via JavaScript. Acho que o problema está nessa sua linha:

document.getElementById('formTransferenciaSaldo').addEventListener('click', (event) => {

Você vinculou com o evento de click do formulário, mas deveria ser submit (ou click no botão e não no formulário)

Olá Professor, desculpe a demora, tive que ir no pronto socorro. Voltei agora. Fiz a mudança conforme sugeriu

ORIGINAL - document.getElementById('formTransferenciaSaldo').addEventListener('click', (event) => {

MUDADO - document.getElementById('formTransferenciaSaldo').addEventListener('submit', (event) => {

Porém, continua apresentando o erro :

This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Feb 24 12:37:42 BRT 2023 There was an unexpected error (type=Unsupported Media Type, status=415). Content-Type 'application/x-www-form-urlencoded' is not supported.

Oi Lúcio!

Espero que você esteja bem!

O problema é no seu código JavaScript. Você colocou a tag script dentro da tag head, mas ela deveria ficar ao final da página, antes de fechar a tag body:

//codigo da pagina...

    <script>
        seu codigo js aqui
    </script>

</body>
</html>

Oi Professor, estou bem, esperando o teste de covid sair.

Professor alterei como falou e também alterei em várias coisas do código!!

Não está bonito, ainda vou limpar, mas o carro ta andando com uma roda hahahah

Professor muito obrigado pela ajuda!! e posso adicionar o senhor no linkedin?

solução!
<!-- Estilo Pagina -->
<style>
/* Modal CSS */
.modal {
    display: none;
    position: fixed;
    z-index: 1;
    padding-top: 100px;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    overflow: auto;
    background-color: rgb(0, 0, 0);
    background-color: rgba(0, 0, 0, 0.4);
}

.modal-content {
    background-color: #fefefe;
    margin: auto;
    padding: 20px;
    border: 1px solid #888;
    width: 50%;
}

.close {
    color: #aaaaaa;
    float: right;
    font-size: 28px;
    font-weight: bold;
}

.close:hover,
.close:focus {
    color: #000;
    text-decoration: none;
    cursor: pointer;
}

/* Estilo da tabela */
table {
    border-collapse: collapse;
    width: 80%;
    margin: 20px auto;
}

th, td {
    text-align: center;
    padding: 10px;
}

th {
    background-color: #f2f2f2;
}

tr:nth-child(even) {
    background-color: #f2f2f2;
}

/* Estilo Formulário Para não aparecer */

.formulario{
    display: none;
}



</style>

Transferência de valor

Origem

Agencia Conta CPF Valor Operação TEDDOCPIX
<h3>Destino</h3><br>
<label>Agencia</label>
<input type="text" name="agenciaDestino" placeholder="Digite o número da agência"/><br>
<label>Conta</label>
<input type="text" name="ncontaDestino" placeholder="Digite o número da conta"/><br>
<label>CPF</label>
<input type="text" name="cpfDestino" placeholder="Digite o numero do CPF"/><br>
<input type="submit" value="Transferir"/>

Show de bola!

Pode sim! :)

Muito obrigado professor!