277 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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<any> {
 | |
|   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>(.*)<\/code>/i, /<message>(.*)<\/message>/i, /<keystr>(.*)<\/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;
 | |
| }
 |