import http from '@ohos.net.http'; import convertxml from '@ohos.convertxml'; import prompt from '@ohos.prompt' import { sendGreen } from '../../pages/judgeSDK/utils/judgeCommon'; import {GlobalConfig} from '../../config/index' import FileUtil from '../../common/utils/File'; import { dateFormat } from '../utils/tools' const config = { host:GlobalConfig.host, } let httpRequest = http.createHttp(); /** * @author: Renjun Su * @date: 2023/2/20 * @desc 接口请求封装 * @param {method} * @param {xml} xml请求的数据 xml是字符串 * @param {data} post请求的数据 * @param {params} get请求的数据 * */ export default async function request(req: any) { const {url,params = {},data = {},xml,method = 'get',host,isNewCenter = false} = req; const options = { method: http.RequestMethod[method.toUpperCase()], header: { 'Content-Type': xml ? 'text/xml' : 'application/json' }, extraData: xml ? data : JSON.stringify(data), connectTimeout:120000, } //params转url拼接参数 let paramsStr = Reflect.ownKeys(params).reduce((p: string, n: string) => (`${p}${n}=${params[n]}&`), '?') || ''; paramsStr = paramsStr.toString(); paramsStr = paramsStr.substring(0, paramsStr.length-1) try { let baseUrl=host?host:globalThis.host // let baseUrl=host?config.csptHost:config.host' console.log('optionsoptions',JSON.stringify(data).length) console.log('响应头地址' + baseUrl,url) const {result,responseCode} = await httpRequest.request(`${baseUrl}${url}${paramsStr}`, options); // fileUtil.editFile(`${folderPath}/request.txt`, JSON.stringify(arrList)) // writeLog({ // time:dateFormat(new Date()), // url, // result:JSON.stringify(result), // extraData: JSON.stringify(data), // state:'end' // }) console.log('响应头地址' + JSON.stringify(result)) let res:any = xml ? xmlToJson(result,url) : result; console.log('响应头地址' + JSON.stringify(res)) let resObj = null; if(typeof res === "string"){ res=JSON.parse(res) } //处理中心服务code if(res.Envelope){ const msgXml = res.Envelope.Body.writeObjectOutResponse.return; //Envelope.Body.writeObjectOutResponse.return const dd = handleCenterCode(msgXml,isNewCenter); return dd } if(!xml){ if(res.head.resultCode === '0'){ return res }else{ const resultMessage = res?.body?.resultMessage || res?.head?.resultMessage prompt.showToast({ message: decodeURIComponent(resultMessage), duration: 3000 }); return false } } for( let i in res ) { resObj = res[i].head } console.info('jiangsong:res in request' + url + JSON.stringify(resObj)) if(resObj.resultCode === '0') { return res }else { prompt.showToast({ message: decodeURIComponent(resObj.resultMessage), duration: 3000 }); return res } } catch (e) { console.info('surenjunerror',JSON.stringify(e)) if(!e||!(e?.message)){ return false } const code = e?.code; prompt.showToast({ message: e?.message, duration: 5000 }); switch (code){ //断网 case 2300007: return 2300007 default: } return false console.info('test-error' + url + ' error:resp: '+ JSON.stringify(e)) httpRequest.destroy(); } } async function writeLog(param){ const fileUtil = new FileUtil(globalThis.context) const folderPath = await fileUtil.initFolder(`/errorMsg/`); fileUtil.editFile(`${folderPath}/request.txt`, JSON.stringify(param)+`\n`) } //xml格式转JSON function xmlToJson(result,url) { console.log("xmlToJson begin",url); let xmlOptions = {trim : false, declarationKey:"_declaration", instructionKey : "_instruction", attributesKey : "_attributes", textKey : "_text", cdataKey:"_cdata", doctypeKey : "_doctype", commentKey : "_comment", parentKey : "_parent", typeKey : "_type", nameKey : "_name", elementsKey : "_elements", "skipPreprocess" : true} let strXml = result.toString(); let conv = new convertxml.ConvertXML(); console.log("xmlToJson result.length = " + result.length); console.log("xmlToJson result content = " + result); // @ts-ignore let {_elements:xmlArr} = conv.convertToJSObject(strXml, xmlOptions); console.log("xmlToJson deeml begin"); let res = deeml(xmlArr); console.log("xmlToJson end",url); return res } //处理中心服务code function handleCenterCode(msgXml,isNewCenter){ //新监管 if(isNewCenter){ const msg = JSON.parse(msgXml); const result = msg?.data[0]?.result; if(result){ const {code,message,retval} = result if(code != '1'){ const rMessage = decodeURIComponent(message as string) // globalThis.title=rMessage // globalThis.type='1' // globalThis.errorDialog.open() prompt.showToast({ message:rMessage, duration: 3000 }); return {code,message} }else{ return { code ,keystr:retval} } } } //正则匹配code message字段 const [code,message,keystr] = [/(.*)<\/code>/i,/(.*)<\/message>/i,/(.*)<\/keystr>/i].map(pattern=>{ const patternArr = pattern.exec(msgXml); return patternArr && patternArr[1] }); if(code != '1'){ prompt.showToast({ message: decodeURIComponent(message as string), duration: 3000 }); // globalThis.type='1' // globalThis.title=decodeURIComponent(message as string) // globalThis.errorDialog.open() return {code,message:decodeURIComponent(message)} }else{ return { code ,keystr, message } } } //JSON转xml格式 const deeml = (elements,_name?)=>{ const json = {} elements.map(ele =>{ const _elements = ele._elements if(ele._type === 'element'){ if(_elements==undefined){ return } const thisJson = json[ele._name] if(_elements && _elements.length === 1 && _elements[0]._type === 'text'){ // 如果值存在了 if(thisJson){ handleCommonArr(_elements[0]._text) }else{ json[ele._name] = _elements[0]._text } }else{ if(thisJson){ handleCommonArr( deeml(ele._elements,ele._name) ) }else{ json[ele._name] = deeml(ele._elements,ele._name) } } //通用处理重复标签 function handleCommonArr(obj){ if(thisJson){ if(Array.isArray(thisJson)){ json[ele._name].push(obj) }else{ json[ele._name] = [json[ele._name],obj] } }else{ json[ele._name] = obj } }0 }else{ //标签上有属性 if(ele._attributes){ json[_name] = { value: ele._text, attributes:ele.__attributes } } } }); return json }; function isEmpty(param) { return!Object.keys(param).length; }