当前位置:编程学习 > wap >>

【求教】调用这个webservice方法该怎样传递参数?

我在Android上使用ksoap2调用Webservice提供的一个方法,其中一个参数含有List,求助各位调用方法。
此方法的wsdl文件描述如下:

<!-- 参数说明 -->
  <xs:complexType name="FindOrderHeadVo">
  <xs:sequence>
  <xs:element minOccurs="0" name="billHeadId" type="xs:string" /> 
  <xs:element minOccurs="0" name="billCode" type="xs:string" /> 
  <xs:element minOccurs="0" name="billTitle" type="xs:string" /> 
  <xs:element minOccurs="0" name="billType" type="xs:string" /> 
  <xs:element minOccurs="0" name="billStatus" type="xs:string" /> 
  ......中间太长省略.....
  </xs:sequence>
  </xs:complexType>

<!---从下面这段可以看出FindOrderHeadListVo 中有一个由FindOrderHeadVo构成的List --->
  <xs:complexType name="FindOrderHeadListVo">
  <xs:sequence>
  <xs:element maxOccurs="unbounded" minOccurs="0" name="list" nillable="true" type="tns:FindOrderHeadVo" /> 
  </xs:sequence>
  </xs:complexType>

<!-- 从下面这段可以看出第一个参数是个FindOrderHeadListVo对象--->
  <xs:complexType name="findOrderHeadByHeadForPhone">
  <xs:sequence>
  <xs:element minOccurs="0" name="arg0" type="tns:FindOrderHeadListVo" /> 
  <xs:element minOccurs="0" name="arg1" type="xs:string" /> 
  <xs:element name="arg2" type="xs:int" /> 
  <xs:element name="arg3" type="xs:int" /> 
  <xs:element minOccurs="0" name="arg4" type="xs:string" /> 
  <xs:element minOccurs="0" name="arg5" type="xs:string" /> 
  </xs:sequence>
  </xs:complexType>


<!-- 现在要调用的就是这个findOrderHeadByHeadForPhone -->
<wsdl:operation name="findOrderHeadByHeadForPhone">
  <wsdl:input message="tns:findOrderHeadByHeadForPhone"    name="findOrderHeadByHeadForPhone" /> 
  <wsdl:output message="tns:findOrderHeadByHeadForPhoneResponse" name="findOrderHeadByHeadForPhoneResponse" /> 
  </wsdl:operation>



我使用soapUI 测试这个服务的  findOrderHeadByHeadForPhone 方法时的参数截图如下:
http://img.my.csdn.net/uploads/201309/15/1379220550_3964.JPG

问题是:我客户端在调用这个方法时,第一个参数该怎么传递?
以下是我的两种做法:
【方法一】
1.建立实现了KvmSerializable序列化接口的FindOrderHeadVo 类

public class FindOrderHeadVo implements KvmSerializable{
     //......代码省略
}


2.直接将FindOrderHeadVo 实例最为参数传递


rpc.addProperty("arg0", new FindOrderHeadVo("8aa14f953e03d90f013e11c513d422a3","XJRW_GD-2332201304160294","23"));
    rpc.addProperty("arg2", 0);
    rpc.addProperty("arg3", 10);
    rpc.addProperty("arg4","address");
    rpc.addProperty("arg5","?");


SOAPEnvelop envelope = new SOAPEnvelop(SoapEnvelope.VER10);
envelope.addMapping(nameSpace, "FindOrderHeadVo", FindOrderHeadVo.class);
envelope.bodyOut = rpc;
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
Marshal marshalDate = new MarshalDate();
marshalDate.register(envelope);
SOAPHttpTransport transport = new SOAPHttpTransport(endPoint);

// 调用WebService
try {
transport.debug=true;
transport.call(soapAction, envelope);
                }catch(Exception ex )
                //........


这种调用方法返回结果Fault

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Fault occurred while processing.</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>


应该是传递的第一个参数不对,服务器端处理不了返回的。

【方法二】
1.创建FindOrderHeadListVo类,里面只含有一个List


public class FindOrderHeadListVo implements KvmSerializable{
private static final long serialVersionUID = 1L;

private List<FindOrderHeadVo> list = new ArrayList<FindOrderHeadVo>(); 

public List<FindOrderHeadVo> getList() {
return list;
}

public void setList(List<FindOrderHeadVo> list) {
this.list = list;
}

@Override
public Object getProperty(int arg0) {
// TODO Auto-generated method stub
return list;
}

@Override
public int getPropertyCount() {
// TODO Auto-generated method stub
return 1;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
arg2.type=list.getClass();
arg2.name="list";

}

@SuppressWarnings("unchecked")
@Override
public void setProperty(int arg0, Object arg1) {
list=(Vector<FindOrderHeadVo>)arg1;
}

2.调用时传递FindOrderHeadListVo 实例
		
FindOrderHeadListVo list = new FindOrderHeadListVo();
list.getList().add(new FindOrderHeadVo("8aa14f953e03d90f013e11c513d422a3","XJRW_GD-2332201304160294","23"));
PropertyInfo p1= new PropertyInfo();
p1.setName("arg0");
p1.setValue(list);
p1.setType(FindOrderHeadVo.class);
rpc.addProperty(p1);
rpc.addProperty("arg1", "23130712");
rpc.addProperty("arg2", 0);
    rpc.addProperty("arg3", 10);
    rpc.addProperty("arg4","address");
    rpc.addProperty("arg5","?");

SOAPEnvelop envelope = new SOAPEnvelop(SoapEnvelope.VER10);
envelope.addMapping(nameSpace, "FindOrderHeadVo", FindOrderHeadVo.class);
envelope.bodyOut = rpc;
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
Marshal marshalDate = new MarshalDate();
marshalDate.register(envelope);
SOAPHttpTransport transport = new SOAPHttpTransport(endPoint);

// 调用WebService
try {
transport.debug=true;
transport.call(soapAction, envelope);
}catch(Exception ex)
//......

这种方法会在调用call()方法时直接抛出异常FindOrderHeadVo不能被序列化。

请问各位大神,我要调用这个方法该如何传递第一个参数?
各位若有需要得到详细代码的请加我QQ411641505 webservice arraylist ksoap2
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,