2011-05-06 7 views
7

Bazı REST API'ları için bir bağlayıcı olacak bir jQuery eklentisi geliştiriyorum. Uygulama düz ileri, ancak aynı kökeni politikası kesinlikle ağrılı. Çoğunlukla POST isteklerini gerçekleştirmem gerekiyor.jQuery ve Cross Domain POST İstekleri

Ben de ... bir fikrin SEÇENEKLERİ yöntemini uygulamak için çalıştı ve dönen (bir piton, ama anlamı açık olmalıdır)

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' 

hala çalışmıyor?

PS: Ben de benzer bir konu ile diğer soru olduğunu gördük ama POST yöntemiyle için belirli bir çözüm (easely kullanarak iframe'lerde tarafından uygulanan olabilir GET)

JavaScript örneği gerekir:

$.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); 
    } 

}); 

DÜZENLEME: eklenen javaScript kod örneği

bazen bir keman biraz var
+0

Çapraz etki alanı üstbilgileri, desteklemeniz gereken tarayıcılarda destekleniyor mu? –

+0

Yalnızca "Access-Control-Allow-Origin" ile denediniz mi ve '*'? Bu benim için her zaman çalıştı. – mekwall

+0

iyi, sadece bu başlıkların rolünü açıklayan bir makale buldum. Test için firefox kullanıyordum ve acutally dönüş gövdesini aldım (thx httpfox) ama (jQuery.ajax) – Cesar

cevap

9

, bazı düşünceler:

  • CORS yalnızca oldukça modern tarayıcılar tarafından desteklenmektedir, bu yüzden bunlardan birini kullandığınızdan emin olmanız gerekir.
  • Yalnızca IE XDomainRequest nesne değil, standart XMLHttpRequest nesne aracılığıyla CORS'yi destekler, ancak jQuery özellikle bu hitap etmez (henüz; ben biraz şaşırdım itiraf etmeliyim ve o olacak önce çok uzun beklemek), Bu yüzden IE üzerinde bu işi yapmak için özel bir işlem eklemelisiniz (ve sonra sadece IE8 ve üstü). Düzenleme: Şok edici, görünüşe jQuery ekibi bu isteği oldu ve bunu inkar: hiçbir mantıklıdır ticket #8283.
  • Bu Access-Control-Allow-Origin değeri hakkında emin misiniz? , modelinin yalnızca sunucunun açık olduğundan izinli gibi görünüyor. Bu üstbilginin, sunucuya hangi isteğin izin vereceğini belirtmesi istenir. , dan gelir. (Ve *, "her yerde" demek için izin verilir)
  • Firefox ile yaptığım denemelerden hatırladığım gibi, bu, istemediği OPTIONS isteğine yanıt verirken izin verme yöntemleriyle ilgili olarak çok titiz davrandı.
  • İsteğin gönderdiği başlıkların tüm numaralarına izin verdiğinizi iki kez kontrol edin; Örneğinizde sadece bir başlığa (x-requested-with) izin veriyormuşsunuz gibi görünüyor, ama bahse girerim gerçek istekte başkaları olacak.

FWIW (Ben bir Python adam değilim), burada belki de   — Ben nesne adları Java'yı yapmazsanız bile okunabilir olması kadar net olduğunu düşünüyorum faydalı olacaktır, işleri benim JSP kodu var (ve kim belki yapın bilir):

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 

ben GET için tam POST aynı mantık kullanıyorum Not ve OPTIONS durumunda olması dışında OPTIONS, ben çıkış bir yanıt gövdesini yapmak .

+0

denilen başarı yöntemini alamıyorum, teşekkürler :) – Cesar

+2

@Cesar: Ah, güzel! Bu yardımcı oldu sevindim. –