2011-05-06 201 views
7

我正在開發一個jQuery插件,它將成爲一些REST API的連接器。 實施很簡單,但同一起源政策肯定是痛苦的。 我需要主要執行POST請求。jQuery和跨域POST請求

我也試圖實現OPTIONS方法和返回(是蟒蛇,但意思應該很清楚)

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' 

仍然無法正常工作...任何想法?

PS:我已經看到,有一個類似主題的其他問題,但我需要POST方法的具體的解決方案(GET可以easely通過使用I幀來實現)

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

}); 

編輯:添加JavaScript代碼示例

+0

您需要支持的瀏覽器是否支持跨域標題? – 2011-05-06 07:36:39

+0

您是否僅使用'Access-Control-Allow-Origin'並將其設置爲'*'來嘗試?這一直對我有效。 – mekwall 2011-05-06 07:45:43

+0

好吧,我剛剛找到一篇文章解釋這些標題的作用。對於測試我使用Firefox和acutally我得到了返回正文(thx httpfox),但我無法獲得稱爲(jQuery.ajax)的成功方法 – Cesar 2011-05-06 07:46:35

回答

9

這是一個略嫌麻煩,有時,一些想法:

  • CORS僅支持相當現代的瀏覽器,因此您需要確保使用其中的一種。
  • IE只能通過XDomainRequest對象,而不是標準XMLHttpRequest對象支持CORS,但jQuery的不專門針對爲(但,我不得不承認,我微微一驚,並預計它會在不久)所以你必須添加特殊的處理才能使這個工作在IE瀏覽器(然後只有IE8和以上)。 編輯:令人震驚的是,顯然jQuery團隊有這個請求並否認它:ticket #8283這使得沒有感。
  • 您確定該Access-Control-Allow-Origin值?它看起來像它只允許從它的服務器訪問。該標題旨在指定服務器將允許來自的請求來自哪個來源。 (*是允許的,意思是「任何地方」。)
  • 我似乎回想起我在Firefox上的實驗,因爲在迴應OPTIONS請求時,我的允許方法是非常挑剔的。
  • 仔細檢查您是否允許全部請求發送的標頭;在你的例子中,它看起來像只允許一個標題(x-requested-with),但我敢打賭在實際請求中會有其他人。

FWIW(我不是一個Python的傢伙),這裏是我的JSP代碼的作品,也許這將是  —我覺得對象名稱是不夠清晰甚至可以說,如果你不這樣做的Java讀取有用(和誰知道,也許你做的):

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 

請注意,我使用完全相同的邏輯GETPOST,並且除了在選項的情況下OPTIONS,我不輸出響應體。

+0

作品相當不錯,謝謝:) – Cesar 2011-05-09 02:47:26

+2

@Cesar:啊,好!很高興這有幫助。 – 2011-05-09 05:21:22