当前位置: 首页 > ops >正文

XMLHttpRequest读取xml乱码及请求封装

实现原生请求XMLHttpRequest对接本地控件接口返回xml出现乱码问题,找了很多方式解决,根据不同情况有不同的解决方式,稍微解释一下其他解决方式
在这里插入图片描述

  • 通常情况下修改请求头Content-type及修改编码格式可以解决。下面这种方式需要没有请求参数或者参数也是xml且返回类型为xml类型。
xmlHttp.setRequestHeader("Content-type", "application/xml;charset=utf-8");

常见的Content-type

Content-Type: text/plain; // 空白形式
Content-Type: text/html; // html形式
Content-Type: application/json; // json形式
Content-Type: application/x-www-form-urlencoded; // 表单形式
Content-Type: application/xml; // xml形式

  • 当返回内容responseText为乱码时,可以尝试获取responseXML。

以上两种方式需要后端配合解决,具体需要解决到哪一步,主要还是看后端怎么配置。下面的情况是没有后端配合且返回xml文件编码格式为gbk。

overrideMimeType解决

overrideMimeType用于指定需要的类型代替服务器返回的类型。由于我这里数据返回为xml,所以通过overrideMimeType指定application/xml类型。

// 在send前配置  指定的类型可以根据实际修改为需要的类型
xmlHttp.overrideMimeType("application/xml;charset=utf-8");

修改后若responseTex仍为乱码,可以尝试获取responseXML,通过节点方式获取值;或者打印整个请求对象找到复核条件的属性。我这里获取的是responseXML。

在这里插入图片描述

XMLHttpRequest封装

/*** httpRequest 封装请求* @param {Object} options 请求参数*    { string } url 请求地址*    { string } type 请求类型*    { string | object } params 请求参数*    { Object } headers 请求头*    { Function } setHttp 重写请求*    { string } isString 返回类型*    { string } ret 返回字段  text返回responseText, xml返回responseXML* @returns Promise*/
function httpRequest(options) {const { headers = {}, params = {}, type = 'GET', ret = 'text' } = options;let { url = '', sendParams = '' } = options;const paramString = isString(params) ? params : changeParamsToString(params);if (type.toLowerCase() === 'get' && paramString.length > 0) {url = joinStringInUrl(url, paramString);}if (type.toLowerCase() === 'post') {sendParams = paramString || null;}return new Promise((resolve, reject) => {const xmlHttp = new XMLHttpRequest();xmlHttp.open(type, url, true);for (const item in headers) {xmlHttp.setRequestHeader(item, headers[item]);}// 外部修改xml请求options.setHttp ? options.setHttp(xmlHttp) : '';// 发送请求xmlHttp.send(sendParams);xmlHttp.onreadystatechange = function() {if (xmlHttp.readyState === 4) {if (xmlHttp.status === 200) {if (options.isString) {resolve(ret === 'text' ? xmlHttp.responseText : xmlHttp.responseXML);} else {resolve(JSON.parse(xmlHttp.responseText));}} else {reject('出错');}}};});
}function isString(obj: any) {return Object.prototype.toString.call(obj) === "[object String]";
}function changeParamsToString(params) {const paramArr = [];for (const item in params) {paramArr.push(item + '=' + params[item]);}return paramArr.length > 0 ? paramArr.join('&') || '' : '';
}function joinStringInUrl(url, paramString) {return url.indexOf('?') === -1 ? (url + '?' + paramString) : (url + paramString);
}// 调用方式
httpRequest({url: url,type: 'post',params: {aa: 1,},headers: {"Content-type": "application/json;charset=utf-8",},isString: true,setHttp(xmlHttp) {xmlHttp.overrideMimeType("application/xml;charset=utf-8");},}).then(res => {console.log(res, 1111);});
http://www.xdnf.cn/news/11464.html

相关文章:

  • onmouseover、onmouseenter、onmouseleave、onmouseout的区别
  • 2022年起重机械安全管理复训题库模拟考试平台操作
  • 稳定状态模型 (三):Volterra 模型
  • JSP基于JSP的医疗挂号管理系统rrklt(程序+源码+数据库+调试部署+开发环境)
  • 洛克王国五大灵石及魔法石地点分布总结
  • Element UI修改CSS样式的问题
  • ​机器视觉08——常见光源特点及应用之条形光源详解
  • 黑客爱用的 HOOK 技术大揭秘!
  • Android源码大放送(实战开发必备)(1)
  • 美国服务器:为您的企业业务提供独特优势
  • python教材推荐 知乎,python教程书籍推荐
  • java基础学习(一)
  • curl_exec php什么用,关于php curl_exec的详细介绍
  • 如何用SystemView分析AliOS Things
  • JVM | 内存调优实战 - MAT工具问题排查与分析
  • Windows Server 2008实现磁盘管理
  • Palm助手:别让你的PalmPhone吃灰
  • VRRP的配置
  • red5 server使用笔记(一)
  • TVM Operator Inventory (TOPI)简介
  • 操作系统(2)操作系统概述
  • WebGIS入门
  • Visual Studio 2005 IDE 技巧和窍门
  • StrictMode总结
  • this.Invoke((EventHandler)(delegate { }); 简解,(有误解恳亲指出
  • 海得服务器虚拟机,海得PLC远程编程调试流程
  • 不想要网页默认的右键菜单栏,怎么封装一个可以自定义的右键菜单组件?
  • asp八大开源cms比较汇总
  • 基于 .NET 6 开发的英雄联盟插件
  • AS3接口详解