jsonp跨域请求详解

yizhihongxing

那么让我们来详细讲解一下“jsonp跨域请求详解”的完整攻略。

什么是jsonp?

JSONP(JSON with padding)是 JSON 的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域请求数据,是一种非正式传输协议。

JSONP通过动态插入script标签的方式实现跨域请求,因为从不同域名下请求js文件是被允许的。JSONP传输的是JSON字符串,所以只支持get请求。而且由于是通过script标签请求的,所以服务器端返回的必须是一段有效的JavaScript代码,JSONP才能正确执行。

JSONP请求示例

比如我们要从其他网站获取一段JSON文本数据,则需要使用jsonp方式请求:

<script>
  function handleData(data){
    console.log(data)
  }
  var script = document.createElement('script');
  script.src = 'http://example.com/data.json?callback=handleData';
  document.head.appendChild(script);
</script>

这里我们创建一个handleData()函数来处理返回的数据,并且在script标签中指定了请求的url以及查询参数?callback=handleData。这里的handleData就是作为回调函数名传递到后台,后台处理完成后就会调用这个函数并传递数据。

后端代码示例:

<?php
$jsonData = '{
    "name": "张三",
    "age": 18
}';
$callback = $_GET['callback'];
echo $callback . '(' . $jsonData . ')';
?>

这里我们在php脚本中先定义了需要返回的JSON格式的数据$jsonData,然后通过$callback = $_GET['callback'];获取前端传递过来的回调函数名,并将数据通过echo $callback . '(' . $jsonData . ')'; 的形式输出到前端。此时前端页面中的handleData()函数就会被调用,传递JSON数据作为参数:handleData({"name": "张三", "age": 18})

JSONP封装函数示例

通常我们为了方便复用,会封装一个JSONP请求的函数:

function jsonp(url,success){
  //1.创建一个随机的函数名,避免被缓存
  var fnName = 'json_' + Math.random().toString().substr(2); 
  //组装查询字符串添加回调函数名称
  var script = document.createElement('script');
    script.src = url + '?callback=' + fnName;
    //定义一个异步的callback函数
    window[fnName] = function(data){
    success&&success(data);
  };
   //请求返回后删除插入的script标签,并将回调函数删除
    script.onload = function () {
      this.remove();
      delete window[fnName];
    };
  document.body.appendChild(script);
}

这里我们定义一个jsonp()函数,它接收两个参数:请求的url和回调函数success。然后我们通过创建一个随机的函数名称,将函数添加到window对象的属性中,然后通过查询字符串将这个函数名称传递给后台。后台返回的数据就会自动调用函数,我们通过success()函数来处理返回数据。

这个jsonp()函数的返回结果就是调用success函数时所传入的data参数。

例如我们要请求服务器的数据:

jsonp("https://api.github.com/search/repositories?q=javascript",function(data){
  console.log(data);
})

这里的https://api.github.com/search/repositories?q=javascript是一个Github API接口,通过查询字符串传递需要搜索的关键词q=javascript,返回的是一段JSON格式的数据。我们在success函数中对这个数据进行处理。

这就是JSONP跨域请求的完整攻略,希望可以帮助你更好的理解和应用JSONP。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsonp跨域请求详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 通过javascript进行UTF-8编码的实现方法

    下面是详细的攻略,你可以按照以下步骤进行UTF-8编码的实现。 第一步:将字符串转化为Unicode码位 我们首先需要将字符串转化为Unicode码位,这是为了确保所有的字符都能够被正确的编码,无论是ASCII字符还是非ASCII字符。在Javascript中,可以使用charCodeAt()方法来获取字符串中每个字符的Unicode码位,然后将它们存储在一…

    JavaScript 2023年5月20日
    00
  • 详解js对象中属性的两种类型之数据属性和访问器属性

    下面将详细讲解“详解js对象中属性的两种类型之数据属性和访问器属性”的完整攻略。 1. 什么是属性 在Javascript中,一个对象是由多个属性构成的。属性是一个键值对,键是一个字符串,值可以是任何JavaScript数据类型,包括基本类型和对象类型。 2. JavaScript对象中属性的两种类型 JavaScript中,对象的属性可以分为两种类型,分别…

    JavaScript 2023年5月27日
    00
  • JavaScript字符集编码与解码详谈

    JavaScript字符集编码与解码详谈 在JavaScript中,字符集编码与解码是十分重要的概念。在本文中,我们将从以下几个方面进行详细讲解。 字符集 字符集(Character Set)是一种字符编码的方式。不同的字符集使用不同的编码方式,来将字符映射成二进制数字。JavaScript中支持多种字符集,包括ASCII码、Unicode、UTF-8等。其…

    JavaScript 2023年5月20日
    00
  • JavaScript 数组方法filter与reduce

    JavaScript 数组方法filter与reduce 在JavaScript中,数组是一个重要的数据类型,因此数组的处理成为我们开发中必不可少的一部分。JavaScript提供了一些内置方法来操作数组中的元素,其中最基础且最常用的是forEach, map, filter和reduce。本文将详细探讨filter和reduce两种方法。 filter方法…

    JavaScript 2023年5月27日
    00
  • JavaScript实现随机码的生成与校验

    生成随机码的实现方法有很多种,下面我将详细讲解其中一种实现方式,包括生成随机码和校验随机码两个部分。 JavaScript实现随机码的生成 第一步 生成指定长度的随机码,这里我们选择将随机码制定为6位,可以以下面的代码实现: function generateRandomCode() { // 定义可能出现在随机码中的字符 var possible = &q…

    JavaScript 2023年5月19日
    00
  • JavaScript的引用数据类型你了解多少

    引用数据类型是 JavaScript 中的一种数据类型,通常用于存储复杂的数据对象,比如数组、对象等。与之相对的是基本数据类型,如数字、字符串等。本篇攻略将详细讲解 JavaScript 的引用数据类型,包括什么是引用数据类型、与基本数据类型的区别、引用类型的常见用途。 什么是引用数据类型? 引用数据类型是一种数据类型,可以存储对象、数组和函数等复杂数据类型…

    JavaScript 2023年6月10日
    00
  • ECMAScript6快速入手攻略

    下面是“ECMAScript6快速入手攻略”的完整攻略: 什么是ECMAScript6? ECMAScript6是JavaScript的一种新版本,也称为ECMAScript2015。它是一种相对于ES5更先进且功能更强大的脚本语言,它改进了很多的语法。它不是一种新的语言,而是JavaScript的下一代标准。 如何使用ECMAScript6? 要开始使用E…

    JavaScript 2023年6月11日
    00
  • win2003下杀任何进程的命令(taskkill,ntsd)

    在Win2003系统下,有两个命令能够杀死进程,分别是taskkill和ntsd。 使用taskkill命令 命令格式 taskkill [/S system [/U username [/P [password]]]] {[/FI filter] [/PID processid | /IM imagename]} [/T] [/F] 参数说明 /S sys…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部