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

yjl49 2013-09-15 01:25:09
我在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
...全文
87 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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