js跨域交互(jQuery+php)之jsonp使用心得

简介: jsonp是什么?说到jsonp,你可能最先想到JSON;它还真和JSON有关系;JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

jsonp是什么?

说到jsonp,你可能最先想到JSON;它还真和JSON有关系;

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。


JSONP(JSON with Padding),我更倾向于把最后一个字母P理解为 protocol(协议,约定);

有这么一个故事:

A男和B女居住在不同的国家A国和B国,在一次去C国旅行的途中相遇了,双方聊的比较Happy,旅行结束都回国了;但A男总是会想B女,想联系上B女,无奈当时没有留下B女的电话、邮箱、微信、QQ号码这些可以更加即时的联系方式,只是闲聊间知道B女地址,那就只能写信吧去C国也不太现实;于是就写信把自己的各种即时联系方式都写进去了,一封信寄出去了过了一段时间没有回音又写一封,就是没有收到C友的电话等任何回音;对方收到了没有呢,确定是收到了也看了。

这是为什么呢?C女不想搭理他呗(没有按A男指定的方式回调)!

转回正题

JSONP就是这么一回事,你知道对方的调用地址,告诉对方你的回调函数名称是什么,但对方如果不配合,就是不调用你约定的回调函数名称,你调用多少次也没用,所以JSONP的关键还是要对方配合你才行。

js跨域交互实现原理

HTML <script> 标签,对就是它,世界因它而美好!

你可以使用这个标签加载任何其它可访问到的网站的js文件试试,我就不多说了;

跨域交互一:jQuery.getScript

这个例子比较简单易懂,使用固定的回调函数名称:fncallback

调用端,也可以说是客户端:

我是在本地测试,跑了多个Web服务,本地页面访问地址:http://localhost:88/

网页中的JS代码如下:

<script type="text/javascript" src="jquery-1.10.2.min.js"></script>

<script type="text/javascript">

//定义名称为“fncallback”的回调函数,参数接收JSON对象;
function fncallback(data){
	$(document.body).append("<hr />getScript ok!" + data.reqUrl);
}

//注册页面加载完成回调函数(匿名)
$(document).ready(function(){

	//使用getScript方法调用跨域脚本;
	$.getScript("http://localhost/test2.php");

});
</script>
效果:在页面尾部增加一条线,以及:getScript ok! ,后面紧跟被调用端返回的它接收到的请求地址:

getScript ok!/test2.php?_=1467261287339
后面为什么会多了个“ ?_=1467261287339”呢?

这是防止浏览器从缓存去加载这个URL地址的内容的!由jQuery自动添加;

被调用端,也可以说是服务端
服务端后台语言是PHP,通过Nginx代理的,端口为:80,所以访问地址是:http://localhost/test2.php

test2.php 文件的内容:

<?php
echo "var reqUrl = \"" . $_SERVER["REQUEST_URI"] . "\";";
echo "fncallback({\"reqUrl\": reqUrl });";
浏览器访问:

通过浏览器访问,自然没有后面的参数,除非你自己手动加上;

跨域交互二:jQuery.getJSON

调用端:
<script type="text/javascript">

//注册页面加载完成回调函数(匿名)
$(document).ready(function(){
	//使用getJSON方法调用跨域脚本;注册匿名回调函数
	$.getJSON("http://localhost/test.php?callback=?", function(data){
		$(document.body).append("<hr />getJSON ok!" + data.reqUrl);
	});
	
});
</script>
注意:我在请求的地址中添加了“?callback=?”,这是做什么用的呢?

目的是让jQuery为我自动生成一个回调函数的名称,并将我注册的匿名回调函数映射到这个“自动生成的回调函数名称”上;

有点绕,我们来看看服务端返回的它收到的请求地址就明白了:

getJSON ok!/test.php?callback=jQuery1102031468501139651384_1467262280037&_=1467262280038
看到callback后面跟了参数值了吧,这就是jQuery自动生成的;再看服务端代码;

服务端

<?php
echo "var reqUrl = \"" . $_SERVER["REQUEST_URI"] . "\";";
echo $_GET["callback"] . "({\"reqUrl\": reqUrl });";
通过 $_GET["callback"] 获取客户端传递过来的回调函数名称;看输出:

var reqUrl = "/test.php?callback=jQuery1102019717387174726153_1467262461959&_=1467262461960";
jQuery1102019717387174726153_1467262461959({"reqUrl": reqUrl });

跨域交互三:jQuery.ajax

调用端:
<script type="text/javascript">

//注册页面加载完成回调函数(匿名)
$(document).ready(function(){
	
	//使用ajax方法调用跨域脚本;
	$.ajax({
		url:"http://localhost/test.php", 
		dataType: 'jsonp', 
		success: function(data){
			$(document.body).append("<hr />ajax ok!" + data.reqUrl);
		}
	});
	
});
</script>
注意:在请求的地址中不需要添加“?callback=?”,但我们使用“dataType: 'jsonp',”;

服务端
这个例子的服务端和上个是完全一样的!

使用总结

使用 getScript 的方式,你可以自己定义一个回调函数的名称,让服务端响应的时候使用你指定的回调函数名称;

使用 getJSON 的方式关键在于URL后面添加的“callback=?”;

使用 ajax 的方式关键在于参数中的数据类型设置“dataType: 'jsonp',”;

这几种方式都可以实现跨域交互的功能,你喜欢哪一种呢?

是否还有其它的方式呢?

===========文档分隔线===========

一个人思维的进步和生活状况的改善根本就是同一件事。

===========文档信息============ 
版权声明:非商用自由转载-保持署名-注明出处 
署名(BY) :testcs_dn(微wx笑) 
文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)

目录
相关文章
|
JSON 前端开发 JavaScript
JavaScript学习 -- jsonp跨域请求
JavaScript学习 -- jsonp跨域请求
58 0
|
3月前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
57 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
4月前
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
171 7
|
6月前
|
JavaScript 前端开发 网络安全
Node.js和php
【8月更文挑战第4天】Node.js和php
71 3
|
6月前
|
Devops 持续交付 测试技术
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
56 0
|
6月前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
9月前
|
JavaScript Java 测试技术
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
99 3
基于微信小程序的家政服务预约系统的+php+vue.js附带文章和源代码设计说明文档ppt
|
7月前
|
前端开发 JavaScript API
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)
70 0
|
9月前
|
JavaScript Java 测试技术
基于微信小程序的社团活动助手php+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的社团活动助手php+vue.js附带文章和源代码设计说明文档ppt
57 1
|
9月前
|
JavaScript Java 测试技术
基于小程序的校园跑腿php+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的校园跑腿php+springboot+vue.js附带文章和源代码设计说明文档ppt
70 0