Je fais une demande CORS à un service Web utilisant jQuery $.ajax
. Conformément à la norme, il existe une demande avant le vol, puis la demande POST réelle.
Ce que j’ai remarqué, c’est qu’il y a deux demandes à chaque fois que j’essaie de passer un appel de service Web (une demande POST avant le vol et une demande POST réelle) uniquement s’il existe un intervalle de temps entre les deux demandes.
Si je continue à appeler le service Web successivement, sans aucun décalage dans le temps (par exemple, moins d’une seconde entre deux demandes), le contrôle préalable est manquant.
Comment puis-je éviter cette demande de pré-vol à chaque fois?
Quel est cet intervalle de temps?
Est-ce quelque chose de spécifique au navigateur Chrome?
Il existe des différences entre les navigateurs dans la manière dont ils implémentent la mise en cache avant le vol. Malheureusement, la spécification W3C n’explique pas à elle seule les nuances que vous avez observées dans la mise en cache avant le vol.
Pour les autres lecteurs de cette question, j’aimerais expliquer que, lorsque le PO déclare une demande de contrôle préalable au vol, il se réfère à la demande OPTIONS
qui précède une demande POST
origine croisée. La requête OPTIONS
est utilisée pour interroger une API et déterminer les méthodes HTTP autorisées pour les requêtes croisées. Généralement, vous vous attendez à voir ce type de réponse à une demande OPTIONS
:
Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Content-Type, X-Requested-With Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
Puisque vous travaillez avec Google Chrome , je vous renvoie à la section applicable du code source du Webkit :
La temporisation de la mémoire cache avant vol par défaut est de 5 secondes:
static const auto defaultPreflightCacheTimeout = std::chrono::seconds(5);
La valeur maximale est de 5 minutes:
static const auto maxPreflightCacheTimeout = std::chrono::seconds(600);
Le serveur peut spécifier une valeur de délai d’expiration pour les demandes préalables au vol à l’aide du champ Access-Control-Max-Age
de l’en-tête de la réponse. Toutefois, le navigateur Webkit impose un délai d’ expiration maximal de 5 minutes.
Pour répondre à vos questions:
Comment puis-je éviter cette demande de pré-vol à chaque fois?
Vous devez définir Access-Control-Max-Age
sur 600 dans l’en-tête de votre réponse d’API à la demande OPTIONS
.
Quel est cet intervalle de temps?
Pour les navigateurs Webkit (Google Chrome, par exemple), le délai d’expiration par défaut est de 5 secondes . C’est pourquoi vous voyez la demande de pré-vol avant chaque demande POST, mais si vous soumettez rapidement des demandes POST, vous ne verrez pas de demandes supplémentaires de pré-vol.
Est-ce quelque chose de spécifique au navigateur Chrome?
Oui , il existe des différences entre les navigateurs quant à la mise en œuvre de la mise en cache avant le vol. La spécification W3C ne spécifie pas tout ce qui est nécessaire pour créer une fonctionnalité de mise en cache avant le vol dans un navigateur Web.
Le navigateur ne fera pas de demande de contrôle en amont si les deux situations suivantes sont vraies:
Cette référence indique les responsabilités de l’utilisateur (navigateur) avec CORS: http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0
Sinon, vous ne devriez pas vous en inquiéter. La mise en œuvre du navigateur fera le bon choix.