JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON的一种新方法,在后来的Web服务中很是流行。JSONP看起来与JSON差很少,只不过是被包含在函数调用中的JSON,就像下面这样。json
callback({ “name”: “Nicholas” });
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字通常是在请求中指定的。而数据就是传入回调函数中的JSON数据。下面是一个典型的JSONP请求。跨域
http://freegeoip.net/json/?callback=handleResponse
这个URL是在请求一个JSONP地理定位服务。经过查询字符串来指定JSONP服务的回调参数是很常见的,就像上面的URL所示,这里指定的回调函数的名字叫handleResponse() 。浏览器
JSONP是经过动态 <script> 元素来使用的,使用时能够为 src 属性指定一个跨域URL。这里的 <script> 元素与 <img> 元素相似,都有能力不受限制地从其余域加载资源。由于JSONP是有效的JavaScript代码,因此在请求完成后,即在JSONP响应加载到页面中之后,就会当即执行。来看一个例子。安全
function handleResponse(response){ alert(“You’re at IP address ” + response.ip + ”, which is in ” + response.city + ”, ” + response.region_name); } var script = document.createElement(“script”); script.src = “http://freegeoip.net/json/?callback=handleResponse”; document.body.insertBefore(script, document.body.firstChild);
这个例子经过查询地理定位服务来显示你的IP地址和位置信息。服务器
JSONP之因此在开发人员中极为流行,主要缘由是它很是简单易用。与图像Ping相比,它的优势在于可以直接访问响应文本,支持在浏览器与服务器之间双向通讯。不过,JSONP也有不足。运维
首先,JSONP是从其余域中加载代码执行。若是其余域不安全,极可能会在响应中夹带一些恶意代码,而此时除了彻底放弃JSONP调用以外,没有办法追究。所以在使用不是你本身运维的Web服务时,必定得保证它安全可靠。函数