axios.jsonp 封装
时间: 2023-08-20 17:04:43 浏览: 106
axios本身不提供对JSONP的直接支持,但是您可以通过一些封装来实现使用axios发送JSONP请求。下面是一个简单的axios.jsonp封装的示例:
```javascript
import axios from 'axios';
function jsonp(url, params) {
return new Promise((resolve, reject) => {
const callbackName = `jsonpCallback_${Date.now()}`;
// 创建一个全局函数,用于处理JSONP响应
window[callbackName] = function(data) {
// 在这里处理响应数据
resolve(data);
cleanup();
};
// 清理回调函数
function cleanup() {
delete window[callbackName];
script.parentNode.removeChild(script);
}
// 创建一个<script>标签并添加到页面上
const script = document.createElement('script');
script.src = `${url}?${serializeParams(params)}&callback=${callbackName}`;
script.onerror = function() {
reject(new Error('JSONP request failed'));
cleanup();
};
document.body.appendChild(script);
});
}
// 辅助函数,将参数对象序列化为URL查询字符串
function serializeParams(params) {
return Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&');
}
export default jsonp;
```
使用这个封装的axios.jsonp函数,您可以像这样发送JSONP请求:
```javascript
import jsonp from './jsonp';
jsonp('http://example.com/api', { param1: 'value1', param2: 'value2' })
.then(response => {
// 处理响应数据
console.log(response);
})
.catch(error => {
// 处理错误
console.error(error);
});
```
这个封装中,我们创建了一个全局唯一的回调函数名称,并将其作为参数传递给服务器。然后,我们创建一个全局函数来处理JSONP响应,并在Promise中进行resolve或reject。最后,我们创建一个`<script>`标签并将其添加到页面上,然后等待JSONP响应。
请注意,使用JSONP有一些安全风险,并且可能不适用于所有情况。在使用JSONP时,请确保您信任提供JSONP服务的服务器,并了解潜在的安全风险。
希望这可以帮助您实现使用axios发送JSONP请求!如有任何进一步的问题,请随时提问。
阅读全文