2012-08-04 105 views
1

Ahoy!

我正在使用WCF服務來處理來自單獨域上的Web服務器(因此使用JSONP)的Ajax調用。我的電話是這樣的:

$.ajax({ 
    dataType: 'jsonp', 
    type: 'GET', 
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar', 
    success: function (serverData) { 
     // [...] 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     // [...] 
    } 
}); 

我從服務器得到的迴應是這樣的:

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""}); 

和jQuery隨後讀取數據時,它拋出一個parsererror

上面的響應看起來像有效的JSON,並且根據文檔,我認爲「?callback =?」適用於使用JSONP的$ .ajax調用。

在此先感謝您指出我所缺少明顯:-)

回答

2

一對夫婦的事情,我在這裏看到:

  1. 在URL中擺脫回調的參數。創建jQuery JSONP調用會添加自己的回調函數,並且您的成功/錯誤函數將被調用。在後端,從請求中讀取「callback」參數,並用它來包裝你的jsonp響應(你已經這麼做了,所以不要改變那部分)。
  2. 當你進入你的成功功能,serverData將是一個字符串。與jQuery.parseJSON()JSON.parse()解析它:

VAR數據= jQuery.parseJSON(serverData); //或使用 JSON.parse(serverData);

這應該做到這一點。

最後一件事。如果你開始在解析中得到「Unexpected token ...」錯誤,那麼你的JSON字符串中可能會隱藏一個控制字符。我有這個問題,它是一個換行符(「\ n」)。計算出它是通過獲取字符串中類似Chrome的開發工具的控制檯來解析的字符,然後替換:

var data = jQuery.parseJSON(serverData.replace(/\n/g,"")); 
+0

如何用迴應包裝回調參數?你的意思是做一個$回調。'({'。$ jsonResponse。'})'; ? – PinoyStackOverflower 2014-05-20 08:19:53

+1

@PinoyStackOverflower - 抱歉需要一段時間才能找回。回調參數包含前端存在的回調的函數名稱。 jQuery在jsonp請求中包含它。所以你可以從服務器上的請求中讀取'callback'參數,然後對於客戶端的響應,你會返回一個像'callbackParameterValue +'('+ JSON.stringify(serverData)+')'這樣的字符串。然後,jQuery將得到響應並將其傳遞給成功函數,此時您需要將其解析爲JSON,如上所述。 – mpickell 2014-08-28 17:34:44

+0

嗨@mpickell,您能否通過編輯Adam的代碼發佈包含您的建議的完整代碼。這會更有幫助。謝謝! – Bhargav 2016-12-06 05:40:41

0

我在MVC操作方法響應低於失蹤(包裝在回調方法的效應初探)。

response.Write(request.Params["callback"] +"(" +htmlContent +");"); 

和jquery ajax調用應該像下面那樣。

jQuery.ajax({ 
      url:"https://servername/virtualDirectory/ActionMethod,    
      crossDomain: true, 
      dataType: 'jsonp',     
      type: 'GET', 
      cache: false, 
      jsonp:"callback",    
      success: function (data) { 
       alert('success');     
       $fs("#fs_container").htm(data);     
      }, 
      error: function (data, status, req) {       
       alert(req.responseText + " " + status); 
      }     
});