5

可能重复:
Ajax 跨域调用

我的应用程序正在使用ASP .Net Web API 4.5 RTM ,它与不同域上的HTML5 和 AJAX进行交互。

此应用程序是否需要使用JSONP而不是JSON进行序列化/反序列化?

4

1 回答 1

3

JSONP 或者JSON with padding是对基本 JSON 数据格式的补充。它提供了一种从不同域中的服务器请求数据的方法,由于相同的来源策略,典型的 Web 浏览器禁止这样做。

在同源策略下,从 server1.example.com 提供的网页无法正常连接到 server1.example.com 以外的服务器或与之通信。

HTML 元素是一个例外。利用元素的开放策略,一些页面使用它们来检索 JavaScript 代码,该代码对来自其他来源的动态生成的 JSON 格式数据进行操作。这种使用模式称为 JSONP。

JSONP 请求检索的不是 JSON,而是任意 JavaScript 代码。它们由 JavaScript 解释器评估,而不是由 JSON 解析器解析。

要了解此模式的工作原理,首先考虑一个返回 JSON 数据的 URL 请求。例如, JavaScript 程序可能会通过 请求此 URL XMLHttpRequest。假设 Foo 的 UserId 是 1234。请求 URLhttp://server2.example.com/Users/1234 的浏览器,传递 Foo 的 Id,会收到如下信息:

{"Name": "Foo", "Id": 1234, "Rank": 7}

这个 JSON 数据可以根据 URL 中传递的查询参数动态生成。这里,一个 HTML 元素为其 src 属性指定一个返回 JSON 的 URL:

<script type="text/javascript"
    src="http://server2.example.com/Users/1234">
</script>

浏览器将按顺序下载脚本文件,评估其内容,将原始 JSON 数据解释为块,并引发语法错误。即使数据被解释为 JavaScript 对象字面量,它也不能被在浏览器中运行的 JavaScript 访问,因为没有变量赋值对象字面量是无法访问的。

在 JSONP 使用模式中,由 src 属性指向的 URL 请求返​​回 JSON 数据,并在其周围包裹一个函数调用。这样,已经在 J​​avaScript 环境中定义的函数可以操作 JSON 数据。JSONP 有效负载可能如下所示:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

函数调用是 JSONP 的“P”——纯 JSON 周围的“填充”,或者根据 some[1] 的“前缀”。按照惯例,浏览器在对服务器的请求中提供回调函数的名称作为命名查询参数,通常使用名称 JSONP 或回调,例如,

<script type="text/javascript"
     src="http://server2.example.com/Users/1234?jsonp=parseResponse">
</script>

在此示例中,接收到的有效负载将是:

parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});
于 2012-11-12T13:27:50.753 回答