new XMLHttpRequest()
)setRequestHeader
)open()
)onreadyStateChange
)send()
)利用script標籤能夠跨域請求資源解決跨域問題。詳細解釋能夠看完全弄懂跨域問題javascript
/* * 原生js實現Ajax * */ function Ajax(params) { params = params || {}; params.data = params.data || {}; var _json = params.jsonp ? jsonp(params): json(params); // 判斷是json仍是jsonp function json(params) { // 普通請求 params.type = (params.type || 'GET').toUpperCase(); // 設置請求默認類型 var urlData = formatParams(params.data); // 對數據進行格式化 var xhr = null; // 對xhr進行初始化 if (window.XMLHttpRequest) { xhr = new window.XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } var headers = params.headers || {}; if (params.type === 'GET') { xhr.open(params.type, params.url + '?' + urlData, true); setHeaders(xhr, headers); xhr.send(null); } else { xhr.open(params.type, params.url, true); setHeaders(xhr, headers); xhr.send(JSON.stringify(params.data)); } xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var status = xhr.status; if (status >= 200 && status < 300) { var response = ''; var type = xhr.getResponseHeader('Content-Type'); if (type.indexOf('xml') !== -1 && xhr.responseXML) { // xml格式 response = xhr.responseXML; } else if (type.indexOf('application/json') !== -1) { // JSON格式 response = JSON.parse(xhr.responseText); } else { response = xhr.responseText; // 字符串格式 } params.success && params.success(response); } else { params.error && params.error(status); } } } } function jsonp(params) { var callbackName = params.jsonp; // 回調函數名 var head = document.getElementsByTagName('head')[0]; params.data['callback'] = callbackName; var data = formatParams(params.data); var script = document.createElement('script'); head.appendChild(script); // 建立jsonp函數,成功後自動讓success函數調用,在自動刪除 window[callbackName] = function (json) { // 設置回調,獲取後臺數據後才執行 head.removeChild(script); clearTimeout(script.timer); window[callbackName] = null; params.success && params.success(json); }; script.src = params.url + '?' + data; // 設置src的時候纔開始向後臺請求數據 if (params.time) { // 限定時間 script.timer = setTimeout(function () { window[callbackName] = null; head.removeChild(script); params.error && params.error({ message: '超時' }) }, params.time) } } function formatParams(data) { // 使用 encodeURIComponent 對 URI的某部分編碼 var arr = []; for (var key in data) { arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key])); } // 添加隨機數,防止緩存 arr.push('v=' + random()); return arr.join('&'); } function random() { return Math.floor(Math.random() * 10000 + 500); } function setHeaders(xhr, headers) { for (var key in headers) { xhr.setRequestHeader(key, headers[key]); } } }
不用jsonp請求前端
Ajax({ url: '後端接口', type: 'POST', headers: { 'Content-Type': 'application/json', token: 'xxx' }, success(res) { console.log(res); }, error(status) { console.log(`some error status = ${status}`); } })
jsonp請求java
Ajax({ url: 'http://localhost:8080', headers: { 'Content-Type': 'application/json' }, jsonp: 'getUser', time: 2000, success(res) { console.log(res); }, error(status) { console.log(`some error status = ${status.msg}`); } })
var querystring = require('querystring'); var http = require('http'); var server = http.createServer(); server.on('request', function(req, res) { var params = querystring.parse(req.url.split('?')[1]); var fn = params.callback; // jsonp返回設置 res.writeHead(200, { 'Content-Type': 'text/javascript' }); var data = { user: 'xbc', password: '123456' } res.write(fn + '(' + JSON.stringify(data) + ')'); res.end(); }); server.listen('8080'); console.log('Server is running at port 8080...');