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

[Dúvida] Sobre o mapeamento das URLs

Olá, pessoal!

Após a implementação do método para obter os detalhes da série por id, eu reparei que a URL fica desta maneira 127.0.0.1:5501/detalhes.html?id=0, mas havíamos configurado que o mapeamento de requisição base através do @RequestMapping("/series") e mapeamos a recuperação do id pela URL pela anotação @GetMapping("/{id}").

Se foi mapeado a partir de /series e a URL inicia em /detalhes, como o Spring entende que o controlador responsável seria o SerieController e que, no mapeamento, está sendo chamado o método obterPorId(@PathVariable Long id)? Não deveria ser 127.0.0.1:5501/series/id=0?

2 respostas
solução!

Olá, colega!

Acontece que as requisições do front-end não são feitas pela URL da página e nem por links. O front-end, por baixo dos panos, com JavaScript envia requisições AJAX para a API back-end usando a fetch API do JavaScript.

Se você abrir o source da aplicação front-end, for na pasta scripts e abrir o script series.js, lá no final vai encontrar o seguinte código:

// Função para carregar informações da série
function carregarInfoSerie() {
    getDados(`/series/${serieId}`)
        .then(data => {
            fichaDescricao.innerHTML = `
                <img src="${data.poster}" alt="${data.titulo}" />
                <div>
                    <h2>${data.titulo}</h2>
                    <div class="descricao-texto">
                        <p><b>Média de avaliações:</b> ${data.avaliacao}</p>
                        <p>${data.sinopse}</p>
                        <p><b>Estrelando:</b> ${data.atores}</p>
                    </div>
                </div>
            `;
        })
        .catch(error => {
            console.error('Erro ao obter informações da série:', error);
        });
}

// Adiciona ouvinte de evento para o elemento select
listaTemporadas.addEventListener('change', carregarEpisodios);

// Carrega as informações da série e as temporadas quando a página carrega
carregarInfoSerie();

Esse script roda 1 vez, sempre que a página 127.0.0.1:5501/detalhes.html?id=0 é carregada. É esse script que envia a requisição para a nossa API.

A função getDados de getDados.js possui uma constante String (baseURL) que é usada para passar o endereço da nossa API.

const baseURL = 'http://localhost:8080';

export default function getDados(endpoint) {
    return fetch(`${baseURL}${endpoint}`)
        .then(response => response.json())
        .catch(error => {
            console.error('Erro ao acessar o endpoint /series/top5:', error);
        });
}

Essa String possui apenas o endereço da URL base da API, a função getDados espera receber como parâmetro o resto da URL (url relativa, representada pela variável enpoint). Quando a função getDados é chamada, ela apenas concatena os valores das variáveis baseURL e endpoint. Isso permite que a função getDados seja usada de forma versátil para enviar requisições para qualquer endpoint da nossa API. Por exemplo:

//Request para http://localhost:8080/series
getDados('/series')

//Request para http://localhost:8080/series/top5
getDados('/series/top5')

//Request para http://localhost:8080/series/lancamentos
getDados('/series/lancamentos')



//Request para http://localhost:8080/series/{id}/temporadas/todas
const urlRelativa = `/{serieID}/temporadas/todas`;
getDados(urlRelativa)

//Ou assim:
//Request para http://localhost:8080/series/{id}/temporadas/todas
const urlRelativa = '/' + serieID + '/temporadas/todas';
getDados(urlRelativa)

Todas as requisições do front-end são enviadas através de JavaScript. O JS requisita os dados e quando obtém, manipula os elementos da página, para alterar a página web sem precisar dar um reload completo para cada ação que o usuário toma. Isso acontece por vários motivos, um deles é o fato de o front-end e o back-end serem aplicações indepentendes, logo, quando você acessa um URL do front-end, nada irá acontecer no back-end, pois os dois não têm nenhum ligação; quem faz a ponte entre os dois é o JavaScript, sem ele, as duas aplicações não conseguem se comunicar. Essa abordagem também reduz a carga sobre o servidor e otimiza a experiência do usuário em todos os sentidos possíveis.

Mateus,

Muito obrigado pela ótima explicação! Ficou bem claro.

Grande abraço.