这段代码可以应用于chrome的扩展应用,在对网站插入的content-script里插入这段javascript截取网络请求信息。
function getRequestParams (url) {
let temp = url.split('?');
if (temp.length > 1) {
let param = temp[1];
let keyValue = param.split('&');
let obj = {};
for (let i = 0; i < keyValue.length; i++){
let item = keyValue[i].split('=');
let key = item[0];
let value = item[1];
obj[key] = value;
}
return obj
} else {
return null
}
}
function requestType (value) {
if ((value instanceof File) || (value instanceof Blob) || (value instanceof ArrayBuffer)) {
return 'binary'
} else if ((value instanceof FormData)) {
return 'form-data'
} else {
return 'x-www-form-urlencoded'
}
}
(function captureXMLHttpRequest(recorder) {
let XHR = XMLHttpRequest.prototype;
let open = XHR.open;
let send = XHR.send;
let setRequestHeader = XHR.setRequestHeader;
XHR.open = function (method, url) {
this._method = method;
this._url = url;
this._requestHeaders = {};
this._startTime = new Date().getTime();
return open.apply(this, arguments);
};
XHR.setRequestHeader = function (header, value) {
this._requestHeaders[header] = value;
return setRequestHeader.apply(this, arguments);
};
XHR.send = function (postData) {
this.addEventListener('load', function () {
let endTime = new Date().getTime();
let time = endTime - this._startTime
if (recorder) {
let myUrl = this._url ? this._url.toLowerCase() : this._url;
if (myUrl) {
let requestModel = {
'url': this._url,
'method': this._method,
'timestamp': this._startTime,
'headers': this._requestHeaders
};
let params = getRequestParams(myUrl)
if (params) {
requestModel['params'] = params
}
if (postData) {
if (typeof postData === 'string') {
let _dataType
// 判断是否json字符串
try {
const obj = JSON.parse(postData);
if(typeof obj == 'object' && obj ){
_dataType = 'JSON';
}else{
_dataType = 'text';
}
} catch(e) {
_dataType = 'text';
}
requestModel['body'] = postData;
requestModel['dataType'] = _dataType
} else if (typeof postData === 'object' || typeof postData === 'array' || typeof postData === 'number' || typeof postData === 'boolean') {
requestModel['body'] = postData;
requestModel['dataType'] = requestType(postData)
}
} else {
requestModel['dataType'] = 'none'
}
let responseHeaders = this.getAllResponseHeaders();
let responseModel = {
'status': this.status,
'timestamp': endTime,
'time': time,
'headers': responseHeaders
};
if (this.responseText) {
responseModel['body'] = this.responseText;
}
let network = {
'request': requestModel,
'response': responseModel
};
recorder(network);
}
}
});
return send.apply(this, arguments);
};
})(recorder);
function recorder(network){
console.log(network)
}