import http from '@ohos.net.http'; import convertxml from '@ohos.convertxml'; import prompt from '@ohos.prompt'; import { tcpUtil } from './TcpRequest'; import Prompt from '@system.prompt'; import tempRequest from './tempRequest'; import connection from '@ohos.net.connection'; export function tcpRequest(req: any): Promise { return new Promise((resolve, reject) => { let {url,params = {},data = {},xml,method = 'get',host,isNewCenter = false, timeout} = req; try { const options = { method: http.RequestMethod[method.toUpperCase()], header: { 'Content-Type': xml ? 'text/xml' : 'application/json' }, extraData: xml ? data : JSON.stringify(data), } 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 console.log('响应头地址1' + baseUrl, url, options.extraData.length) // globalThis.TcpClient.request(`${baseUrl}${url}${paramsStr}`, { tcpUtil.request(`${baseUrl}${url}${paramsStr}`, { method: options.method, data: xml ? data : JSON.stringify(data), type: xml ? 1 : 0, contentType: xml ? 'text/xml' : 'application/json', timeout: timeout || 15 * 1000 }, (data) => { const result = JSON.parse(JSON.stringify(data)) 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; const dd = handleCenterCode(msgXml, isNewCenter); // @ts-ignore resolve(dd) return } if (!xml) { if (res.head.resultCode === '0') { resolve(res) return } else { const resultMessage = res?.body?.resultMessage || res?.head?.resultMessage Prompt.showToast({ message: decodeURIComponent(resultMessage), duration: 3000 }); 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') { resolve(res) return } else { Prompt.showToast({ message: decodeURIComponent(resObj.resultMessage), duration: 3000 }); reject(res) } }, (error) => { console.info('test-error0' + url + ' error:resp: ' + JSON.stringify(error.message)) Prompt.showToast({ message: error?.message, duration: 5000 }); reject(error) }) } catch (e) { console.info('test-error' + url + ' error:resp: ' + JSON.stringify(e)) } }) } function getNetWorkStatus() { connection.getDefaultNet().then(handle => { console.log("[http request] network handle", JSON.stringify(handle)) connection.getNetCapabilities(handle).then(res => { console.log("[http request] network result", JSON.stringify(res)) }) }).catch(err => { console.log("[http request] network error", JSON.stringify(err)) }) } export default async function request(req: any): Promise { return new Promise((resolve, reject) => { tempRequest(req).then((response) => { console.log("[http request] only http request success") resolve(response as T) }).catch(err => { console.log("[http request] only http request error") reject(err) }).finally(() => { getNetWorkStatus() }) }) } //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) 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 }); 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 };