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)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • javascript相关事件的几个概念

    让我详细讲解一下“javascript相关事件的几个概念”。 入门 在学习 Javascript 的时候,很多事件都是离不开的。但在学习它们之前,先来了解一下事件的概念。一个事件是指一个可以被 JavaScript 感知并可以被 JavaScript 处理的用户或浏览器的动作。这个动作可以是一些用户的操作,比如鼠标单击、键盘按键、浏览器窗口的大小改变等等。 …

    JavaScript 2023年6月10日
    00
  • 使用Element进行前端开发的详细图文教程

    下面我将为你详细讲解“使用Element进行前端开发的详细图文教程”的完整攻略。 1. 准备工作 在开始使用Element进行前端开发之前,我们需要先安装Vue.js和Element。 1.1 安装Vue.js Vue.js 官方提供了不同的安装方式,这里我们以CDN的方式安装为例: <!DOCTYPE html> <html> &l…

    JavaScript 2023年6月10日
    00
  • JS字典Dictionary类定义与用法示例

    JS字典Dictionary类是一种以键和值的形式存储数据的集合。在JS中,我们可以使用对象字面量或者Map来创建字典,但是使用Dictionary类可以更好地利用类的特性,对字典进行更加灵活的操作。 定义Dictionary类 我们先来看一下如何定义JS字典Dictionary类。 class Dictionary { constructor() { th…

    JavaScript 2023年5月28日
    00
  • js中.sort()函数的常见用法与高级操作

    让我们来具体讲解一下 JavaScript 中数组的 .sort() 方法吧。 基本用法 .sort() 方法用于对数组进行排序,它可以带一个可选的排序函数作为参数,用于控制排序规则。 默认的排序规则是将元素转换成字符串后进行比较,然后按照 Unicode 码点排序。比如,对于以下数组: const arr = [10, 5, 8, 3, 2]; 如果我们调…

    JavaScript 2023年5月19日
    00
  • 用原生 JS 实现 innerHTML 功能实例详解

    让我来详细讲解如何用原生 JS 实现 innerHTML 功能。 1. innerHTML 功能是什么? 在了解如何用原生 JS 实现 innerHTML 功能前,我们需要先了解一下 innerHTML 功能是什么。innerHTML 是一个 DOM 属性,可以将 HTML 代码添加或替换到指定元素内部。 例如,我们有如下 HTML 代码: <div …

    JavaScript 2023年6月10日
    00
  • express异步函数异常捕获示例详解

    下面将详细讲解“express异步函数异常捕获示例详解”的完整攻略。 什么是异步函数异常捕获 当我们在使用异步函数的时候,如果出现异常错误,如果不进行捕获错误会导致整个应用程序宕机,这会对我们的应用程序和用户造成不便和不良影响。所以很有必要对异步函数的异常进行捕获,防止代码运行出现异常。 express应用中的异常捕获 在express中,我们可以使用try…

    JavaScript 2023年5月28日
    00
  • JavaScript中强大的操作符使用详解

    JavaScript中强大的操作符使用详解 JavaScript中的操作符可用于进行数学或布尔运算。其中一些操作符非常强大且使用频率也很高。在本文中,我将详细介绍这些操作符及其用法。 算术操作符 算术操作符用于数学运算。 加号操作符(+) 加号操作符可用于执行数学加法或字符拼接。对于两个数字相加的情况,其用法如下: let a = 5, b = 6; let…

    JavaScript 2023年5月17日
    00
  • 21个值得收藏的Javascript技巧

    下面就是“21个值得收藏的Javascript技巧”的完整攻略。 1. 使用变量解构(destructuring)来简化你的代码 解构可以让你从一个数据结构中将数据提取到单独的变量中,从而简化你的代码。示例: const obj = { a: 1, b: 2, c: 3 }; // 使用解构简化代码 const { a, b } = obj; console…

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