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

yizhihongxing

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日

相关文章

  • ES7之Async/await的使用详解

    ES7之Async/await的使用详解 什么是Async/await Async/await是ES7中引入的一组用于异步操作的新关键字。它们可以让我们更方便、更优雅地处理异步代码,避免了回调地狱(callback hell)的问题。 Async/await的基本用法 要使用Async/await,我们首先需要使用async关键字定义一个异步函数,函数中使用…

    JavaScript 2023年6月10日
    00
  • web开发js字符串拼接占位符及conlose对象Api详解

    Web开发JS字符串拼接占位符及Console对象API详解 在Web开发中,字符串拼接是一个常见的操作,而JS提供了多种字符串拼接方式。本文将详细讲解JS中字符串拼接的多种方式,以及Console对象的API使用方法。 字符串拼接 +号拼接 +号是最简单直接的字符串拼接方式,可以将多个字符串拼接在一起。 const name = ‘Jerry’; cons…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript中的闭包是如何产生的

    下面是详解JavaScript中的闭包是如何产生的的完整攻略: 什么是闭包 闭包是指在一个函数内部创建另一个函数,并返回这个函数,这个函数可以访问父级作用域中的变量。因为这种情况下父级作用域中的变量不会被垃圾回收机制回收,所以称之为“闭包”。 简单来说,闭包是指有权访问另一个函数作用域中变量的函数。 闭包的产生 闭包的产生通常有两种情况。 1. 在函数内部创…

    JavaScript 2023年6月10日
    00
  • JS计算两个时间相差分钟数的方法示例

    下面是详细讲解 “JS计算两个时间相差分钟数的方法示例” 的完整攻略。 1. 方案概述 在 JavaScript 中计算两个时间相差分钟数的方法,通常需要使用 Date 对象的 getTime() 方法,将时间对象转换为时间戳,再进行计算。 2. 方案步骤 首先,获取两个时间对象。可以使用 Date 对象,也可以从后端 API 接口获取时间数据。 然后,将两…

    JavaScript 2023年5月27日
    00
  • js定时器(执行一次、重复执行)

    下面我来详细讲解关于JS定时器的使用方法。 JS定时器概述 JS定时器是指按照指定的时间间隔来执行一段JavaScript代码的一种机制。在Web开发中,经常需要执行一些定时操作,例如图片轮播、定时刷新页面等等,这时候就可以使用JS定时器。 JS定时器一般分为两种类型:setTimeout和setInterval。其中setTimeout表示延时执行一次任务…

    JavaScript 2023年6月11日
    00
  • js contains方法实现代码

    当我们需要在一个字符串中查找特定字符或子串时,可以使用JavaScript提供的 contains() 方法。下面是实现 contains() 方法的代码: String.prototype.contains = function(substr) { return this.indexOf(substr) !== -1; } 这里定义了一个全局方法 Stri…

    JavaScript 2023年5月28日
    00
  • 如何用JS模拟实现数组的map方法

    下面是使用JS模拟实现数组的map方法的完整攻略。 原理分析 Array.map() 方法可以对数组中的每个元素进行操作,生成一个新的数组,而不会改变原来的数组。其原理实际上就是循环遍历数组,每次将当前元素作为参数传入回调函数中进行操作,并将返回值存入新的数组中。 实现步骤 创建一个函数,命名为myMap。该函数需要两个参数,第一个参数是需要进行操作的数组,…

    JavaScript 2023年5月27日
    00
  • js清理Word格式示例代码

    下面是完整攻略: JS清理Word格式示例代码 什么是清理Word格式 当使用Microsoft Word编辑文本时,将添加许多不必要的格式。如果将复制粘贴的内容从Word文档粘贴到Web页面或其他文本编辑器中,这些格式可以导致页面变得凌乱或难以阅读。为了解决这个问题,我们需要编写代码来清除这些格式。 清理Word格式的方法 有许多方法可以清除Word格式,…

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