求解答WebService一个基本疑问

yycxx 2006-10-15 04:16:20
最近看WEBSERVICE的资料,可能是太笨了,最基本的问题没弄明白。
WebService可以任何自定义的对象,其它语言可以解析这些自定义的对象吗。
如果可以,那么它是根据SOAP的某些协议来解析的,包括对象中的字段、方法,都可以解析出来吗?
然后客户端语言根据解析出来的对象生成一个新的可以使用的对象吗?如果不是这样,那么客户端语言要怎样才可以取得结果里的数据?
...全文
309 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonyzhangcn 2006-10-17
  • 打赏
  • 举报
回复
=====================================
// 这个市客户端调用,实际是就是返回上面的结果对象。你根据这个对象调用其里边的方法就得到你要的信息了。当人这个结果对象还可以更复杂的。比如说包含一个列表等。
// Source File Name: InterfaceCenter.java

package 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();
}
}
tonyzhangcn 2006-10-17
  • 打赏
  • 举报
回复
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.java

package 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);
}
}

yycxx 2006-10-16
  • 打赏
  • 举报
回复
谢谢tonyzhangcn(东尼)的回答:
可我还不明白的是:
比如我传回的是一个ResponseObject,里面有一个getResult()的方法,我用客户端语言该怎样读取result的数据呢。。可否随便用一种语言示例一下。。
tonyzhangcn 2006-10-15
  • 打赏
  • 举报
回复
你发布出来的webserverices可以用任何语言实现,也可以用任何语言实现客户端,即去调用WS。webservices解析传递的对象是一些已经些好了得API来完成的,一般的我们的客户端的服务器断只有我们些的一些对象类和处理类(当然如果你想自己实现那也可以,但是需要说明的是已经有很多API了,例如:axis,你根本不要费这个刭儿)。客户端发起的时候你使用的api会将其转换成合适的soap保发送到WS服务端,服务端接收到后仍然有API负责将这些soap中的对象转换成java类对象,以便操作。服务端返回的时候正好和这个相反的。
实际上SOAP就是一段xml片断,你当然可以解析其中的任何信息。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