O que é uma resposta opaca e a qual propósito ela serve?

172

Eu tentei fetcho URL de um site antigo e ocorreu um erro:

Fetch API cannot load http://xyz.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://abc' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.

Entendi a mensagem e tentei fazer uma solicitação que retorna uma resposta opaca:

fetch("http://xyz", {'mode': 'no-cors'})

Ok, agora funciona ... mas não consigo ler. = \

Qual é o objetivo, então, de uma resposta opaca?

Miguel Angelo
fonte

Respostas:

149

Considere o caso em que um trabalhador de serviço atua como um cache agnóstico. Seu único objetivo é servir os mesmos recursos que você obteria da rede, mas com mais rapidez. É claro que você não pode garantir que todos os recursos farão parte da sua origem (considere as bibliotecas servidas por CDNs, por exemplo). Como o responsável pelo serviço tem o potencial de alterar as respostas da rede, você precisa garantir que não está interessado no conteúdo da resposta, nem em seus cabeçalhos, nem no resultado. Você só está interessado na resposta como uma caixa preta para armazená-la em cache e servi-la mais rapidamente.

Foi para isso que { mode: 'no-cors' }foi feito.

Salva
fonte
2
Mas o Status codeé sempre 0, como verificar se foi bem sucedido se status is never 200?
Angshuman Agarwal 11/04/19
3
Você não pode. Faz parte da caixa preta .
Salva
67

Respostas opacas não podem ser acessadas por JavaScript, mas você ainda pode armazená-las em cache com a API de cache e responder com elas no fetchmanipulador de eventos em um trabalhador de serviço. Portanto, eles são úteis para tornar seu aplicativo offline, também para recursos que você não pode controlar (por exemplo, recursos em uma CDN que não define os cabeçalhos do CORS).

Marco
fonte
1

Também há solução para o aplicativo Node JS. O CORS Anywhere é um proxy NodeJS que adiciona cabeçalhos CORS à solicitação em proxy.

O URL para proxy é literalmente retirado do caminho, validado e proxy. A parte do protocolo do URI com proxy é opcional e o padrão é "http". Se a porta 443 for especificada, o protocolo será padronizado como "https".

Este pacote não impõe restrições aos métodos ou cabeçalhos http, exceto cookies. Solicitar credenciais do usuário não é permitido. O aplicativo pode ser configurado para exigir um cabeçalho para proxy de uma solicitação, por exemplo, para evitar uma visita direta do navegador. https://robwu.nl/cors-anywhere.html

NinjaG
fonte
-2

javascript é um pouco complicado para obter a resposta, eu a corrigi obtendo a API do back-end e depois chamando-a para o front-end.

public function get_typechange () {

    $ url = "https://........";
    $ json = file_get_contents ($url);
    $ data = json_decode ($ json, true);
    $ resp = json_encode ($data);
    $ error = json_last_error_msg ();
    return $ resp;

}
Marcos Chacaliaza Altamirano
fonte