¿Qué es una respuesta opaca y para qué sirve?

172

Intenté acceder a fetchla URL de un sitio web antiguo y ocurrió un error:

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.

Entendí el mensaje e intenté hacer una solicitud que devuelve una respuesta opaca:

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

Ok, ahora funciona ... pero no puedo leerlo. = \

¿Cuál es el propósito, entonces, de una respuesta opaca?

Miguel angelo
fuente

Respuestas:

149

Considere el caso en el que un trabajador de servicio actúa como un caché agnóstico. Su único objetivo es servir los mismos recursos que obtendría de la red, pero más rápido. Por supuesto, no puede asegurarse de que todos los recursos formen parte de su origen (considere bibliotecas servidas desde CDN, por ejemplo). Como el trabajador del servicio tiene el potencial de alterar las respuestas de la red, debe garantizar que no está interesado en el contenido de la respuesta, ni en sus encabezados, ni siquiera en el resultado. Solo le interesa la respuesta como un cuadro negro para posiblemente almacenarlo en caché y servirlo más rápido.

Para esto { mode: 'no-cors' }fue hecho.

Salva
fuente
2
Pero Status codesiempre es 0, ¿cómo verificar si tuvo éxito si status is never 200?
Angshuman Agarwal
3
No puedes. Es parte de la caja negra .
Salva
67

JavaScript no puede acceder a las respuestas opacas, pero aún puede almacenarlas en caché con la API de caché y responder con ellas en el fetchcontrolador de eventos en un trabajador de servicio. Por lo tanto, son útiles para desconectar su aplicación, también para recursos que no puede controlar (por ejemplo, recursos en un CDN que no configura los encabezados CORS).

Marco
fuente
1

También hay una solución para la aplicación Node JS. CORS Anywhere es un proxy NodeJS que agrega encabezados CORS a la solicitud proxy.

La url para proxy se toma literalmente de la ruta, validada y proxied. La parte del protocolo del URI proxy es opcional y el valor predeterminado es "http". Si se especifica el puerto 443, el protocolo predeterminado es "https".

Este paquete no impone restricciones a los métodos o encabezados http, excepto las cookies. Solicitar credenciales de usuario no está permitido. La aplicación se puede configurar para que requiera un encabezado para enviar una solicitud, por ejemplo, para evitar una visita directa desde el navegador. https://robwu.nl/cors-anywhere.html

NinjaG
fuente
-2

JavaScript es un poco complicado para obtener la respuesta, lo arreglé obteniendo la API del backend y luego llamándola a la interfaz.

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
fuente