使用 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 数据,并在其周围包裹一个函数调用。通过这种方式,已经在 JavaScript 环境中定义的函数可以操作 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 的跨域请求 [重复]的主要内容,如果未能解决你的问题,请参考以下文章