你发布出来的webserverices可以用任何语言实现,也可以用任何语言实现客户端,即去调用WS。webservices解析传递的对象是一些已经些好了得API来完成的,一般的我们的客户端的服务器断只有我们些的一些对象类和处理类(当然如果你想自己实现那也可以,但是需要说明的是已经有很多API了,例如:axis,你根本不要费这个刭儿)。客户端发起的时候你使用的api会将其转换成合适的soap保发送到WS服务端,服务端接收到后仍然有API负责将这些soap中的对象转换成java类对象,以便操作。服务端返回的时候正好和这个相反的。
实际上SOAP就是一段xml片断,你当然可以解析其中的任何信息。

解决方案 »

  1.   

    谢谢tonyzhangcn(东尼)的回答:
    可我还不明白的是:
    比如我传回的是一个ResponseObject,里面有一个getResult()的方法,我用客户端语言该怎样读取result的数据呢。。可否随便用一种语言示例一下。。
      

  2.   

    ws在服务段和客户端应该有stub和skelenton的。这个你要先了解一下。在RMI中这个是一个很基本的概念。实际是你发布ws后,客户端实现可以用你发布的ws的wsdl信息来生成客户端的一些处理类,这里边当然有你返回对象xxxResponse,你客户端生成的类会将soap数据序列化成这个对象的例如:
    soap中的结果数据是<resultCode>0</resultCode><resultDescription>OK</resultDescription>话,那么你的xxxResponse对象的实例就含有这两个值了。xxxResponse.getResultCode()就是0,xxxResponse.getResultDescription()就是字符串"OK".
    // 下面是我们以前做的一个项目中的一个结果对象是wsdl2java生成的,根本不用手工去动。
    // Source File Name:   GeneralResult.javapackage com.boss.crcinterfaces;import java.io.Serializable;
    import javax.xml.namespace.QName;
    import org.apache.axis.description.ElementDesc;
    import org.apache.axis.description.TypeDesc;
    import org.apache.axis.encoding.Deserializer;
    import org.apache.axis.encoding.Serializer;
    import org.apache.axis.encoding.ser.BeanDeserializer;
    import org.apache.axis.encoding.ser.BeanSerializer;public class GeneralResult
        implements Serializable
    {    private Integer result;
        private String errorDetail;
        private Object __equalsCalc;
        private boolean __hashCodeCalc;
        private static TypeDesc typeDesc;
        static Class class$com$boss$crcinterfaces$GeneralResult; /* synthetic field */    public GeneralResult(Integer result, String msg)
        {
            __equalsCalc = null;
            __hashCodeCalc = false;
            this.result = result;
            errorDetail = msg;
        }    public GeneralResult()
        {
            __equalsCalc = null;
            __hashCodeCalc = false;
        }    public Integer getResult()
        {
            return result;
        }    public void setResult(Integer result)
        {
            this.result = result;
        }    public String getErrorDetail()
        {
            return errorDetail;
        }    public void setErrorDetail(String errorDetail)
        {
            this.errorDetail = errorDetail;
        }    public synchronized boolean equals(Object obj)
        {
            if(!(obj instanceof GeneralResult))
                return false;
            GeneralResult other = (GeneralResult)obj;
            if(obj == null)
                return false;
            if(this == obj)
                return true;
            if(__equalsCalc != null)
            {
                return __equalsCalc == obj;
            } else
            {
                __equalsCalc = obj;
                boolean _equals = (result == null && other.getResult() == null || result != null && result.equals(other.getResult())) && (errorDetail == null && other.getErrorDetail() == null || errorDetail != null && errorDetail.equals(other.getErrorDetail()));
                __equalsCalc = null;
                return _equals;
            }
        }    public synchronized int hashCode()
        {
            if(__hashCodeCalc)
                return 0;
            __hashCodeCalc = true;
            int _hashCode = 1;
            if(getResult() != null)
                _hashCode += getResult().hashCode();
            if(getErrorDetail() != null)
                _hashCode += getErrorDetail().hashCode();
            __hashCodeCalc = false;
            return _hashCode;
        }    public static TypeDesc getTypeDesc()
        {
            return typeDesc;
        }    public static Serializer getSerializer(String mechType, Class _javaType, QName _xmlType)
        {
            return new BeanSerializer(_javaType, _xmlType, typeDesc);
        }    public static Deserializer getDeserializer(String mechType, Class _javaType, QName _xmlType)
        {
            return new BeanDeserializer(_javaType, _xmlType, typeDesc);
        }    static Class class$(String x0)
        {
            return Class.forName(x0);
            ClassNotFoundException x1;
            x1;
            throw new NoClassDefFoundError(x1.getMessage());
        }    static 
        {
            typeDesc = new TypeDesc(class$com$boss$crcinterfaces$GeneralResult != null ? class$com$boss$crcinterfaces$GeneralResult : (class$com$boss$crcinterfaces$GeneralResult = class$("com.boss.crcinterfaces.GeneralResult")));
            typeDesc.setXmlType(new QName("http://crcinterfaces.ort.com", "GeneralResult"));
            ElementDesc elemField = new ElementDesc();
            elemField.setFieldName("result");
            elemField.setXmlName(new QName("", "Result"));
            elemField.setXmlType(new QName("http://schemas.xmlsoap.org/soap/encoding/", "int"));
            elemField.setMinOccurs(0);
            typeDesc.addFieldDesc(elemField);
            elemField = new ElementDesc();
            elemField.setFieldName("errorDetail");
            elemField.setXmlName(new QName("", "ErrorDetail"));
            elemField.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
            elemField.setMinOccurs(0);
            typeDesc.addFieldDesc(elemField);
        }
    }
      

  3.   

    =====================================
    // 这个市客户端调用,实际是就是返回上面的结果对象。你根据这个对象调用其里边的方法就得到你要的信息了。当人这个结果对象还可以更复杂的。比如说包含一个列表等。
    // Source File Name:   InterfaceCenter.javapackage com.boss.crcinterfaces.business;import com.boss.crcinterfaces.*;
    import com.ipbs.util.PropertyManager;
    import java.net.URL;public class InterfaceCenter
    {    public InterfaceCenter()
        {
        }    public Object doService(Object requestDataBean)
        {
            Object result = null;
            CRCBillInterfaceBindStub binding = getBinding();
            if(binding == null)
                return new GeneralResult(new Integer(-1), "无法连接到接口服务!");
            binding.setTimeout(0x493e0);
            if(requestDataBean instanceof OpenAccountRequest)
                try
                {
                    result = binding.openAccount((OpenAccountRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用开户接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ManageServiceRequest)
                try
                {
                    result = binding.manageService((ManageServiceRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用管理用户服务接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ChangeServiceRequest)
                try
                {
                    result = binding.changeService((ChangeServiceRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用更换用户服务接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ChangeStatusRequest)
                try
                {
                    result = binding.changeStatus((ChangeStatusRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用修改用户状态接口时产生异常!");
                }
            else
            if(requestDataBean instanceof DestroyAccountRequest)
                try
                {
                    result = binding.destroyAccount((DestroyAccountRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用销户接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ChangePasswordRequest)
                try
                {
                    result = binding.changePassword((ChangePasswordRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用密码重置接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ChangeUsernameRequest)
                try
                {
                    result = binding.changeUsername((ChangeUsernameRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用修改登录名接口时产生异常!");
                }
            else
            if(requestDataBean instanceof QueryAccountInfoRequest)
                try
                {
                    result = binding.queryAccountInfo((QueryAccountInfoRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new QueryAccountInfoResponse(new Integer(-1), "调用查询用户信息接口时产生异常!", null);
                }
            else
            if(requestDataBean instanceof DepositRequest)
                try
                {
                    result = binding.deposit((DepositRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用用户续费接口时产生异常!");
                }
            else
            if(requestDataBean instanceof DiscountRequest)
                try
                {
                    result = binding.discount((DiscountRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用用户折扣更新接口时产生异常!");
                }
            else
            if(requestDataBean instanceof UpdateServiceRequest)
                result = new GeneralResult(new Integer(-1), "此服务未实现!");
            else
            if(requestDataBean instanceof DelAssistServiceRequest)
                try
                {
                    result = binding.delAssistService((DelAssistServiceRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用服务变更历史删除接口时产生异常!");
                }
            else
            if(requestDataBean instanceof ChangeAccountInfoRequest)
                try
                {
                    result = binding.changeAccountInfo((ChangeAccountInfoRequest)requestDataBean);
                }
                catch(Exception e)
                {
                    result = new GeneralResult(new Integer(-1), "调用用户信息变更接口时产生异常!");
                }
            else
                result = new GeneralResult(new Integer(-1), "请求值对象非法!");
            return result;
        }    private CRCBillInterfaceBindStub getBinding()
        {
            CRCBillInterfaceBindStub binding = null;
            String urlProperty = PropertyManager.getProperty("webserviceurl");
            try
            {
                URL url = new URL(urlProperty);
                binding = (CRCBillInterfaceBindStub)(new CRCBInterfaceLocator()).getBillInterfaceServices(url);
            }
            catch(Exception jre)
            {
                return null;
            }
            return binding;
        }
    //测试用
        public static void main(String args[])
        {
            InterfaceCenter interfaceCenter1 = new InterfaceCenter();
        }
    }