`
caiying0504
  • 浏览: 344534 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

axis1.4调用.net webservice返回带图片的对象

阅读更多
近期项目中需要用到webservice,接口提供方使用.net编写,返回的是自定义对象,对象中有图片。
接口描述文件如下
POST /FJJTMapService/Service.asmx HTTP/1.1
Host: 192.168.5.92
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <ChartService xmlns="http://www.fzis.com.cn/">
      <type>string</type>
      <width>int</width>
      <height>int</height>
      <imageType>string</imageType>
      <fieldnames>string</fieldnames>
      <fieldvalues>string</fieldvalues>
      <rgbcolors>string</rgbcolors>
      <chartType>string</chartType>
      <size>string</size>
    </ChartService>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <ChartServiceResponse xmlns="http://www.fzis.com.cn/">
      <ChartServiceResult>
        <Xmax>double</Xmax>
        <Xmin>double</Xmin>
        <Ymax>double</Ymax>
        <Ymin>double</Ymin>
        <MapByte>base64Binary</MapByte>
        <ErrorMessage>string</ErrorMessage>
      </ChartServiceResult>
    </ChartServiceResponse>
  </soap12:Body>
</soap12:Envelope>


wsdl文件如下

//返回对象
<s:complexType name="Map">
- <s:sequence>
  <s:element minOccurs="1" maxOccurs="1" name="Xmax" type="s:double" /> 
  <s:element minOccurs="1" maxOccurs="1" name="Xmin" type="s:double" /> 
  <s:element minOccurs="1" maxOccurs="1" name="Ymax" type="s:double" /> 
  <s:element minOccurs="1" maxOccurs="1" name="Ymin" type="s:double" /> 
  <s:element minOccurs="0" maxOccurs="1" name="MapByte" type="s:base64Binary" /> 
  <s:element minOccurs="0" maxOccurs="1" name="ErrorMessage" type="s:string" /> 
  </s:sequence>
  </s:complexType>
//调用方法
- <s:element name="ChartService">
- <s:complexType>
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="type" type="s:string" /> 
  <s:element minOccurs="1" maxOccurs="1" name="width" type="s:int" /> 
  <s:element minOccurs="1" maxOccurs="1" name="height" type="s:int" /> 
  <s:element minOccurs="0" maxOccurs="1" name="imageType" type="s:string" /> 
  <s:element minOccurs="0" maxOccurs="1" name="fieldnames" type="s:string" /> 
  <s:element minOccurs="0" maxOccurs="1" name="fieldvalues" type="s:string" /> 
  <s:element minOccurs="0" maxOccurs="1" name="rgbcolors" type="s:string" /> 
  <s:element minOccurs="0" maxOccurs="1" name="chartType" type="s:string" /> 
  <s:element minOccurs="0" maxOccurs="1" name="size" type="s:string" /> 
  </s:sequence>
  </s:complexType>
  </s:element>
- <s:element name="ChartServiceResponse">
- <s:complexType>
- <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="ChartServiceResult" type="tns:Map" /> 
  </s:sequence>
  </s:complexType>
  </s:element>

调用过程
 try {
	        	// WebService URL 
	        	String url = "http://192.168.5.92/FJJTMapService/Service.asmx";
	        	String namespace = "http://www.fzis.com.cn/";
	        	String method = "ChartService";
	        	
	        	//创建调用服务
	        	Service service = new Service();
	            Call call = (Call) service.createCall();           
	            call.setTargetEndpointAddress(new java.net.URL(url));
	            
	            call.setUseSOAPAction(true);
	            call.setSOAPActionURI(namespace+method);
	            
	          //注册对象
	            QName qn=new QName(namespace, "Map");
	            call.registerTypeMapping(RouteThemeResult.class, qn,
	            new org.apache.axis.encoding.ser.
	            BeanSerializerFactory(RouteThemeResult.class, qn),
	            new org.apache.axis.encoding.ser.
	            BeanDeserializerFactory(RouteThemeResult.class, qn));	         
	            
	            // 设置要调用的方法 
	            call.setOperationName(new QName(namespace, method));  
	            
	            // 该方法需要的参数	
	            
	            	call.addParameter(new QName(namespace,"type"),XMLType.XSD_STRING,ParameterMode.IN);
	            	call.addParameter(new QName(namespace,"width"),XMLType.XSD_INT,ParameterMode.IN);
		            call.addParameter(new QName(namespace,"height"),XMLType.XSD_INT,ParameterMode.IN);
		            call.addParameter(new QName(namespace,"imageType"),XMLType.XSD_STRING,ParameterMode.IN);		            
	 	            call.addParameter(new QName(namespace,"fieldnames"),XMLType.XSD_STRING,ParameterMode.IN);
	 	            call.addParameter(new QName(namespace,"fieldvalues"),XMLType.XSD_STRING,ParameterMode.IN);
	 	            call.addParameter(new QName(namespace,"rgbcolors"),XMLType.XSD_STRING,ParameterMode.IN);
	 	            call.addParameter(new QName(namespace,"chartType"),XMLType.XSD_STRING,ParameterMode.IN);
	 	            call.addParameter(new QName(namespace,"size"),XMLType.XSD_STRING,ParameterMode.IN);   
	        		            
	            
	            // 方法的返回值类型             
	            //call.setReturnType(XMLType.XSD_STRING);
	            call.setReturnType(qn);
	          	          	            
	            //设置参数 
	            String type = gisChartInfo.getLayername();
	        	int width = gisChartInfo.getWidth();
	        	int height = gisChartInfo.getHeight();
	        	String imageType = gisChartInfo.getImageType();	
	        	String fieldnames = gisChartInfo.getFieldnames();
	        	String fieldvalues = gisChartInfo.getFieldvalues();
	        	String rgbcolors = gisChartInfo.getRgbcolors();
	        	String chartType = gisChartInfo.getChartType();
	        	String size = gisChartInfo.getSize();
	        	
	        	
	        	
	        	Object[] parameters = null;

	        	parameters = new Object[]{type,width+"",height+"",imageType,fieldnames,fieldvalues,rgbcolors,chartType,size};
	            	 
	        	// 调用该方法 
	        	byte[] imageBytes ;        	
	        	RouteThemeResult result = new RouteThemeResult() ;
	        	Object obj = call.invoke(parameters);	        	
	        	if(obj!=null){
	        		System.out.println("ishere:");
	        		if (obj instanceof java.rmi.RemoteException) {
		 	            throw (java.rmi.RemoteException)obj;
		 	        }
		 	        else {
		 	            try {
		 	            	result =  (RouteThemeResult) obj;
		 	            } catch (java.lang.Exception _exception) {
		 	            	result = (RouteThemeResult) org.apache.axis.utils.JavaUtils.convert(obj, RouteThemeResult.class);
		 	            }
		 	        }
	        			
	        	}

我在调用接口过程中碰到的难题是对返回对象的接受,返回对象是.net中定义的,在java中接受就需要进行序列化,序列化的问题搞了好几天没进展,最后实在没招了就还是使用啦
AXIS1.4的 wsdl2java 生成客户端,从生成的代码中找到了序列化返回对象的类,修改后直接引用。
返回对象在java中的定义(通过wsdl2java生成)
public class RouteThemeResult implements java.io.Serializable {
    private double xmax;

    private double xmin;

    private double ymax;

    private double ymin;

    private byte[] mapByte;

    private java.lang.String errorMessage;

    public RouteThemeResult() {
    }

    public RouteThemeResult(
           double xmax,
           double xmin,
           double ymax,
           double ymin,
           byte[] mapByte,
           java.lang.String errorMessage) {
           this.xmax = xmax;
           this.xmin = xmin;
           this.ymax = ymax;
           this.ymin = ymin;
           this.mapByte = mapByte;
           this.errorMessage = errorMessage;
    }


    /**
     * Gets the xmax value for this Map.
     * 
     * @return xmax
     */
    public double getXmax() {
        return xmax;
    }


    /**
     * Sets the xmax value for this Map.
     * 
     * @param xmax
     */
    public void setXmax(double xmax) {
        this.xmax = xmax;
    }


    /**
     * Gets the xmin value for this Map.
     * 
     * @return xmin
     */
    public double getXmin() {
        return xmin;
    }


    /**
     * Sets the xmin value for this Map.
     * 
     * @param xmin
     */
    public void setXmin(double xmin) {
        this.xmin = xmin;
    }


    /**
     * Gets the ymax value for this Map.
     * 
     * @return ymax
     */
    public double getYmax() {
        return ymax;
    }


    /**
     * Sets the ymax value for this Map.
     * 
     * @param ymax
     */
    public void setYmax(double ymax) {
        this.ymax = ymax;
    }


    /**
     * Gets the ymin value for this Map.
     * 
     * @return ymin
     */
    public double getYmin() {
        return ymin;
    }


    /**
     * Sets the ymin value for this Map.
     * 
     * @param ymin
     */
    public void setYmin(double ymin) {
        this.ymin = ymin;
    }


    /**
     * Gets the mapByte value for this Map.
     * 
     * @return mapByte
     */
    public byte[] getMapByte() {
        return mapByte;
    }


    /**
     * Sets the mapByte value for this Map.
     * 
     * @param mapByte
     */
    public void setMapByte(byte[] mapByte) {
        this.mapByte = mapByte;
    }


    /**
     * Gets the errorMessage value for this Map.
     * 
     * @return errorMessage
     */
    public java.lang.String getErrorMessage() {
        return errorMessage;
    }


    /**
     * Sets the errorMessage value for this Map.
     * 
     * @param errorMessage
     */
    public void setErrorMessage(java.lang.String errorMessage) {
        this.errorMessage = errorMessage;
    }

    private java.lang.Object __equalsCalc = null;
    public synchronized boolean equals(java.lang.Object obj) {
        if (!(obj instanceof RouteThemeResult)) return false;
        RouteThemeResult other = (RouteThemeResult) obj;
        if (obj == null) return false;
        if (this == obj) return true;
        if (__equalsCalc != null) {
            return (__equalsCalc == obj);
        }
        __equalsCalc = obj;
        boolean _equals;
        _equals = true && 
            this.xmax == other.getXmax() &&
            this.xmin == other.getXmin() &&
            this.ymax == other.getYmax() &&
            this.ymin == other.getYmin() &&
            ((this.mapByte==null && other.getMapByte()==null) || 
             (this.mapByte!=null &&
              java.util.Arrays.equals(this.mapByte, other.getMapByte()))) &&
            ((this.errorMessage==null && other.getErrorMessage()==null) || 
             (this.errorMessage!=null &&
              this.errorMessage.equals(other.getErrorMessage())));
        __equalsCalc = null;
        return _equals;
    }

    private boolean __hashCodeCalc = false;
    public synchronized int hashCode() {
        if (__hashCodeCalc) {
            return 0;
        }
        __hashCodeCalc = true;
        int _hashCode = 1;
        _hashCode += new Double(getXmax()).hashCode();
        _hashCode += new Double(getXmin()).hashCode();
        _hashCode += new Double(getYmax()).hashCode();
        _hashCode += new Double(getYmin()).hashCode();
        if (getMapByte() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getMapByte());
                 i++) {
                java.lang.Object obj = java.lang.reflect.Array.get(getMapByte(), i);
                if (obj != null &&
                    !obj.getClass().isArray()) {
                    _hashCode += obj.hashCode();
                }
            }
        }
        if (getErrorMessage() != null) {
            _hashCode += getErrorMessage().hashCode();
        }
        __hashCodeCalc = false;
        return _hashCode;
    }

    // Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(RouteThemeResult.class, true);

    static {
        typeDesc.setXmlType(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Map"));
        org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("xmax");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Xmax"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("xmin");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Xmin"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("ymax");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Ymax"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("ymin");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "Ymin"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("mapByte");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "MapByte"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "base64Binary"));
        elemField.setMinOccurs(0);
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("errorMessage");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.fzis.com.cn/", "ErrorMessage"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setMinOccurs(0);
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
    }

    /**
     * Return type metadata object
     */
    public static org.apache.axis.description.TypeDesc getTypeDesc() {
        return typeDesc;
    }

    /**
     * Get Custom Serializer
     */
    public static org.apache.axis.encoding.Serializer getSerializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanSerializer(
            _javaType, _xmlType, typeDesc);
    }

    /**
     * Get Custom Deserializer
     */
    public static org.apache.axis.encoding.Deserializer getDeserializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanDeserializer(
            _javaType, _xmlType, typeDesc);
    }

}

当时问什么不直接用wsdl2java生成客户端是因为生成的代码在当时还读不懂,没有可控性
所以选择了自己手写客户端,第一次学习使用webservice,有不足地方请大家指正,共同学习,共同前进。
分享到:
评论
2 楼 lianj_lee 2009-09-10  
谢谢  在网上找了N久,没有看到一个像样的文章 都是抄过来抄过去的。

中国的程序员真是相当 “拉及”!
1 楼 lz726 2009-08-11  
   非常感谢。。。


相关推荐

    2025最新全国水利安全生产知识竞赛题库(含答案).docx

    2025最新全国水利安全生产知识竞赛题库(含答案).docx

    【雷达】非相干多视处理(CSA)Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    使用 MATLAB 的实时人脸识别考勤系统Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    elasticsearch8.17.1 docker镜像资源

    因为文件过大所以使用bz2进行了2次压缩,请解压成tar包后在上传到服务器

    基于java+ssm+mysql的校园二手交易平台 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    iostat打印解析画图工具

    iostat打印解析画图工具

    fence-agents-compute-4.2.1-41.el7-9.6.x64-86.rpm.tar.gz

    1、文件内容:fence-agents-compute-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-compute-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    从倾斜边缘或倾斜狭缝计算 MTFMatlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    维控HMI和PLC在各行业的应用

    PDF格式,229页,包括有环保,新能源,木工,包装等行业的应用。适用于电气自动化行业。

    dropwatch-1.4-9.el7.x64-86.rpm.tar.gz

    1、文件内容:dropwatch-1.4-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dropwatch-1.4-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    fence-agents-emerson-4.2.1-41.el7-9.6.x64-86.rpm.tar.gz

    1、文件内容:fence-agents-emerson-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-emerson-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    航空发动机磨粒荷电特性研究.pdf

    航空发动机磨粒荷电特性研究.pdf

    第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题

    第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题全面考察了参赛选手的编程与算法能力,涵盖多个热门编程语言,为选手提供了展现自身实力的舞台。 考察范围与方向 真题在编程语言上聚焦于 C/C++、Java、Python 等主流语言。考察内容广泛,既有基础的语法运用,也涉及复杂的数据结构和算法。数据结构方面,对数组、链表、栈、队列、哈希表等的使用有不同程度的考察;算法上,动态规划、贪心算法、搜索算法等经典算法是考察重点。 题型示例与特点 在具体题型上,有数值计算类题目,例如给定条件计算特定数值,要求选手有较强的逻辑思维和数学运算能力;字符串处理类题目,如字符串匹配、替换等,考验选手对字符串操作函数的熟悉程度;还有图论与搜索类题目,像最短路径问题,需要选手掌握相应的搜索算法。 考察目的与意义 这次校内选拔真题旨在筛选出编程能力强、算法思维敏捷的选手,为后续的正式比赛储备人才。通过解答这些真题,选手能发现自身知识短板,明确学习方向。对于学校而言,能了解学生的编程水平,为教学改进提供参考。同时,这也为学生提供了与同龄人交流切磋的机会,激发他们学习编程的热情,提升解决实际问题的能力。

    一种采用耦合电感的开关电路分析.pdf

    一种采用耦合电感的开关电路分析.pdf

    rancher-active-proxy

    rancher-active-proxy

    RSSIIndoorLocation-master

    RSSIIndoorLocation-master

    【电力系统】基于主从博弈的售电商多元零售套餐设计与多级市场购电策略Matlab复现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    exchange-bmc-os-info-1.8.18-11.el7-9.x64-86.rpm.tar.gz

    1、文件内容:exchange-bmc-os-info-1.8.18-11.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/exchange-bmc-os-info-1.8.18-11.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于java+ssm+mysql的图书管理借阅系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    docbook-style-xsl-1.78.1-3.el7.x64-86.rpm.tar.gz

    1、文件内容:docbook-style-xsl-1.78.1-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docbook-style-xsl-1.78.1-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

Global site tag (gtag.js) - Google Analytics