244 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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
 | |
|             case 2300028: return 2300028
 | |
|             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>(.*)<\/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;
 | |
| }
 |