web-dev-qa-db-fra.com

Qu'est-ce qu'une réponse opaque et à quoi sert-elle?

J'ai essayé de fetch l'URL d'un ancien site Web, et une erreur est survenue:

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.

J'ai compris le message et essayé de faire une requête qui renvoie une réponse opaque:

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

Ok, ça marche maintenant ... mais je ne peux pas le lire. = \

Quel est alors le but d'une réponse opaque?

147
Miguel Angelo

Prenons le cas où un opérateur de service agit comme un cache agnostique. Votre seul objectif est de servir les mêmes ressources que celles que vous obtiendriez du réseau, mais plus rapidement. Bien sûr, vous ne pouvez pas vous assurer que toutes les ressources feront partie de votre origine (considérez les bibliothèques servies à partir de CDN, par exemple). Le technicien ayant le potentiel de modifier les réponses du réseau, vous devez vous assurer que vous n'êtes pas intéressé par le contenu de la réponse, ni sur ses en-têtes, ni même sur le résultat. La réponse ne vous intéresse que comme une boîte noire pour éventuellement la mettre en cache et la diffuser plus rapidement.

C’est ce pour quoi { mode: 'no-cors' } a été conçu.

133
Salva

Les réponses opaques ne sont pas accessibles par JavaScript, mais vous pouvez toujours les mettre en cache avec le API de cache et y répondre dans le gestionnaire d'événements fetch dans un agent de service. Ils sont donc utiles pour rendre votre application hors ligne, ainsi que pour les ressources que vous ne pouvez pas contrôler (par exemple, les ressources sur un CDN qui ne définissent pas les en-têtes CORS).

63
Marco

Il y a aussi une solution pour Node _ JS app. CORS Anywhere est un proxy NodeJS qui ajoute des en-têtes CORS à la demande mandatée.

L'URL à proxy est littéralement pris à partir du chemin, validé et proxy. La partie protocole de l'URI mandaté est facultative, la valeur par défaut étant "http". Si le port 443 est spécifié, le protocole par défaut est "https".

Ce paquet ne met pas de restrictions sur les méthodes http ou les en-têtes, sauf pour les cookies. Demander les informations d'identification de l'utilisateur n'est pas autorisé. L'application peut être configurée pour requérir un en-tête pour le proxy d'une requête, par exemple pour éviter une visite directe à partir du navigateur. https://robwu.nl/cors-anywhere.html

2
NinjaG