2012-02-06 135 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请求发送到外部域服务器端,然后返回结果“本地” 。