jsonp是什么

转自 http://mp.weixin.qq.com/s/xNnKAeLv6sO0T-IvP2AUlQ          JavaScript微信公众号
一、JSONP的诞生
  • 首先,因为ajax无法跨域,然后开发者就有所思考

  • 其次,开发者发现, <script>标签的src属性是可以跨域的 
    把跨域服务器写成 调用本地的函数 ,回调数据回来不就好了?

  • json刚好被js支持(object)

  • 调用跨域服务器上动态生成的js格式文件(不管是什么类型的地址,最终生成的返回值都是一段js代码)

  • 这种获取远程数据的方式看起来非常像ajax,但其实并不一样 
    便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP。

  • 传递一个callback参数给跨域服务端,然后跨域服务端返回数据时会将这个callback参数作为函数名来包裹住json数据即可。

二、老板,来一斤栗子。
【栗子一】
跨域服务器
文件:remote.js 
代码:

alert('我是远程文件');

本地

<script type="text/javascript" src="跨域服务器/remote.js"></script>

这边做的就是直接引入一个js,页面将会弹出一个提示窗体,显示 我是远程文件。

 

【栗子二】
跨域服务器
文件:remote.js 
代码:

localHandler({"result":"我是远程js带来的数据"});

本地

<script type="text/javascript">

   var localHandler = function(data){

       alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);

   };

</script>

<script type="text/javascript" src="跨域服务器/remote.js"></script>

这边做的是 
1、本地定义一个函数 
2、引入一个js 
3、被引入的js里面,调用这个函数

页面将会弹出一个提示窗体。显示本地函数被跨域的远程js调用成功,并且还接收到了 我是远程js带来的数据。 
新问题出现了:让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同啊?

 

【栗子三】

跨域服务端提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并响应了。

跨域服务器
文件:flightResult.php 
代码:

flightHandler({

   "code":"CA1998",

   "price": 1780,

   "tickets": 5

});

本地

<script type="text/javascript">

   // 得到航班信息查询结果后的回调函数

   var flightHandler = function(data){

       alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');

   };

   // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)

   var url = "跨域服务器/flightResult.php?code=CA1998&callback=flightHandler";

   // 创建script标签,设置其属性

   var script = document.createElement('script');

   script.setAttribute('src', url);

   // 把script标签加入head,此时调用开始

   document.getElementsByTagName('head')[0].appendChild(script);

</script>

 

这次我们做的是 
1、动态创建脚本 
2、url中传递了一个code参数,服务器去做查询CA1998次航班的信息,callback参数告诉服务器,我的本地回调函数叫做flightHandler 
3、跨域服务端调用这个函数flightHandler 页面将会弹出一个提示窗体。把票价、余票以及张数给传递回来了。

三、那么服务器到底做了什么呢? 说到底,就是拼接字符串。
// 数据

$data = [

   "name":"anonymous66",

   "age":"18",

   "like":"jianshu"

];

// 接收callback函数名称

$callback = $_GET['callback'];

// 输出

echo $callback . "(" . json_encode($data) . ")";

 

四、与AJAX的区别是什么?

ajax和jsonp本质上是不同的东西。 
ajax的核心是通过XmlHttpRequest获取非本页内容 
jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。

转载于:https://www.cnblogs.com/guojikun/p/6237033.html

