问题描述,在使用axis调用webservice服务时,出现生僻字问题服务端接收不了。上传的汉字报文是&#xxxxx;这种格式,要解决问题就需要找到哪里进行了编码。自己是否可以自定义,那先来了解一些基本概念。
一.webservice简介
webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互,交互中使用的协议是soap协议。
什么是soap协议
SOAP协议简单的理解 HTTP+XML:采用HTTP作为底层通讯协议;XML作为数据传送的格式,一个SOAP请求其实就是一个HTTP请求。
如何确定http请求中是否有SOAP的数据
如果请求头中有SOAPAction这一段,那么请求会被当作SOAP的内容来处理而不会当作HTML来解析。也可以指定 Content-Type: application/soap+xml 来表示内容是SOAP的内容
二.axis简介
Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范的开放源代码实现,它为java应用服务器提供了标准的webservice能力。
axis发送webservice需要做那些事情?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQ2dJUsY-1628922770148)(C:\Users\86136\AppData\Roaming\Typora\typora-user-images\image-20210812221731043.png)]
通俗点讲就是把对象转换为指定格式的字符串发送到服务器,再把接收的消息解析就完事了。
三.生僻字的问题
知道了这些基本概念,可以大概分析出问题,就是axis在对象转换为soap协议的xml时候对对象进行了编码。接下来就是分析axis代码。通过分析发现org.apache.axis.components.encoding.UTF8Encoder这个类中对字符进行了转换把10进制转换为了16进制:
if (character > 127) {
writer.write("&#x");
writer.write(Integer.toHexString(character).toUpperCase());
writer.write(";");
} else {
writer.write(character);
}
接下来我们要做的是可不可以用我们自定义编码类,不进行16进制转换。通过代码可以看到org.apache.axis.components.encoding.XMLEncoderFactory这个类负责生成编码器。encoderMap会先放入axis自己的编码器UTF8Encoder,UTF16Encoder,loadPlu