JSONP 的原理、理解 与 实例分析

JSONP 的原理、理解 与 实例分析

JSONP 的基本原理

JSONP(JSON with Padding)是一种跨域数据访问技术,在 A 网站的页面中向 B 网站请求数据时,由于浏览器的同源策略限制,不允许直接访问不同域下的数据。但是,通过在 A 网站中添加一个 script 标签,请求 B 网站中的数据,并采用特定的回调函数对数据进行处理。B 网站返回的数据包裹在回调函数中,从而实现跨域数据访问。

以访问百度搜索接口(http://suggestion.baidu.com/su?wd=string)为例,URL 中 wd=string 表示搜索框中输入的关键字,通过 JSONP 技术实现跨域数据访问的代码如下:

function searchBaidu(){
  var input = document.getElementById("keyword").value;
  var url = "http://suggestion.baidu.com/su?wd=" + input + "&cb=handleData";
  var script = document.createElement("script");
  script.src = url;
  document.body.appendChild(script);
}

function handleData(data){
  // 处理数据
}

在上述代码中,searchBaidu 函数通过创建一个 script 标签来向百度搜索接口请求数据,其中每个 script 标签都有一个 src 属性来指定请求的 URL。返回的数据包裹在回调函数 handleData 中进行处理。

JSONP 的实例分析

示例 1:从 Flickr API 中获取照片

以从 Flickr API 中获取照片为例,API 文档地址:https://www.flickr.com/services/api/flickr.photos.search.html

  1. 在个人网站上添加一个搜索框和一个搜索按钮。
<div>
  <input type="text" id="keyword">
  <input type="button" value="搜索" onclick="searchPhotos()">
</div>
  1. 创建一个函数 searchPhotos,在函数中创建一个 script 标签,向 Flickr API 发送请求。同时,在发送请求之前,需要生成一个 callback 函数的名称,并将其作为参数添加到 URL 中。返回的数据将会包裹在回调函数中。
function searchPhotos(){
  var input = document.getElementById("keyword").value;
  var apiKey = "9e1e143ef32b2c960dc37ca005f6da7e";
  var method = "flickr.photos.search"; 
  var url = "https://www.flickr.com/services/rest/?method=" + method
    + "&api_key=" + apiKey + "&text=" + input + "&format=json&jsoncallback=handleData";
  var script = document.createElement("script");
  script.src = url;
  document.body.appendChild(script);
}

function handleData(data){
  console.log(data);
  // 打印数据
}

在上述代码中,生成的 URL 如下所示:

https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=9e1e143ef32b2c960dc37ca005f6da7e&text=sky&format=json&jsoncallback=handleData

在这个 URL 中,jsoncallback 的值指定回调函数的名称,因此 AJAX 请求的返回值将是一个回调函数调用的完整代码块。

  1. 在服务器端,返回 JSON 数据,并根据请求中指定的 callback 函数名,返回生成该回调函数调用的代码块。

例如,在 PHP 中返回 JSON 数据并使用 $_GET["callback"] 获取回调函数名,实现代码如下:

<?php
header('Content-type: application/javascript');
$data = array("name" => "Ricky", "age" => "20");
$callback = $_GET["callback"];
echo $callback . "(" . json_encode($data) . ");";
?>

在返回数据前,使用 $_GET["callback"] 获取回调函数名,构建一个类似于下面的 JSON 数据:

{
  "name": "Ricky",
  "age": "20"
}

并在返回数据时,将该数据和回调函数名拼接在一起,返回生成该回调函数调用的代码块,如下所示:

handleData({"name":"Ricky","age":"20"});

这样的返回数据将直接放在 script 标签中,浏览器将以脚本文件的形式执行。

示例 2:通过淘宝 API 查询IP地址所在地

以通过淘宝 API 查询 IP 地址所在地为例,API 文档地址:https://ip.taobao.com/instructions.php

  1. 在个人网站上添加一个文本框和一个按钮。
<div>
  <input type="text" id="ip">
  <input type="button" value="查询" onclick="searchIP()">
</div>
  1. 创建一个函数 searchIP,在函数中创建一个 script 标签,向淘宝 API 发送请求。同时,在发送请求之前,需要生成一个 callback 函数的名称,并将其作为参数添加到 URL 中。返回的数据将会包裹在回调函数中。
function searchIP(){
  var input = document.getElementById("ip").value;
  var url = "https://ip.taobao.com/outGetIpInfo?ip=" + input + "&accessKey=alibaba-inc&callback=handleData";
  var script = document.createElement("script");
  script.src = url;
  document.body.appendChild(script);
}

function handleData(data){
  console.log(data);
  // 打印数据
}

在上述代码中,生成的 URL 如下所示:

https://ip.taobao.com/outGetIpInfo?ip=202.204.80.112&accessKey=alibaba-inc&callback=handleData

在这个 URL 中,callback 的值指定回调函数的名称,因此 AJAX 请求的返回值将是一个回调函数调用的完整代码块。

  1. 在服务器端,返回 JSON 数据,并根据请求中指定的 callback 函数名,返回生成该回调函数调用的代码块。

例如,在 PHP 中返回 JSON 数据并使用 $_GET["callback"] 获取回调函数名,实现代码如下:

<?php
header('Content-type: application/javascript');
$data = array("ip" => "202.204.80.112", "city" => "南京");
$callback = $_GET["callback"];
echo $callback . "(" . json_encode($data) . ");";
?>

在返回数据前,使用 $_GET["callback"] 获取回调函数名,构建一个类似于下面的 JSON 数据:

{
  "ip": "202.204.80.112",
  "city": "南京"
}

并在返回数据时,将该数据和回调函数名拼接在一起,返回生成该回调函数调用的代码块,如下所示:

handleData({"ip":"202.204.80.112","city":"南京"});

这样的返回数据将直接放在 script 标签中,浏览器将以脚本文件的形式执行。

总结

通过使用 jQuery.ajax 和 JSONP 技术可以轻松实现跨域数据访问。JSONP 技术通过创建一个 script 标签,在浏览器中执行 JavaScript 代码的方式来接收返回的数据。在回调函数中对数据进行处理,可以使数据不受跨域限制而被调用。

其中,回调函数名称是在请求时候由客户端生成的,需要服务器端返回执行该回调函数是完整的 JavaScript 代码。如果服务器端不能返回正确的回调函数,则会发生错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSONP 的原理、理解 与 实例分析 - Python技术站

(0)
上一篇 4天前
下一篇 4天前

相关文章

  • js结合json实现ajax简单实例

    让我来给您详细讲解一下通过JavaScript结合JSON实现AJAX的简单实例的步骤。 简介 AJAX是用于在不刷新整个页面的情况下向服务器发送异步请求的技术。JSON是一种轻量级的数据交换格式,广泛用于Web应用程序之间的数据传输和关系数据库管理系统之间的数据导入导出。JavaScript常常被用于AJAX技术的实现。JavaScript可以用XMLHt…

    JavaScript 4天前
    00
  • JavaScript数组去重和扁平化函数介绍

    当涉及到JavaScript数组时,我们经常需要对元素进行去重和扁平化处理。在这篇攻略中,我们将介绍如何使用JavaScript编写去重和扁平化数组的函数。 JavaScript数组去重 方法一:使用ES6 Set ES6 Set是一组不重复的值的集合。它提供了一个很方便的方法来过滤掉数组中的重复元素。 以下是示例代码: const arr = [1, 1,…

    JavaScript 4天前
    00
  • javascript 常用验证函数总结

    JavaScript常用验证函数总结 在JavaScript开发中,我们通常需要对用户输入的数据进行验证,以确保应用程序的安全性和正确性。为了方便验证,JavaScript中提供了一些常用的验证函数。下面对这些函数进行总结。 数字类 isFinite() isFinite()函数用于检查一个数值是否无穷大。 示例: console.log(isFinite(…

    JavaScript 2023年5月19日
    00
  • JavaScript实现多维数组的方法

    实现多维数组的方法主要分为两种:数组嵌套和扁平化转换。本文将详细介绍这两种方法,并附上代码示例。 数组嵌套 在 JavaScript 中,多维数组最简单的实现方法就是使用数组嵌套。例如,下面是一个二维数组的示例: const arr2d = [ [1, 2], [3, 4], ]; 要创建三维数组,只需在二维数组的基础上再嵌套一层数组: const arr3…

    JavaScript 4天前
    00
  • js自调用匿名函数的三种写法(推荐)

    下面是JS自调用匿名函数的三种写法攻略: 1. 包裹执行 最常见的自调用匿名函数就是包裹执行(也称为自调用函数表达式,IIFE)。这种写法在函数表达式后紧跟一个括号,表示调用这个函数。其主要目的是防止变量污染全局作用域。 标准写法: (function() { // 在这里编写你的代码 })(); 可以使用 arrow function (ES6+)简化写法…

    JavaScript 4天前
    00
  • JS获取字符对应的ASCII码实例

    首先我们来说明一下什么是ASCII码。ASCII码是一种常见的字符编码方案,使用7位二进制数来表示128个字符(包括字母、数字、符号等)。 接下来,我们将介绍如何使用JavaScript获取字符对应的ASCII码。 1. 使用charCodeAt()方法 charCodeAt()方法返回指定位置字符的Unicode编码,我们可以使用charCodeAt()方…

    JavaScript 3天前
    00
  • javascript实现动态时钟的启动和停止

    下面是详细讲解“javascript实现动态时钟的启动和停止”的完整攻略: 一、实现动态时钟的基本原理 实现动态时钟的基本原理是使用 JavaScript 获取当前时间,并将其实时显示在网页中。在 HTML 中,我们可以通过一个 <div> 元素来作为时钟容器,然后使用 JavaScript 动态地更新 div 元素的文本内容。具体实现流程如下:…

    JavaScript 4天前
    00
  • JavaScript数据类型转换详解(推荐)

    JavaScript数据类型转换详解 JavaScript 是一门动态数据类型的语言,需要在程序中进行数据类型转换。JavaScript 数据类型转换包括强制数据类型转换和隐式数据类型转换。本篇文章将详细讲解 JavaScript 数据类型转换,以便让初学者更好地理解。 强制数据类型转换 强制数据类型转换是使用内置的 JavaScript 函数将一个数据类型…

    JavaScript 3天前
    00
  • JavaScript高级程序设计(第3版)学习笔记10 再访js对象

    JavaScript高级程序设计(第3版)学习笔记10 再访js对象攻略: 什么是JS对象 JS对象是可变的键控集合,它们的(键)对应的值可以是函数、数组、基本类型值或其他对象。对象在JavaScript中的作用非常广泛,JavaScript是一门基于对象的编程语言,它支持面向对象的编程方式。 构造函数 构造函数是创建特定类型对象的一种特殊函数,它充当初始化…

    JavaScript 4天前
    00
  • JavaScript.Encode手动解码技巧

    以下是我准备的“JavaScript.Encode手动解码技巧”的攻略: JavaScript.Encode手动解码技巧 什么是JavaScript.Encode 在 Web 开发中,JavaScript 是一种常用的脚本语言,可以用来实现各种交互效果。JavaScript.Encode 是一种将 JavaScript 代码进行编码的方式,使得代码难以被人识…

    JavaScript 2023年5月19日
    00