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

可能重复:
Ajax cross domain call

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

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

【问题讨论】:

    标签: javascript ajax html asp.net-web-api jsonp


    【解决方案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});
    

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2011-01-04
      • 2016-06-23
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2016-07-20
      相关资源
      最近更新 更多