2012-04-30 198 views
2

我正試圖實現這個http://wiki.kolmisoft.com/index.php/MOR_API_login。我已啓用我的服務器中的設置以允許API。 Javascript的問題在於,我的主要網站在domain.com.com下運行,而星號服務器在voip.website.com上運行。所以當我嘗試使用jQuery調用url時,我得到的XMLHttpRequest無法加載http://voip.website.com/.../.../ ..... Access-Control-Allow-Origin不允許使用原產地http://sites從瀏覽器到另一臺服務器的HTTP POST請求

我不確定實現這個目標的最佳方法是什麼。任何點都會有很大的幫助。

+3

'jsonp'可以去跨域。 –

回答

3

所有瀏覽器都強制執行same-origin policy,其中包含整個主機(website.com與voip.website.com)。除非主機相同,否則無法處理從Ajax帖子返回的JSON。

有一個稱爲JSONP的解決方法。訣竅是你在JavaScript函數中包裝回復。你看,同源策略只適用於數據,而不適用於自己的成熟腳本。所以如果響應是JavaScript而不是數據,那麼瀏覽器認爲你需要運行這個腳本。

例如,假設你的反應將是該JSON:

{ 
    firstName: 'Abed', 
    lastName: 'Nadir', 
    school: 'Greendale Community College' 
} 

相反,你對此作出迴應:

({ 
    firstName: 'Abed', 
    lastName: 'Nadir', 
    school: 'Greendale Community College' 
}) 

要注意的一點是,括號前和化妝後它是一個JavaScript匿名函數而不是JSON數據。您所做的只是接收該響應並剝去前後的JavaScript代碼。

聲音kludgey?它是,但是每個人都會這樣做,包括Flickr,谷歌,亞馬遜,Facebook等等。

2

您將需要使用JSONP將數據包裝在回調中,並將其模仿爲text/javascript以規避跨域策略。

What are some good examples of JQuery using JSONP talking to .net?

標題中提到的.NET,但服務器端環境是不相關的客戶端實現。

一個可行的方法是在你自己的域上設置一個服務器端腳本,它將使用CURL(或任何其他http lib)轉發請求,然後將響應輸出到腳本的XHR請求。此方法在客戶端腳本和您嘗試訪問的遠程域之間建立一個catchall,因爲curl或任何其他服務器端http lib不受跨域策略的約束。

編輯

我會因爲你說你需要發個帖子做一些更細節我的第二個方法。就像概念驗證一樣,我將使用PHP來詳細說明需要完成的任務,但將這個概念轉換爲另一種腳本語言應該很簡單。

假設我可以在您的域上製作一個catchall腳本www.yourdomain.com/data.php該文件中的邏輯需要從http請求中讀取所有後續變量,將它們放入curl實例作爲對新域的請求,執行該請求,然後將請求的響應輸出到我的ajax XHR,這樣就好像從來沒有中介過。

我喜歡用jscol's OOCurl來使curl的語法稍微漂亮些。

<? 
reqire_once('path/to/oocurl.php'); 
$c = new Curl('voip.otherdomain.com/api'); // instantiate with the url endpoint for the api 
$c->post = True; 
// Set the postfields for the child request to the same as the parent 
$c->postfields = $_POST; 
//Bust if there is an error and output that instead 
$c->failoneerror = True; 
$response = $c->exec(); 
if($c->errno()){ 
    //there was an error, what was it? 
    header('Status:' . $c->info(CURLINFO_HTTP_CODE)); 
    echo $c->error(); 
}else{ 
    //success, echo output 
    header('Content-type: application/json'); 
    echo $response; 
} 
?> 

發送您的Ajax請求這類腳本會透明地把他們關在構造函數中捲曲指定的其他領域。請注意,我假設返回mimetype是json - 您可能需要調整以適應您的API。

如果您擁有api的身份驗證憑據,則需要手動將它們編碼爲請求作爲附加post vars,並使用hmac保護端點。這真的是特定於你如何做你的客戶端/服務器端交互,並有點超出重定向器的範圍......基本上只要確保你有一個服務器定義的哈希鹽,並有摘要發送您的發佈請求,以確保第三方不能簡單地發佈到您的中介結束。

編輯

如果有人從谷歌跌倒,我做了一個庫,我自己採取這種方法可用here.

+0

在我目前的情況下,我必須使用JSONP調用HTTP POST。但是這篇文章提到,使用JSONP發佈POST是不可能的。我的理解是否正確? http://stackoverflow.com/questions/3860111/how-to-make-a-jsonp-post-request-that-specifies-contenttype-with-jquery –

+0

然後你唯一的選擇是用第二種方法去因爲你試圖通過ajax發送數據到API而不是獲取它。你是否有能力在你的環境中部署某種腳本(IE你有ssh/ftp訪問以及類似於LAMP堆棧的安裝?) – DeaconDesperado

+0

我完全控制了系統,但系統本身是使用RoR開發的,而我沒有想在那裏擺弄。正如維基中所述,我希望它在嘗試成功登錄時重定向。我曾嘗試過使用第二種方法,但是我面對的問題是,在成功登錄後,voip.website.com返回由ajax捕獲的登錄後頁面。現在我感到這裏..如何告訴Ajax覆蓋當前頁面的新頁面的內容?嗯..也許我不應該在這裏使用Ajax ..必須嘗試一些其他的方法..? –

相關問題