2011-05-06 2 views
7

Je développe un plug-in jQuery qui sera un connecteur pour certaines API REST. La mise en œuvre est simple, mais la même politique d'origine est définitivement douloureuse. Je dois effectuer la plupart des requêtes POST.Requêtes jQuery et cross domaine POST

J'ai aussi essayé de mettre en œuvre la méthode OPTIONS et retour (est python, mais le sens doit être clair)

def options(self): 
    self.response.headers['Access-Control-Allow-Origin'] = self.request.host_url 
    self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    self.response.headers['Access-Control-Allow-Headers'] = 'x-requested-with' 
    self.response.headers['Access-Control-Max-Age'] = '1728000' 

ne fonctionne toujours pas ... une idée?

PS: Je l'ai vu qu'il ya d'autres questions avec un sujet similaire mais j'ai besoin d'une solution spécifique pour la méthode POST (GET pourrait être facilment mis en œuvre par les iframes utilisant)

exemple Javascript:

$.ajax({ 
    url: options.protocol+'://'+options.host+':'+options.port+'/'+method, 
    data: rawData, 
    async:false, 
    dataType: "json", 
    type:"POST", 
    success:function(data) 
    { 
     alert('asd'); 
     result.data = data; 
     alert(data); 
    }, 
    error:function(lol){ 
     alert('omggg !!!!'+lol); 
    } 

}); 

EDIT: ajout javascript exemple de code

+0

Les en-têtes de domaines croisés sont-ils pris en charge dans les navigateurs que vous devez prendre en charge? –

+0

Avez-vous essayé seulement avec 'Access-Control-Allow-Origin' et en le réglant sur' * '? Cela a toujours fonctionné pour moi. – mekwall

+0

Eh bien, je viens de trouver un article qui expliquait le rôle de ces en-têtes. Pour le test j'utilisais firefox et acutally j'ai eu le corps de retour (thx httpfox) mais je ne peux pas obtenir la méthode de succès appelée (jQuery.ajax) – Cesar

Répondre

9

Il est un peu un violon parfois, quelques réflexions:

  • CORS est uniquement pris en charge par les navigateurs relativement récents, vous devez donc être sûr d'en utiliser un.
  • IE ne supporte que CORS via l'objet XDomainRequest, et non l'objet standard XMLHttpRequest, mais jQuery ne pas répondre spécifiquement à cette (encore, je dois admettre que je suis un peu surpris et m'y attends trop longtemps avant), donc vous devez ajouter une manipulation spéciale pour faire ce travail sur IE (et puis seulement IE8 et ci-dessus). Modifier: Scandaleusement, apparemment l'équipe jQuery ont eu cette demande et refusée il: ticket #8283 Cela fait pas sens. Êtes-vous sûr de cette valeur Access-Control-Allow-Origin? Il ressemble comme il permet seulement l'accès du serveur, il est allumé. Cet en-tête est destiné à spécifier à quelles origines le serveur autorisera la requête à. (Et * est autorisé, pour signifier "n'importe où.")
  • Je semble me souvenir de mes expériences avec Firefox à ce sujet qu'il était fastidieux sur mes méthodes d'autorisation en répondant à la demande OPTIONS qu'elle n'avait pas demandée.
  • Vérifiez à nouveau que vous autorisez tous les des en-têtes que la demande envoie; Dans votre exemple, il semble que vous n'autorisez qu'un seul en-tête (x-requested-with), mais je parie qu'il y en aura d'autres dans la requête actuelle.

FWIW (Je ne suis pas un gars Python), voici mon code JSP qui fonctionne, ce sera peut-être utile   — Je pense que les noms d'objets sont assez clairs pour être lisible même si vous ne le faites pas Java (et qui sait, peut-être que vous faites):

String corsOrigin, corsMethod, corsHeaders; 

// Find out what the request is asking for 
corsOrigin = request.getHeader("Origin"); 
corsMethod = request.getHeader("Access-Control-Request-Method"); 
corsHeaders = request.getHeader("Access-Control-Request-Headers"); 
if (corsOrigin == null || corsOrigin.equals("null")) { 
    // Requests from a `file://` path seem to come through without an 
    // origin or with "null" (literally) as the origin. 
    // In my case, for testing, I wanted to allow those and so I output 
    // "*", but you may want to go another way. 
    corsOrigin = "*"; 
} 

// Add headers allowing specifically what was requested 
response.addHeader("Access-Control-Allow-Origin", corsOrigin); 
response.addHeader("Access-Control-Allow-Methods", corsMethod); 
response.addHeader("Access-Control-Allow-Headers", corsHeaders); 
if (request.getMethod().equals("OPTIONS")) 
{ 
    // Done, no body in response to OPTIONS 
    return; 
} 
// Processing the GET or POST here; output the body of the response 

Notez que j'utilise exactement la même logique pour GET, POST et OPTIONS sauf que dans le cas des options, je fais un corps de réponse non sortie .

+0

Fonctionne très bien, merci :) – Cesar

+2

@Cesar: Ah, bon! Content que cela ait aidé. –