UNPKG

autobots-lib

Version:

汽车人基础库

564 lines (521 loc) 19.4 kB
'use strict'; import { NativeModules, Platform } from 'react-native'; import Utils from "../util/utils"; var QCRRNNetworkModule = NativeModules.QCRRNNetworkModule; var NetworkModule = { async getCacheData(cacheKey: String) { if (QCRRNNetworkModule && QCRRNNetworkModule.getCacheData) { try { return await QCRRNNetworkModule.getCacheData(cacheKey, Platform.OS === 'android' ? null : {}); } catch (error) { console.error('getCacheData发生了异常:' + error); return ''; } } else { return ''; } }, writeCacheData(cacheKey: String, params: Object, isAdd: boolean, expireTime: number) { if (QCRRNNetworkModule && QCRRNNetworkModule.writeCache) { const isAddNumber = Platform.OS === 'android' ? (isAdd ? 1 : 0) : isAdd; if (Platform.OS === 'android' && typeof params === 'object') { QCRRNNetworkModule.writeCache(cacheKey, JSON.stringify(params), isAddNumber, expireTime); } else { QCRRNNetworkModule.writeCache(cacheKey, params, isAddNumber, expireTime); } } }, clearCacheData(cacheKey: String) { if (QCRRNNetworkModule && QCRRNNetworkModule.clearCache) { QCRRNNetworkModule.clearCache(cacheKey); } }, fetchList(url: String, config: Object, params: Object, cacheFunction: Function) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule && (!Utils.isChooseOldNetApi(params) || QCRRNNetworkModule.postList)) { asyncListFetch(url, config, params, cacheFunction, resolve, reject); } else { asyncPostJsonFetch(url, config, params, resolve, reject); } }); }, fetch(url: String, config: Object, params: Object, cacheFunction: Function) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule && !Utils.isChooseOldNetApi(params)) { asyncFetch(url, config, params, cacheFunction, resolve, reject); } else { asyncFromFetch(url, config, params, resolve, reject); } }); }, get(url: String, headers: Object, params: Object) { let requestUrl = url; if (params && Object.keys(params).length > 0) { if (requestUrl.indexOf('?') >= 0) { requestUrl += '&' } else { requestUrl += '?' } for (let key in params) { requestUrl += `${key}=${params[key]}` } } return new Promise(function (resolve, reject) { if (QCRRNNetworkModule) { asyncGet(requestUrl, headers, resolve, reject); } else { asyncGetFromFetch(requestUrl, headers, resolve, reject); } }); }, postForm(url: String, header: Object, form: Object) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule) { asyncPostForm(url, header, form, resolve, reject); } else { asyncPostFormFetch(url, header, form, resolve, reject); } }); }, postJson(url: String, header: Object, json: Object) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule) { asyncPostJson(url, header, json, resolve, reject); } else { asyncPostJsonFetch(url, header, json, resolve, reject); } }); }, postFile(url: String, header: Object, param: Object, files: Array) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule) { asyncPostFile(url, header, param, files, resolve, reject); } else { asyncPostFileFromFetch(url, header, param, files, resolve, reject); } }); }, downFile(url: String, fileName: String) { return new Promise(function (resolve, reject) { if (QCRRNNetworkModule) { asyncDownFile(url, fileName, resolve, reject); } else { asyncDownFileRN(url, fileName, resolve, reject); } }); }, cancel(url: String) { return new Promise(function (resolve, reject) { asyncCancel(url, resolve, reject); }); }, checkNetState(callback: Function) { QCRRNNetworkModule && QCRRNNetworkModule.checkNetState(callback); }, getNetType(callback: Function) { QCRRNNetworkModule && QCRRNNetworkModule.getNetType(callback); }, }; async function asyncFetch(url: String, config: Object, params: Object, cacheFunction: Function, resolveCallback: Function, rejectCallback: Function) { let needReadCache = (config && config.method && config.method.indexOf('cache') >= 0) ? true : false; if (needReadCache && cacheFunction) { try { if (Platform.OS === 'android') { //处理body为form类型要将param全部字段转为字条串类型,与请求网络接口写缓存时类型一致 if (params && config && config.headers) { if (!(config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') >= 0)) { const stringFieldParams = {}; Object.keys(params).forEach(key => { if (typeof params[key] !== 'undefined' && params[key] !== null) { stringFieldParams[key] = String(params[key]); } }); params = stringFieldParams; } } } let response = await QCRRNNetworkModule.getCacheData(url, params); if (typeof response === 'string') { if (response.trim() != '') { response = JSON.parse(response); cacheFunction(response); } } else { cacheFunction(response); } } catch (error) { console.log('缓存结果出错:', error) } } try { var events; if (Platform.OS === 'ios') { events = await QCRRNNetworkModule.fetch(url, config, params); } else {//android try { //处理body为json类型 let isJsonPost = false; if (config && config.headers) { if (config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') >= 0) { //if(params && Object.keys(params).length !== 0){ let jsonparam = {}; jsonparam.json = params ? JSON.stringify(params) : {}; config.body = jsonparam; isJsonPost = true; } } config = config || {} //处理body为form类型 if (!isJsonPost) { config.headers = config.headers || {} config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' // 将参数对象中的所有值转换为字符串类型,因为原生只按string类型来处理,否则有其它类型会报解析异常 const stringifiedParams = {}; if (params) { Object.keys(params).forEach(key => { if (typeof params[key] !== 'undefined' && params[key] !== null) { stringifiedParams[key] = String(params[key]); } // else { // stringifiedParams[key] = ""; // 将undefined值设为"" // } }); } let formparam = {}; formparam.form = JSON.stringify(stringifiedParams); config.body = formparam; } console.log('asyncFetch 配置信息:', config); events = await QCRRNNetworkModule.fetch(url, config); if (typeof events === 'string') { events = JSON.parse(events); } } catch (error) { rejectCallback(error); } } resolveCallback(events); } catch (error) { console.log('结果:', error) rejectCallback(error); } } async function asyncListFetch(url: String, config: Object, params: Object, cacheFunction: Function, resolveCallback: Function, rejectCallback: Function) { let needReadCache = (config && config.method && config.method.indexOf('cache') >= 0) ? true : false; if (needReadCache && cacheFunction) { try { if (Platform.OS === 'android') { //处理body为form类型要将param全部字段转为字条串类型,与请求网络接口写缓存时类型一致 if (params && config && config.headers) { if (!(config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') >= 0)) { const stringFieldParams = {}; Object.keys(params).forEach(key => { if (typeof params[key] !== 'undefined' && params[key] !== null) { stringFieldParams[key] = String(params[key]); } }); params = stringFieldParams; } } } let response = await QCRRNNetworkModule.getCacheData(url, []); if (typeof response === 'string') { if (response.trim() != '') { response = JSON.parse(response); cacheFunction(response); } } else { cacheFunction(response); } } catch (error) { console.log('缓存结果出错:', error) } } try { var events; if (Platform.OS === 'ios') { events = await QCRRNNetworkModule.postList(url, config, params, needReadCache); } else {//android try { //处理body为json类型 let isJsonPost = false; if (config && config.headers) { if (config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') >= 0) { //if(params && Object.keys(params).length !== 0){ let jsonparam = {}; jsonparam.json = params ? JSON.stringify(params) : {}; config.body = jsonparam; isJsonPost = true; } } config = config || {} //处理body为form类型 if (!isJsonPost) { config.headers = config.headers || {} config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' // 将参数对象中的所有值转换为字符串类型,因为原生只按string类型来处理,否则有其它类型会报解析异常 const stringifiedParams = {}; if (params) { Object.keys(params).forEach(key => { if (typeof params[key] !== 'undefined' && params[key] !== null) { stringifiedParams[key] = String(params[key]); } // else { // stringifiedParams[key] = ""; // 将undefined值设为"" // } }); } let formparam = {}; formparam.form = JSON.stringify(stringifiedParams); config.body = formparam; } console.log('asyncFetch 配置信息:', config); events = await QCRRNNetworkModule.fetch(url, config); if (typeof events === 'string') { events = JSON.parse(events); } } catch (error) { rejectCallback(error); } } resolveCallback(events); } catch (error) { console.log('结果:', error) rejectCallback(error); } } async function asyncFromFetch(url: String, config: Object, params: Object, resolveCallback: Function, rejectCallback: Function) { try { let isJsonPost = false; if (config && config.headers) { if (config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') >= 0) { config.body = params ? JSON.stringify(params) : {}; isJsonPost = true; } } config = config || {} if (!isJsonPost) { config.headers = config.headers || {} config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' let requestBody = ''; for (let key in params) { requestBody += `${key}=${params[key] || ''}&` } config.body = requestBody.length > 0 ? requestBody.slice(0, -1) : "" } let requestMethod = (config.method && config.method.length > 0) ? config.method : 'get'; if (config.method && config.method.length > 0 && config.method.indexOf('_cache') >= 0) { requestMethod = config.method.replace('_cache', ''); } config.method = requestMethod; console.log('配置信息:', config); const response = await fetch(url, config); const json = await response.json(); resolveCallback(json); } catch (error) { rejectCallback(error); } } async function asyncGet(url: String, header: Object, resolveCallback: Function, rejectCallback: Function) { try { var events; if (Platform.OS === 'ios') { events = await QCRRNNetworkModule.get(url, header); } else { events = await QCRRNNetworkModule.get(url, header, null); if (typeof events === 'string') { events = JSON.parse(events); } } resolveCallback(events); } catch (error) { rejectCallback(error); } } async function asyncGetFromFetch(url: String, header: Object, resolveCallback: Function, rejectCallback: Function) { try { var events = await fetch(url, { headers: header || {} }) const json = await events.json(); resolveCallback(json); } catch (error) { rejectCallback(error); } } async function asyncPostForm(url: String, headers: Object, form: Object, resolveCallback: Function, rejectCallback: Function) { try { console.log('--fetch--asyncPostForm url:', url); var events; if (Platform.OS === 'ios') { events = await QCRRNNetworkModule.postForm(url, headers, form); } else {//android try { headers = headers || {}; headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; // 将参数对象中的所有值转换为字符串类型,因为原生只按string类型来处理,否则有其它类型会报解析异常 const stringifiedForms = {}; if (form) { Object.keys(form).forEach(key => { if (typeof form[key] !== 'undefined' && form[key] !== null) { stringifiedForms[key] = String(form[key]); } // else { // stringifiedForms[key] = ""; // 将undefined值设为"" // } }); } console.log('--fetch--asyncPostForm 配置信息:', stringifiedForms); events = await QCRRNNetworkModule.postForm(url, headers, stringifiedForms); if (typeof events === 'string') { events = JSON.parse(events); } } catch (error) { rejectCallback(error); } } resolveCallback(events); } catch (error) { rejectCallback(error); } } async function asyncPostJson(url: String, headers: Object, json: Object, resolveCallback: Function, rejectCallback: Function) { try { console.log('--fetch--asyncPostJson url:', url); var events; if (Platform.OS === 'ios') { events = await QCRRNNetworkModule.postJSON(url, headers, json); } else {//android try { headers = headers || {}; headers['Content-Type'] = 'application/json'; headers['Accept'] = 'application/json'; // let jsonparam = {}; let jsonparam = json ? json : {}; console.log('--fetch--asyncPostJson 配置信息:', jsonparam); events = await QCRRNNetworkModule.postJSON(url, headers, jsonparam); if (typeof events === 'string') { events = JSON.parse(events); } } catch (error) { rejectCallback(error); } } resolveCallback(events); } catch (error) { rejectCallback(error); } } async function asyncPostFormFetch(url: String, header: Object, params: Object, resolveCallback: Function, rejectCallback: Function) { try { let headerDic = header || {} headerDic['Content-Type'] = "application/x-www-form-urlencoded; charset=utf-8"; let requestBody = ''; if (params) { for (let key in params) { requestBody += `${key}=${params[key] || ''}&` } requestBody = requestBody.length > 0 ? requestBody.slice(0, -1) : "" } var events = await fetch(url, { method: 'POST', headers: headerDic, body: requestBody }) const json = await events.json(); resolveCallback(json); } catch (error) { rejectCallback(error); } } async function asyncPostJsonFetch(url: String, header: Object, params: Object, resolveCallback: Function, rejectCallback: Function) { try { let headerDic = header || {} headerDic['Content-Type'] = "application/json"; var events = await fetch(url, { method: 'POST', headers: headerDic, body: JSON.stringify(params) }) const json = await events.json(); resolveCallback(json); } catch (error) { rejectCallback(error); } } // let file = {uri: params.path, type: 'application/octet-stream', name: 'image.jpg'}; async function asyncPostFile(url: String, header: Object, param: Object, files: Array, resolveCallback: Function, rejectCallback: Function) { try { var events = await QCRRNNetworkModule.postFile(url, header, param, files); resolveCallback(events); } catch (error) { rejectCallback(error); } } async function asyncPostFileFromFetch(url: String, header: Object, param: Object, files: Array, resolveCallback: Function, rejectCallback: Function) { try { let headerDic = JSON.parse(JSON.stringify(header)); headerDic['Content-Type'] = 'multipart/form-data'; const fd = new FormData() files.forEach((element, index) => { const fileKey = element['fileKey']; fd.append(fileKey, element) }) for (var key in param) { fd.append(key, param[key]); } var events = await fetch(url, { method: 'POST', body: fd, headers: headerDic }) const json = await events.json(); resolveCallback(json); } catch (error) { rejectCallback(error); } } async function asyncDownFile(url: String, fileName: String, resolveCallback: Function, rejectCallback: Function) { try { var events = await QCRRNNetworkModule.downFile(url, fileName); resolveCallback(events); } catch (error) { rejectCallback(error); } } async function asyncDownFileRN(url: String, fileName: String, resolveCallback: Function, rejectCallback: Function) { let timestamp = (new Date()).getTime();//获取当前时间错 let random = String(((Math.random() * 1000000) | 0))//六位随机数 let dirs = Platform.OS === 'ios' ? RNFS.LibraryDirectoryPath : RNFS.ExternalDirectoryPath; //外部文件,共享目录的绝对路径(仅限android) const downloadDest = `${dirs}/${fileName}`; const formUrl = url; const options = { fromUrl: formUrl, toFile: downloadDest, background: true, begin: (res) => { console.log('begin', res); console.log('contentLength:', res.contentLength / 1024 / 1024, 'M'); }, }; try { const ret = RNFS.downloadFile(options); ret.promise.then(res => { console.log('success', res); console.log('file://' + downloadDest) let promise = CameraRoll.saveToCameraRoll(downloadDest); promise.then(function (result) { resolveCallback(result); }).catch(function (error) { console.log('error', error); rejectCallback(new Error(error)) }); }).catch(err => { rejectCallback(new Error(err)) }); } catch (e) { rejectCallback(new Error(e)) } } async function asyncCancel(url: String, resolveCallback: Function, rejectCallback: Function) { if (!QCRRNNetworkModule) { return; } try { var events = await QCRRNNetworkModule.cancel(url); resolveCallback(events); } catch (error) { rejectCallback(error); } } module.exports = NetworkModule;