import http from '@ohos.net.http'; import convertxml from '@ohos.convertxml'; import prompt from '@ohos.prompt' import { GlobalConfig } from '../../config/index' const config = { host: GlobalConfig.host, } /** * @author: Renjun Su * @date: 2023/2/20 * @desc 接口请求封装 * @param {method} * @param {xml} xml请求的数据 xml是字符串 * @param {data} post请求的数据 * @param {params} get请求的数据 * */ // let httpRequest = http.createHttp(); export default async function request(req: any): Promise { return new Promise((reslove, reject) => { let httpRequest = http.createHttp(); const {url,params = {},data = {},xml,method = 'get',host,isNewCenter = false} = req; try { const options = { method: http.RequestMethod[method.toUpperCase()], header: { 'Content-Type': xml ? 'text/xml' : 'application/json' }, extraData: xml ? data : JSON.stringify(data), connectTimeout:15 * 1000 } let paramsStr = Reflect.ownKeys(params).reduce((p: string, n: string) => (`${p}${n}=${params[n]}&`), '?') || ''; paramsStr = paramsStr.toString(); paramsStr = paramsStr.substring(0, paramsStr.length - 1) let baseUrl = host ? host : globalThis.host // let baseUrl=host?config.csptHost:config.host' console.log('响应头地址1' + baseUrl, url, options.extraData.length) // const {result,responseCode} = await httpRequest.request(`${baseUrl}${url}${paramsStr}`, { ...options }) .then(async(data) => { const result = data.result 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); httpRequest.destroy(); // @ts-ignore reslove(dd) return } if (!xml) { if (res.head.resultCode === '0') { // return res httpRequest.destroy(); reslove(res) return } else { const resultMessage = res?.body?.resultMessage || res?.head?.resultMessage prompt.showToast({ message: decodeURIComponent(resultMessage), duration: 3000 }); httpRequest.destroy(); reject(false) } } for (let i in res) { resObj = res[i].head } console.info('jiangsong:res in request' + url + JSON.stringify(resObj)) if (resObj.resultCode === '0') { httpRequest.destroy(); reslove(res) return } else { prompt.showToast({ message: decodeURIComponent(resObj.resultMessage), duration: 3000 }); httpRequest.destroy(); reject(res) } }).catch(Error=>{ console.info('test-error0' + url + ' error:resp: ' + JSON.stringify(Error.message)) prompt.showToast({ message: Error?.message, duration: 5000 }); reject(Error) }) // fileUtil.editFile(`${folderPath}/request.txt`, JSON.stringify(arrList)) // writeLog({ // time:dateFormat(new Date()), // url, // result:JSON.stringify(result), // extraData: JSON.stringify(data), // state:'end' // }) } catch (e) { console.info('test-error' + url + ' error:resp: ' + JSON.stringify(e)) if (!e || !(e?.message)) { httpRequest.destroy(); reject({ code: -1 }) // httpRequest.destroy(); // return {code:-1} } prompt.showToast({ message: e?.message, duration: 5000 }); reject({ code: e.code }) // return {code:e.code} // return {code:e.code} // httpRequest.destroy(); } }) } //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; }