2012-02-06 98 views
2

我需要在另一個域上的.NET Web服務上創建一個Ajax帖子。我可以將來自服務器的任何返回數據設置爲jsonp並使用js讀取數據嗎?我碰到過這種解決方案發布到.NET服務時:通過.NET的jQuery AJAX POST - JSONP返回

http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

$.ajax({ 
    type: "POST", 
    url: "PageName.aspx/MethodName", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
    // Do something interesting here. 
    } 
}); 

我用這個之前取得很大的成功,但是我的電話一直在同一個域中。現在我想發佈跨域(甚至可能?),返回的數據可以在jsonp中以避免任何跨域問題。

通常當我做GET請求跨域讓我們說的API,我通常使用「腳本」作爲我在Ajax調用數據類型,且通過與成功的AJAX功能之外回調函數的數據解析。

是否有可能在上述呼叫使用「腳本」的數據類型或我將如何去進行此調用,仍然治療返回的數據作爲JSONP回調函數的內部看?

+2

您要呼叫的服務器也必須支持JSONP。是這樣嗎? – 2012-02-06 20:57:01

+0

假設它。 – spez86 2012-02-06 21:03:54

回答

0

使用jsonp時,您需要提供一個回調名稱作爲url querystring參數。這是返回數據時將在客戶端調用的函數的名稱。在服務器端,你需要做這樣的事情:

if request.GET.has_key('callback'): 
    callbackName=request.GET['callback'] 
    str="%s(%s)"%(callbackName,str) 
return HttpResponse(str, mimetype='application/javascript') 

欲瞭解更多信息閱讀http://api.jquery.com/jQuery.ajax/和搜索頁面上JSONP。

頁面:顯然我的代碼片段是Python,但它的原理是一樣的。

+0

謝謝,這很有道理。但我更關心如何設置實際的ajax調用,以及它在調用時應聲明的數據類型。 – spez86 2012-02-06 21:05:02

+0

dataType應該是jsonp。 – Sid 2012-02-06 21:05:47

+0

這裏有一個例子:http://stackoverflow.com/questions/2067472/please-explain-jsonp看看答案8 Upvotes – Sid 2012-02-06 21:08:57

0

返回數據的數據格式由服務器端的API決定。一些API提供了jsonp格式。查找API文檔。在撥打電話的客戶端(除非您擁有該API),您無權訪問它。

0

JSONP不是AJAX。

AJAX使用瀏覽器的XHR接口在XHR的目標與啓動XHR的頁面相同的限制下創建單獨的HTTP請求。

另一方面,JSONP是一個成爲標準的黑客。 JSONP是相當於... <script src="http://api.yoursite.com/whatever/call.json?callback=asdf

如果返回的文件實際上只是一個JavaScript看起來像...... asdf({ ... json data ... });

這一切讓這個非常重要的一點:

你無法進行跨域AJAX POST,也無法使用JSONP進行POST。爲什麼? JSONP只有GET,因爲它基於<script>標記。

爲此,有一些規避技術,最簡單的可能是本地代理方法,您在服務器上設置一個頁面,將API請求發送到外部域服務器端,然後返回結果「本地」 。