2010-11-19 98 views
4

我想創建一個jsonp請求的服務器和客戶端,我似乎無法使其工作。我瀏覽過很多指南,博客文章等,但幾乎每個人都只顯示客戶端。JSONP - 訪問控制 - 允許來源和MIME類型錯誤

這裏是我的客戶端代碼

$.ajax({ 
    dataType: 'application/json', 
    data: params, 
    jsonp: 'jsonpCallback', 
    url: settings.domain + '/httpext.dll?json_cc', 
    success: function (data) { 
     //determine the return status 
    }, 
    error: function (response, status, error) { 
     //error handling 
    } 
}); //end ajax 

現在,服務器這樣

jsonpCallback({"username":"meltingice","posts"1234}); 

我的問題返回一個硬編碼值是我不能請求和響應的共同努力。目前,該響應返回應用程序/ JSON,所以如果我改變了我的請求RO期待與

資源解釋爲腳本,但使用MIME類型application/JSON轉移JSONP它的錯誤。 未捕獲的ReferenceError:未定義jsonpCallback

首先,如您所見,我定義了jsonpCallback。

現在,如果我改變的數據類型爲應用程序/ JSON,然後我得到這個錯誤

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin. 

正如你所看到的,它並沒有給callback=?到URL。這很令人沮喪。

如何設置服務器端,以便我可以使用jsonp調用它?我需要什麼響應類型?如何格式化返回的數據,以便我的客戶端代碼可以撤回數據?

回答

5

這不工作的原因是因爲你的服務器總是返回一個硬編碼的方法名稱和您的客戶端使用匿名success處理程序。這是行不通的。您需要配置服務器以使用作爲參數傳遞的方法名稱,否則它將永遠不會在客戶端調用回調。所以一旦你將服務器配置爲顧及jsoncallback查詢參數,你可以像這樣的測試:

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) { 
    alert('success'); 
}); 

現在,服務器將收到可能是這樣一個請求:

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345 

,它適當Content-Type以及明顯(application/json

jsonp1290183992345({"username":"meltingice","posts"1234}); 

:應該是這樣迴應。

+0

我已經改變了代碼來拉入默認的回調名稱,但我仍然收到其他錯誤。資源被解釋爲腳本,但通過MIME類型application/json傳輸。 – Josh 2010-11-19 20:44:34

1

我也想提供這個片段,我用ASP.NET MVC來處理jsoncallback。

private static ActionResult GetContent(object data, string callback) 
    { 
     if (!string.IsNullOrEmpty(callback)) 
     { 
      ContentResult result = new ContentResult(); 
      result.ContentType = "application/json"; 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(data); 
      result.Content = string.Format("{0}({1})", callback, json); 
      return result; 
     } 
     else 
     { 
      JsonResult result = new JsonResult(); 
      result.Data = data; 
      result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      return result; 
     } 
    } 
相關問題