web-dev-qa-db-fra.com

Options de type de contenu jSu CORS

J'ai un problème avec l'envoi AJAX demande de corps à l'aide de jQuery CORS avec un type de contenu personnalisé. Voici mon code:

$.ajax({
  url: "http://some-other-domain/my-path",
  type: "POST",
  contentType: "application/json",
  dataType: "json",
  data: JSON.stringify({
    key: 1,
    key2: 2
  }),
  statusCode: {
    200: function(data) {
    }
  },
  xhrFields: {
    withCredentials: true
  },
  crossDomain: true
});

J'ai besoin de définir Content-type comme "application/json" car il nécessite le côté serveur. Mais au lieu d’envoyer une requête sous la forme POST, jQuery l’envoie sous forme d’OPTIONS.

Voici un en-tête:

En-têtes de réponse:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 03:00:00 EET
Set-Cookie: JSESSIONID=BB9D6783E58FB0F2ADE1924A2F0CBA52; Path=/
Content-Type: text/html;charset=UTF-8
Content-Length: 6233
Date: Fri, 07 Sep 2012 14:41:13 GMT

En-têtes de demande:

OPTIONS /my-path HTTP/1.1
Host: MY-HOME-NAME
User-Agent: MY_USER_AGEMT
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: HERE-GOES-DOMAIN
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

CORS fonctionne très bien, tous les en-têtes requis sont envoyés par serveur, mais pas s'il envoie par type OPTIONS. Est-ce un problème jQuery?

jQuery - 1.8.1

51
Alex Ivasyuv

Cette demande OPTIONS est la demande de contrôle en amont CORS. C'est une demande qui est envoyée au serveur avant la demande réelle afin de demander les autorisations pour effectuer la demande. Le type de contenu personnalisé déclenche en fait le contrôle en amont. Selon la spécification CORS ( http://www.w3.org/TR/cors/ ), tout type de contenu autre que application/x-www-form-urlencoded, multipart/form-data ou text/plain déclenchent le contrôle en amont.

Si vous n'avez aucun contrôle sur le serveur distant, vous devrez leur demander de prendre en charge le contrôle en amont de CORS ou essayer une autre option telle que JSON-P.

Si vous avez le contrôle sur le serveur distant, vous pouvez le modifier pour gérer les contrôles en amont. Afin de gérer une demande de contrôle en amont, vous devez envoyer les en-têtes suivants dans la réponse à la demande OPTIONS:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type

La réponse doit être un HTTP 200. Le Access-Control-Allow-Methods En-tête de réponse peut renvoyer la valeur du Access-Control-Request-Method, ou cela peut simplement être GET, POST, PUT, DELETE pour supporter toutes les méthodes. Le Access-Control-Allow-Headers En-tête de réponse doit faire écho aux valeurs du Access-Control-Request-Headers en-tête de demande.

Une fois que le navigateur reçoit ces en-têtes, il fera la demande réelle. Vous pouvez en apprendre plus sur les demandes de contrôle en amont de la SCRO ici:

http://www.html5rocks.com/en/tutorials/cors/

128
monsur