From 3d45c281c94fab5255be5fb3671291cd19cd2302 Mon Sep 17 00:00:00 2001 From: lixiao <932184220@qq.com> Date: Tue, 11 Feb 2025 14:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/utils/Request.ets | 351 +++++++++++---------------- 1 file changed, 140 insertions(+), 211 deletions(-) diff --git a/entry/src/main/ets/utils/Request.ets b/entry/src/main/ets/utils/Request.ets index b5a8fed3..dc123c01 100644 --- a/entry/src/main/ets/utils/Request.ets +++ b/entry/src/main/ets/utils/Request.ets @@ -1,130 +1,23 @@ -import http from '@ohos.net.http'; +import http from "@ohos.net.http" import convertxml from '@ohos.convertxml'; -import prompt from '@ohos.prompt'; -import Prompt from '@system.prompt'; - - -/** - * @author: Renjun Su - * @date: 2023/2/20 - * @desc 接口请求封装 - * @param {method} - * @param {xml} xml请求的数据 xml是字符串 - * @param {data} post请求的数据 - * @param {params} get请求的数据 - * - */ - -export default async function tempRequest(req: any): Promise { - return new Promise((resolve, 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; - const dd = handleCenterCode(msgXml, isNewCenter); - httpRequest.destroy(); - // @ts-ignore - resolve(dd) - return - } - - if (!xml) { - if (res.head.resultCode === '0') { - httpRequest.destroy(); - resolve(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(); - resolve(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) - }) - - } catch (e) { - console.info('test-error' + url + ' error:resp: ' + JSON.stringify(e)) - if (!e || !(e?.message)) { - httpRequest.destroy(); - reject({ - code: -1 - }) - } - Prompt.showToast({ - message: e?.message, - duration: 5000 - }); - reject({ - code: e.code - }) - - } - }) - +import { BusinessError } from "@ohos.base" +import promptAction from "@ohos.promptAction"; +interface RequestOption { + url: string + params: object + data: object | string + xml: boolean + method: http.RequestMethod + host?: string + isNewCenter?: boolean } +const base: string = "" -//xml格式转JSON -function xmlToJson(result, url) { - console.log("xmlToJson begin", url); - let xmlOptions = { +function xmlToJSON(target: string): object { + let conv = new convertxml.ConvertXML() + const result: object = conv.convertToJSObject(target, { trim: false, declarationKey: "_declaration", instructionKey: "_instruction", @@ -137,115 +30,151 @@ function xmlToJson(result, url) { 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 + }) + return transfer(result['_elements']) } -//处理中心服务code -function handleCenterCode(msgXml, isNewCenter) { - //新监管 +function transfer(target: Array, name?: string): object { + const result: object = new Object() + + target.forEach((el: object) => { + const _elements: Array = el['_elements'] + if (el['_type'] === "element") { + if (_elements === undefined) { + return + } + const jsonObj: object = result[el['_name']] + const handleCommonArray = (obj: object) => { + if (Array.isArray(jsonObj)) { + result[el['_name']].push(obj) + } else { + result[el['_name']] = [result[el['_name']], obj] + } + } + + if (_elements && _elements.length === 1 && _elements[0]['_type'] === 'text') { + if (jsonObj) { + handleCommonArray(_elements[0]['_text']) + } else { + jsonObj[el['_name']] = _elements[0]["_text"] + } + } else { + if (jsonObj) { + handleCommonArray(transfer(el['_elements'], el['_name'])) + } else { + jsonObj[el['_name']] = transfer(el['_elements'], el['_name']) + } + } + } else if (el['_attributes']) { + result[name] = { + value: el['_text'], + attributes: el['__attributes'] + } + } + }) + return result +} + +interface CenterCodeResult { + code: string + message?: string + keystr?: string +} + +function dealCenterCode(message: string, isNewCenter: boolean): CenterCodeResult { if (isNewCenter) { - const msg = JSON.parse(msgXml); - const result = msg?.data[0]?.result; + const msg: object = JSON.parse(message); + const result: object = msg?.['data'][0]?.result; if (result) { - const { code, message, retval } = result - if (code != '1') { + if (result['code'] != '1') { const rMessage = decodeURIComponent(message as string) - Prompt.showToast({ + promptAction.showToast({ message: rMessage, duration: 3000 }); - return { code, message } + let returnResult: CenterCodeResult = { + code: result['code'] as string, + message: result['message'] as string, + } + return returnResult } else { - return { code, keystr: retval } + let returnResult: CenterCodeResult = { + code: result['code'] as string, + keystr: result['retval'] as string, + } + return returnResult } } } - - //正则匹配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 = {} +export default function Request(options: RequestOption): Promise { + return new Promise((resolve, reject) => { + const instance = http.createHttp() + const baseURL = options.host || base - elements.map(ele => { - const _elements = ele._elements - if (ele._type === 'element') { - if (_elements == undefined) { + instance.request(baseURL + options.url, { + method: options.method, + header: { + "Content-Type": options.xml ? "text/xml" : 'application/json' + }, + extraData: options.xml ? options.data : JSON.stringify(options.data) + }).then(async data => { + let result = options.xml ? xmlToJSON(data.result as string) : data.result + let resObj: object + if (typeof result === 'string') { + result = JSON.parse(result) + } + if (result['Envelope']) { + const msgXml: string = result['Envelope']['Body']['writeObjectOutResponse']['return']; + resolve(dealCenterCode(msgXml, options.isNewCenter) as T) return } - const thisJson = json[ele._name] - if (_elements && _elements.length === 1 && _elements[0]._type === 'text') { - // 如果值存在了 - if (thisJson) { - handleCommonArr(_elements[0]._text) + if (!options.xml) { + if (result['head']['resultCode'] === '0') { + resolve(result as T) + return } else { - json[ele._name] = _elements[0]._text + const resultMessage: string = result?.['body']?.['resultMessage'] || result?.['head']?.['resultMessage'] + promptAction.showToast({ + message: decodeURIComponent(resultMessage), + duration: 3000 + }); + reject(false) + return } + } + + Object.values(result).forEach((item: object) => { + resObj = item['head'] + }) + if (resObj['resultCode'] === '0') { + resolve(result as T) + return } else { - if (thisJson) { - handleCommonArr(deeml(ele._elements, ele._name)) - } else { - json[ele._name] = deeml(ele._elements, ele._name) - } + promptAction.showToast({ + message: decodeURIComponent(resObj['resultMessage']), + duration: 3000 + }); + reject(result) } - //通用处理重复标签 - 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 - } + }).catch((err: BusinessError) => { + if (!err || !(err?.message)) { + reject({ + code: -1 + }) } - - 0 - } else { - //标签上有属性 - if (ele._attributes) { - json[_name] = { - value: ele._text, - attributes: ele.__attributes - } - } - } - - }); - return json -}; - + promptAction.showToast({ + message: err?.message, + duration: 5000 + }); + reject({ + code: err.code + }) + }) + .finally(() => { + instance.destroy() + }) + }) +} \ No newline at end of file