2012-02-11 17 views
5

簡短的問題:有沒有辦法讓服務器發出jsonp請求,捕獲請求,但不會將其解析爲javascript?我在jQuery 1.5中使用dataType:「jsonp text」,但它不起作用。發送請求作爲jsonp,將響應解釋爲文本,使用jQuery 1.5

我想通過jsonp通過AJAX訪問跨域URL。問題在於其他域(在我的大學列出的目錄)很老,我懷疑服務器支持jsonp。

  • 在Firefox中,我收到「XML標籤名稱不匹配(預期META)」錯誤。在chrome中,我得到一個「Uncaught SyntaxError Unexpected token <」,它們都指向一個對應於我的AJAX請求的文件。來自錯誤回調的錯誤字符串是「parsererror」。
  • 我無法進行正常的AJAX調用 - 當我將數據類型更改爲「text」或將其全部刪除時,另一個域抱怨用戶未通過身份驗證並重定向至登錄頁面 - 即使我已經登錄瀏覽器端。當dataType是jsonp時,這不會發生。
  • 我知道服務器需要支持JSONP,我不這麼認爲,但是當我將dataType更改爲JSONP時,我可以看到Chrome和Firefox都顯示響應頁面資源 - 所以服務器實際發送對瀏覽器的響應(一個靜態HTML網頁+一些java腳本) - 包含我想要獲取的數據。
  • 問題是,jQuery試圖解析JavaScript的響應,並失敗(因爲它不是JavaScript)。所以數據最終在瀏覽器中 - 我只需要訪問它!
  • 使用dataType:「jsonp text」,它應該表明發送一個jsonp請求,並將響應解釋爲文本沒有區別 - 仍然是一個分析錯誤。

我想要的是:一種以純文本的形式訪問來自jsonp請求的響應的方法。或者,如果我可以從失敗的jsonp請求訪問原始響應 - 那也可以。

在此先感謝!

代碼:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname'; 
var jqxhr = $.ajax({type:"GET", 
url: ajax_url, 
dataType:"jsonp text", 
callback: "whatever", 
success:function(responseData) { 
    $('div#content').text(responseData.slice(0, 100)); 
    dbg(responseData.slice(0,100)); 
}}) 
.success(function() { alert("success"); }) 
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);}) 
.complete(function() { alert("complete"); }); 
+0

你有沒有試過把你訪問的數據放在一個js變量中,然後用js標籤把它封裝起來。似乎是有道理的,如果它試圖把它解析爲js。 – 2012-02-11 09:29:14

回答

8

你想實現將不起作用怎麼辦:如果當服務器正常嵌入的JavaScript函數調用的響應JSONP才能使用。

即使服務器確實將文件發送到瀏覽器,但由於安全限制,您將無法訪問它:您只能將所述數據作爲腳本(使用腳本標記)執行或使用它作爲樣式表(使用鏈接標籤),但如果來自其他域的話,您永遠無法檢查原始文本中的響應。

我想你試圖直接獲取數據爲xml並且失敗(意思是該網站不支持CORS)。如果你不能改變代碼的服務器端,那麼你只有兩個選擇:

  1. 在自己的服務器上創建一個代理,將隧道內的反應(你的服務器端腳本,使實際的請求,並將其發送到瀏覽器):然後從客戶端的角度應用同一域名,並且您將能夠以XML格式請求數據,
  2. 使用flash繞過瀏覽器的安全性(您可以使用flXHR,但它現在看起來有些過時) 。
+0

謝謝!唉,這是我懷疑的。我的確瞭解了CORS(服務器肯定不支持它)和相同的原始策略,並且回想起來,即使服務器將響應發送給jsonp,我也無法檢查它。我確實考慮過做選項1(通過我自己的服務器代理它),但不幸的是我需要客戶端進行身份驗證。我會給flXHR一槍。再次感謝。 – 2012-02-11 11:27:28

+0

關於客戶端認證瀏覽器/ flash,您可能會發現以下有趣的問題:http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically – 2012-02-11 13:14:43