Solucionado (ver solução)
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!