1
resposta

Socket io comunicação com a API

Olá td bem? Achei bem bacana o procedimento onde o gráfico é atualizado em tempo real através do socket.io, utilizando uma API. No entanto tentei realizar este procedimento com uma API em um servidor na web e a seguinte mensagem apareceu no console: Requisição cross-origin bloqueada: A política de mesma origem (Same Origin Policy) impede a leitura do recurso remoto em https://meusite.com.br/api. (Motivo: o cabeçalho CORS 'Access-Control-Allow-Origin' não está presente).[Learn More]

Como devo proceder? grande abraço

1 resposta

Oi Marcos,

isso é algo comum quando tentamos fazer um request ajax.

O que acontece é que ao fazermos um request para uma página web, se esse request não fosse checado, poderíamos, por exemplo, comprometer a segurança do que chega para o navegador e baixar algo malicioso.

Por causa disso, vários navegadores usam uma política de segurança para minimizar riscos.

Só que, geralmente quando fazemos um request, estamos tentando acessar algo de outro servidor que não o nosso, e aí começa a emoção.

Uma política que permite que acessemos algo dentro do nosso servidor é a de mesma origem ou same-origin, e a usada para acessarmos o que está fora do nosso servidor é a de origem cruzada ou cross-origin.

E o que é responsável por gerenciar esses requests de origem cruzada? O CORS ou compartilhamento de recursos de origem cruzada.

Então, o que essa mensagem está te dizendo é que essa política precisa estar configurada.

Caso você esteja seguindo o que fizemos no curso com Node e Socket.io, o próprio Socket.io já deveria cuidar disso por você.

Logo, se você recebeu essa mensagem pode ter algo que precise ser ajustado no uso do Socket.io e da integração dele lá no seu servidor.

Então, você teria algo parecido com

<script src="https://meusite.com.br/socket.io/socket.io.js"></script>

<script>
    const socket = io.connect('https://meusite.com.br/');
    socket.on('atualizaBarras', function(dadosJson){
        //código que atualiza o gráfico
    })
</script>

no html.

(E você pode deixar o segundo script no html de const socket... em um outro arquivo também.)

Com

/*importando o módulo do socket.io*/
const io = require('socket.io');
/*integrando o socket.io no servidor http do Node*/
const socket = io(servidor);

/*fazendo a lógica do socket que envia o json para o cliente a cada 5 seg*/
setInterval(function repeticao(){
    socket.emit('atualizarValores', gerarValores());
}, 5000);

no servidor.

Veja se usou o endereço padrão do Socket.io ou se customizou isso.

Qualquer coisa pode mandar um link para o código aqui.