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日

相关文章

  • JavaScript之promise_动力节点Java学院整理

    关于JavaScript中的Promise,我们可以从以下几个方面来介绍: 一、Promise概述 Promise是一种异步编程的解决方案,简单来说就是用更优雅的方式解决回调地狱的问题。根据MDN的定义,Promise是一个代表了一个异步操作最终完成或者失败的对象。 二、Promise三种状态 Promise有三种状态:pending(进行中)、fulfil…

    JavaScript 2023年5月28日
    00
  • 总结JavaScript三种数据存储方式之间的区别

    当我们开发基于 JavaScript 的应用程序时,我们需要考虑如何在应用程序中存储数据。JavaScript 中有很多种数据存储方式,本文将介绍三种最常用的数据存储方式,包括: Cookie Web 存储(LocalStorage 和 SessionStorage) IndexedDB Cookie Cookie 是最早的 Web 储存技术之一,可以通过 …

    JavaScript 2023年6月11日
    00
  • 使用JavaScript检测Firefox浏览器是否启用了Firebug的代码

    要使用JavaScript检测Firefox浏览器是否启用了Firebug,可以通过以下步骤进行操作: 使用navigator.userAgent属性获取当前浏览器的信息。 var isFirefox = navigator.userAgent.indexOf("Firefox") > -1; 判断当前浏览器是否为Firefox浏览…

    JavaScript 2023年6月10日
    00
  • 深入学习JavaScript中的promise

    深入学习 JavaScript 中的 Promise 什么是 Promise Promise 是一种处理异步操作的机制。它将异步操作包装成一个对象,使得我们可以像同步操作一样进行编程。Promise 对象可以表示一个异步操作的“未来结果”,并且提供了一些方法来处理这个“未来结果”的返回值或者错误信息。 Promise 的状态 Promise 有 3 种状态:…

    JavaScript 2023年5月28日
    00
  • Javascript基于对象三大特性(封装性、继承性、多态性)

    JavaScript是基于对象设计的一种编程语言,其三大特性分别是封装性、继承性和多态性。下面我们将对这三个特性分别进行详细的介绍和示例说明。 封装性 封装性是指将对象的属性和方法组合成一个单独的单元,即封装成一个类。封装性可以隐藏对象的具体实现方式,只暴露必要的接口给外部使用,提高代码的安全性和可维护性。 示例一 class Person { constr…

    JavaScript 2023年5月27日
    00
  • 一个Js文件函数中调用另一个Js文件函数的方法演示

    为了更好地讲解“一个Js文件函数中调用另一个Js文件函数的方法演示”, 我们将分为以下几个部分介绍: 准备工作:建立两个JS文件,定义函数 示例一:在HTML文件中通过script标签依次引入两个JS文件并演示调用 示例二:通过webpack打包两个JS文件并演示调用 1. 准备工作 我们先建立两个JS文件,分别命名为 file1.js 和 file2.js…

    JavaScript 2023年5月27日
    00
  • JAVASCRIPT实现的WEB页面跳转以及页面间传值方法

    请看以下示范: JAVASCRIPT实现的WEB页面跳转以及页面间传值 页面跳转 在 JavaScript 中,可以通过修改 window.location 对象的属性来实现页面跳转。 直接跳转 // 直接跳转到目标 URL window.location = "https://www.example.com"; 重定向跳转 // 通过重…

    JavaScript 2023年6月11日
    00
  • JavaScript事件概念详解(区分静态注册和动态注册)

    JavaScript事件概念详解(区分静态注册和动态注册) 什么是JavaScript事件? JavaScript事件是指在DOM元素上进行的用户操作或者其他程序事件(比如页面加载完成)。 事件的触发和响应 当一个事件被触发时,浏览器首先会寻找和这个事件相关联的DOM元素,然后执行用户定义的JavaScript代码,来响应这个事件。事件可以触发多次,Java…

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