欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

轻松搞定jQuery+JSONP跨域请求的解决方案

程序员文章站 2023-03-30 16:38:56
  jsonp(json with padding)是json的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.ex...

  jsonp(json with padding)是json的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 html 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 json 资料,而这种使用模式就是所谓的 jsonp。用 jsonp 抓到的资料并不是 json,而是任意的javascript,用 javascript 直译器执行而不是用 json 解析器解析。

  上面一段话来自百度百科,概念永远是那么抽象难懂,看例子才是最直观的表现。例子看的多了,领悟到那个点了,自然自己也会学着抽象的描述了。这就是为什么常说“学习知识是从薄到厚,又由厚到薄的过程”。好了扯远了。下面直接来看一个例子。

 轻松搞定jQuery+JSONP跨域请求的解决方案

  问题:本地现有一个页面demo.html需要从http://localhost:3561/user/getallnames获取数据并展示。

  解答:由于问题中的两方不在同一服务器,故需要使用jsonp来跨域访问。

  ① 客户端编写

  客户端使用jquery中提供的$.getjson方法来跨域访问。getjson有3个参数:

    i.   url:请求地址;

    ii.  data:发送到服务端的参数;

    iii. callback:成功时的回调函数。

  getjson的使用方法和普通的$.get方法基本一致,不同的地方在于getjson需要在url后面的参数部分加上callback=?这一固定部分,jquery 将自动替换 ? 为正确的函数名,以执行回调函数。然后在回调函数中操作从异域返回的json对象,回调函数callback的参数即为该json对象。

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  <title></title>
</head>
<body>
  <ul id="namelist"></ul>

  <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <script type="text/javascript">
    $.getjson("http://localhost:3561/user/getallnames?callback=?", function(json) {
      for (var i = 0; i < json.length; i++) {
        $("#namelist").append("<li>" + json[i] + "</li>");
      }
    });
  </script>
</body>
</html>
  ② 服务端编写

  服务端的逻辑主要是将数据序列化为json字符串,然后封装成"callback(json)"的形式,callback为jquery自动生成并传到服务端的函数名称。下面使用c#实现:

public class usercontroller : controller
{
    public string getallnames(string callback)
  {
    string[] names = new string[] { "张三丰", "张无忌", "令狐冲", "杨过", "郭靖" };
    javascriptserializer jss = new javascriptserializer();
    string json = jss.serialize(names);
    return string.format("{0}({1})", callback, json);
  }
}
  至此,便成功解决了问题。

轻松搞定jQuery+JSONP跨域请求的解决方案

 思考:如果服务端已经写死了callback(如:return string.format("moty({0})", json);),那么客户端该怎么写呢?

 参考:

$.ajax("http://localhost:3561/user/getallnames", {
  jsonpcallback: "moty",
  datatype: "jsonp",
  success: function(json) {
    for (var i = 0; i < json.length; i++) {
      $("#namelist").append("<li>" + json[i] + "</li>");
    }
  }
});