<think>好的,用户现在想了解JSONPJSONPath之间的区别与联系。我需要先回顾一下这两个概念,确保自己理解正确,然后组织一个清晰易懂的解释。 首先,用户之前的问题是关于EditPlus替换功能报错的问题,现在突然转向JSONPJSONPath,看起来是新的主题。但根据提供的引用内容,用户可能在处理JSON数据时遇到了相关工具的使用,比如JSONPath,然后可能混淆了JSONPJSONPath,因此需要明确两者的区别。 首先,JSONPJSON with Padding)是一种跨域数据获取的技术,主要用于解决浏览器的同源策略限制。它通过动态创建script标签来请求数据,服务器返回的数据被包裹在一个函数调用中,这样客户端可以预先定义该函数来处理数据。例如,请求的URL可能包含一个回调函数名,服务器返回如`callbackFunction({data})`,这样客户端脚本就能接收到数据。 而JSONPath是一种查询语言,用于在JSON结构中定位和提取数据,类似于XPath在XML中的应用。用户可以使用特定的表达式,如`$.store.book[0].title`来获取JSON中的特定值。这在数据解析和提取时非常有用,尤其是在处理复杂的嵌套结构时。 接下来需要明确两者的区别:JSONP是解决跨域问题的数据传输方法,而JSONPath是数据查询工具。它们的用途完全不同,但都涉及JSON数据的处理。联系方面,可能在于它们都是处理JSON数据的工具,但应用场景不同。例如,一个网站可能使用JSONP从不同域的API获取数据,然后使用JSONPath解析返回的JSON数据。 需要确保解释时用简单明了的例子,比如JSONP的工作流程和JSONPath的查询示例,帮助用户直观理解。同时,避免技术术语过于复杂,保持口语化。 另外,用户提供的引用中提到了JSONPath的语法和应用,比如在Python中的使用,但未提及JSONP。可能需要补充JSONP的典型应用场景,比如在Web开发中的跨域请求,而JSONPath用于解析本地或服务器返回的JSON数据。 还要注意用户可能存在的混淆点,比如名称相似但功能不同,强调两者虽然名字相近,但解决的问题完全不同。可能需要提醒用户注意拼写,避免混淆。 最后,总结区别和联系,确保用户能够清晰区分两者的用途和适用场景。</think>### JSONPJSONPath 的区别与联系 #### 一、核心概念 1. **JSONPJSON with Padding)** - **跨域数据获取技术**:通过动态创建`<script>`标签绕过浏览器的同源策略限制,实现跨域请求[^1]。 - **实现方式**:服务器返回数据时,将JSON包裹在客户端指定的回调函数中,例如: ```javascript callbackFunction({"name": "Alice", "age": 30}); ``` - **典型应用场景**:早期跨域API调用(如获取第三方天气数据)[^2]。 2. **JSONPath** - **JSON数据查询语言**:类似XPath对XML的定位能力,通过表达式从JSON结构中提取特定数据[^3]。 - **语法示例**: ```plaintext $.store.book[?(@.price > 10)].title // 提取价格超过10的书籍标题 ``` - **典型应用场景**:爬虫数据解析、接口测试(如使用Python的`jsonpath`库)[^4]。 --- #### 二、核心区别 | **特性** | **JSONP** | **JSONPath** | |----------------|------------------------------|-----------------------------| | **用途** | 跨域数据传输 | JSON数据查询与提取 | | **技术类型** | 数据传输协议 | 数据查询语言 | | **依赖关系** | 需要服务端配合返回回调函数 | 仅依赖本地解析库 | | **安全性** | 存在安全风险(如XSS攻击) | 无跨域风险 | | **示例工具** | jQuery的`$.ajax`(JSONP模式)| Python的`jsonpath`库 | --- #### 三、实际联系 1. **数据流程中的协作** 在Web开发中,可能先用JSONP跨域获取数据,再用JSONPath解析响应内容: ```javascript // 前端通过JSONP获取数据 function handleResponse(data) { // 使用JSONPath提取所需字段 const titles = jsonpath.query(data, "$.store.book[*].title"); } ``` 2. **名称相似性** 两者均涉及JSON数据处理,但**功能完全独立**: - JSONP解决“如何获取数据” - JSONPath解决“如何提取数据” --- #### 四、常见误区 - **误区1**:认为JSONPJSON的增强格式 **纠正**:JSONP是数据传输的“包装协议”,与JSON格式无关。 - **误区2**:混淆JSONPath和XPath的作用范围 **纠正**:JSONPath专为JSON设计,而XPath仅用于XML(但语法设计有借鉴)。 --- #### 五、选择建议 - **需要跨域获取数据** ➔ 优先用**CORS**(现代标准),次选JSONP(旧方案) - **需要精准提取JSON字段** ➔ 使用**JSONPath**(Python/Java均有成熟库) ```python # Python中使用JSONPath的示例 import jsonpath data = {"store": {"book": [{"title": "A", "price": 8}, {"title": "B", "price": 12}]}} result = jsonpath.jsonpath(data, "$.store.book[?(@.price > 10)].title") # 输出:['B'] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值