2012-07-22 105 views
0

我有一個簡單的html文件。它訪問url1併成功解析了json響應。轉發json響應

CLIENT - > URL1 - >響應客戶

我修改了代碼,HTML和調用URL2

CLIENT - > URL2 - > URL1 - >響應URL2 - >響應客戶

我評論了url1並調用了url2。 url2是一個簡單的servlet,它調用url1並獲得響應。 servlet將相同的響應返回給客戶端,但是這次ajax/jquery返回解析錯誤。當我alert(request.responseText)時,它完全匹配URL1返回的響應。

$.ajax({ 
//url: "http://abc1.com", // Line 1 
    url: "http://abc2.com", // Line 2 
    data: {param1, param2},  
    dataType: "jsonp",    
    type: "GET", 
     async:false, 
    success: function(parsed_json) { 
      alert("Success");   
     }, 
     error: function (request, status, error) { 
      alert("Error" + error); 
      alert(request.responseText); 
     } 

該Servlet只是一個層之間的輸入流的內容複製到輸出流。

InputStream input = new URL(url).openStream();
resp.setContentType("application/json"); // Apache commons IOUtils to copy IOUtils.copy(input, resp.getOutputStream());
resp.getOutputStream().flush();

我手動驗證JSON串響應,它似乎是相同的。 可能是什麼問題?

+2

你能否請一個例子json字符串。 (縮短,如果它是一個大樣本) – Mithon 2012-07-22 02:18:00

+0

@Mithon json字符串很大,但在閱讀您的評論後,我覺得我應該嘗試使用較小的json字符串來找出問題。 – 2sb 2012-07-22 02:31:19

+0

這裏有一個有用的linkey爲你:http://jsonlint.com/ – Mithon 2012-07-22 02:52:47

回答

1

這裏有一個可能的問題:我注意到dataTypejsonp,它不同於json。如果請求在期待JSON-P時以json的形式返回,jQuery可以想象會拋出一個錯誤。改變dataTypejson改變什麼?

區別在這裏,順便說一句:

JSON-P主要用於遠程通信的網站。因爲瀏覽器無法發送AJAX請求到其他域出於安全原因,一個JSON-P「AJAX請求」實際上將增加像這樣的DOM:

<script src="http://www.otherwebsite.com/info.js?callback=myCallback"></script> 

如果遠程站點支持JSON-P,它將返回這樣的事情:

myCallback({"foo": "bar"}) 

然後你myCallback功能從遠程站點調用數據 - ただ!

jQuery的自動處理所有這些回調的業務,如果你說的是dataTypejsonp,但是,如果你說jsonp包裝數據的回調,(據我所知)jQuery將發現腳本加載並且拋出一個錯誤,因爲回調從未被觸發。

或者也許它 JSON-P,我只是在屏氣。無論如何。以防萬一:)

+0

他試圖做跨域腳本,這就是爲什麼他需要jsonp。我非常有信心js2是故意這樣做的。 – Mithon 2012-07-22 03:31:06

+0

@Mithon:恩。問題是模棱兩可的,因此,因爲他有權訪問URL2的源代碼,所以我認爲它在他的域中。只是在黑暗中拍攝,真的(: – Matchu 2012-07-22 03:48:02

+0

@Matchu我很長時間忽略了數據類型,你沒有浪費你的時間,你的答案真的有幫助。謝謝。URL1不在我的域名中,支持jsonp,而當我寫url2我是返回json數據類型,而不是jsonp。謝謝米通2。 – 2sb 2012-07-22 03:48:42

0

我查找了jquery documentation爲此,並且它似乎「跨域請求和數據類型:」jsonp「請求不支持同步操作」。所以如果你改成async:true,你可能會有更多的運氣。 :)