使用 JSON 的跨域请求 [重复]

Posted

技术标签:

【中文标题】使用 JSON 的跨域请求 [重复]【英文标题】:Cross-Domain Requests with JSON [duplicate] 【发布时间】:2012-10-31 21:09:22 【问题描述】:

可能重复:Ajax cross domain call

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

要了解此模式的工作原理,首先考虑一个返回 JSON 数据的 URL 请求。例如,JavaScript 程序可能会通过 XMLHttpRequest 请求此 URL。假设 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);

【讨论】:

以上是关于使用 JSON 的跨域请求 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 的跨域限制 - JSON

如何修复 Firefox 中的跨域请求失败

使用AngularJS返回xml的跨域ajax请求

angularjs 1.2.6 的跨域请求错误

使用 CORS 的 OPTIONS 请求宁静的跨域

关于angular.js请求数据的跨域问题