在前端开发中,我们一种常见的网络请求方式就是JSONP
JSONP的原理是什么呢?
jsonp如何封装呢?
let count = 1 export default function originPJSONP(option) { // 1. 从传入的option中提取url const url = option.url // 2. 在body中添加script标签 const body = document.getElementsByTagName('body')[0] const script = document.createElement('script') // 3. 内部产生一个不重复的callback const callback = 'jsonp' + count++ // 4. 监听window上的jsonp的调用 return new Promise((resolve, reject) => { try { window[callback] = function (result) { body.removeChild(script) resolve(result) } const params = handleParam(option.data) script.src = url + '?callback=' + callback + params; body.appendChild(script) } catch (e) { body.removeChild(script) reject(e) } }) } function handleParam(data) { let url = '' for (let key in data) { let value = data[key] !== undefined ? data[key] : '' url += `&${key}=${encodeURIComponent(value)}` } return url }
为什么选择axios?
支持多种请求方式:
安装axios
npm install axios --save
使用方式:
普通方式
axios({ //url: 'http://httpbin.org', // 测试网站 url: 'localhost://8000/menu/multidata', // 自定义一个springboot的服务器 method: 'get' // 指定提交方式,axios(context)不指定默认为get方式 }).then(result => { console.log(res) })
get / post方式
axios({ url: 'http://localhost:8000/menu/queryMenu', // 专门针对get请求的一个写法 params: { menuCode: '1' } }).then(result=>{ console.log(result); }) axios.post('http://localhost:8000/menu/addMenu',{ menuCode: 2, menuName: '我的', order: 2 }).then(() => { console.log('success'); }).catch(e=>{ console.log('error'); })
在上面的实例中,我们的BaseUrl是固定的
axios.defaults.baseURL = 'http://localhost:8000' axios.defaults.timeout = 50
url、
method、
baseURL、
transformRequest:[function(data{})] 请求前数据处理、
transformResponse:[function(data){}]请求后数据处理
headers:['x-Request-With':'XMLHttpRequest']自定义的请求头、
params、
paramsSerializer:function(params){} 查询对象序列化函数、
data:{key:'aa'} request body、
timeout、
withCredentials 是否携带token、
adapter:function(resolve, reject, config){} 自定义请求处理、
auth: {userName: '', pwd:''} 身份验证的信息
responseType: '' 响应数据格式:json/blob/document/arraybuffer/texst/stream