一、什么是跨域
在Web开发过程中,当发起跨域请求时,浏览器会根据同源策略(Same-Origin Policy)拦截请求。同源策略要求发起请求的源(协议,域名,端口号)必须与接收请求的源一致,否则会被浏览器拦截。
比如说,当你的uniapp应用运行在一个http://localhost:8080的地址下,而你在应用中发起了请求去访问 http://www.example.com这个源时,由于两个源不一致,请求就会被拦截。
二、为什么uniapp需要跨域解决方案
与其他框架一样,uniapp也需要发起跨域请求。因为如果不使用跨域,则uniapp无法获得跨域目标服务器上的数据。比如你需要通过uniapp向服务器请求一个json数据,但是这个json数据却不在同一个域下。
既然同源策略限制了我们的请求,我们就需要寻找其他的方式来解决这个问题。
三、uniapp跨域解决方案
1. 使用代理
代理是一种常见的跨域解决方案,它的原理是将请求发送给同源服务器,然后由同源服务器转发到目标服务器,目标服务器返回数据后再由同源服务器将数据返回给客户端。
在uniapp中使用代理需要注意以下几点:
1、需要在vue.config.js文件中配置代理
module.exports = { devServer: { proxy: { '/api': { target: 'http://www.example.com', changeOrigin: true, pathRewrite: { '^/api': '' } } } } }
2、在接口调用中使用绝对路径
uni.request({ url: '/api/getData', method: 'POST', data: { name: 'John' }, success: res => { console.log(res.data) } })
3、因为使用了代理,所以需要保证同源服务器可以正常访问目标服务器,否则同样无法获得预期结果。
2. 使用jsonp
jsonp也是一种跨域请求的方式,它的原理是在客户端使用script标签动态创建一个 JavaScript 文件,并通过 URL 传参方式来传递数据,该 JavaScript 文件载入成功后会执行回调函数,并且会把数据作为参数传入。
在uniapp中使用jsonp需要注意以下几点:
1、需要在服务端支持jsonp协议,即接口返回格式为callback(data)的格式
2、在请求接口时需要带上callback参数,参数值为回调函数名称
uni.request({ url: 'http://www.example.com/api/getData', data:{ name: 'John' }, dataType:'jsonp', jsonpCallback:'callback', success: res => { console.log(res.data) } })
3、jsonp的优点是可以兼容旧浏览器,但是它也有一些缺点,比如只能使用GET请求,且不支持异常处理。
3. 使用CORS
在服务端设置CORS(Cross-Origin Resource Sharing)是解决跨域问题的另一种方案。CORS是W3C规范中定义的一种支持跨域访问的方式,它通过在服务端响应头中加入Access-Control-Allow-*系列的头部信息,来告诉浏览器允许跨域请求。
开启CORS需要服务端支持,然后我们可以在uniapp中简单地发起跨域请求:
uni.request({ url: 'http://www.example.com/api/getData', method: 'POST', data: { name: 'John' }, header: { 'content-type': 'application/json' }, success: res => { console.log(res.data) } })
四、总结
以上就是uniapp中常见的跨域解决方案。每种方式都有它自己的特点和适用场景,选择合适的方式可以使我们顺利地解决跨域问题,获得预期结果。