浏览器出于安全方面的考虑,只容许与同源下的接口交互。javascript
所谓"同源"指的是"三个相同"。php
- 协议相同:如都是
http
或者https
- 域名相同:www.example.com/dir 和 www.example.com/dir2/
- 端口相同:如都是80端口
目前,若是非同源,共有三种行为受到限制。html
- Cookie、LocalStorage 和 IndexDB 没法读取。
- DOM 没法得到。
- AJAX 请求不能发送。
好比: 用户打开了 页面:baidu.com/yyy, 当前页面下的 js 向 baidu.com/xxx的接口发 ajax 请求,浏览器是容许的。但假如向:google.com/xxx发ajax请求则会被浏览器阻止掉,由于存在跨域调用。前端
src
" 这个属性的标签都拥有跨域的能力,好比<script>
、<img>
、<iframe>
);callback
参数给服务端,而后服务端返回数据时会将这个 callback
参数做为函数名来包裹住JSON数据,这样客户端就能够随意定制本身的函数来自动处理返回数据了。JSONP是服务器与客户端跨源通讯的经常使用方法。java
它的基本思想是: 网页经过添加一个 <script>
元素,向服务器请求JSON数据,而且该请求的查询字符串有一个callback
参数,用来指定回调函数的名字,这种作法不受同源政策限制; 服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。jquery
举个栗子:程序员
请求方:frank.com 的前端程序员(浏览器)web
响应方:jack.com 的后端程序员(服务器)ajax
<script>
,src
指向响应方,同时传一个查询参数 ?callbackName=yyy
<script src="http://api.jirengu.com/weather.php?callbackName=showData"></script> 复制代码
响应方根据查询参数 callbackName
,构造形如json
ⅰ. yyy.call(undefined, '你要的数据')
ⅱ. yyy('你要的数据')
这样的响应
以前后端返回数据: {"city": "hangzhou", "weather": "晴天"} 如今后端返回数据: showData({"city": "hangzhou", "weather": "晴天"}) 复制代码
yyy.call(undefined, '你要的数据')
那么请求方就知道了他要的数据这就是 JSONP。
用jQuery实现JSONP调用:
$.ajax({ url: "http://jack.com:8002/pay", dataType: "jsonp", success: function( response ) { if(response === 'success'){ amount.innerText = amount.innerText - 1 } } }) 复制代码
答:
script
标签实现的<script>
只能发送 get
请求