我正在使用ksoap2来调用Android中的java webservice。 Java Web服务方法是,
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
ImageProcessDAO.java
public static String sample(UserRequest userRequest) {
System.out.println(userRequest.getClientName());
UserResponse UserResponse = new UserResponse();
userResponse.setMessage("SUCCESS");
return userResponse;
}
我将这些来自Android的网络服务称为
try{
String NAMESPACE = "http://impl.test.com";
String URL = "http://10.0.2.2:8080/Webservice/services/ImageProcessImpl?wsdl";
String SOAP_ACTION = "http://impl.test.com/sample";
String METHOD_NAME = "sample";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
UserRequest userRequest = new UserRequest();
userRequest.setClientName("Test");
PropertyInfo pi = new PropertyInfo();
pi.setName("userRequest");
pi.setValue(userRequest);
pi.setType(UserRequest.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.implicitTypes = true;
envelope.addMapping(NAMESPACE, "UserResponse", UserResponse.class);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
httpTransport.call(SOAP_ACTION, envelope);
UserResponse response = (UserResponse) envelope.getResponse();
Log.e(Test.LOG_TAG, response.getMessage());
}catch (Exception e) {
Log.e(Test.LOG_TAG, "throws an exception: " + e.getMessage());
}
但是我在Logcat中收到的错误是“抛出异常:无法序列化:com.test.common.UserRequest ”。如何解决这个错误?这是使用复杂类型调用Web服务的正确方法吗?
我的wsdl文件是,
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://impl.test.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.test.com" xmlns:intf="http://impl.test.com" xmlns:tns1="http://common.test.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://impl.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://common.test.com"/>
<element name="sample">
<complexType>
<sequence>
<element name="userRequest" type="tns1:UserRequest"/>
</sequence>
</complexType>
</element>
<element name="sampleResponse">
<complexType>
<sequence>
<element name="sampleReturn" type="tns1:UserResponse"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://common.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="UserRequest">
<sequence>
<element name="clientName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="UserResponse">
<sequence>
<element name="message" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="sampleRequest">
<wsdl:part element="impl:sample" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sampleResponse">
<wsdl:part element="impl:sampleResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ImageProcessImpl">
<wsdl:operation name="sample">
<wsdl:input message="impl:sampleRequest" name="sampleRequest">
</wsdl:input>
<wsdl:output message="impl:sampleResponse" name="sampleResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImageProcessImplSoapBinding" type="impl:ImageProcessImpl">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sample">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sampleRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sampleResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImageProcessImplService">
<wsdl:port binding="impl:ImageProcessImplSoapBinding" name="ImageProcessImpl">
<wsdlsoap:address location="http://localhost:8080/Webservice/services/ImageProcessImpl"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
我使用了KvmSerializable。我添加了一个数组bean变量
UserRequest.java中的private Client[] clientNameList = null;
。
当我调用Web服务时,它在请求中正常工作。但在响应中,我得到一个包含所有值的字符串。响应字符串如下所示。
anyType{clientNameList=anyType{clientNameList=anyType{clientID=1; }; clientNameList=anyType{clientID=2; }; }; message=SUCCESS; }.
我如何解析这个字符串?
UserResponse.java
public class UserResponse implements KvmSerializable{
public String message = null;
public Client[] clientNameList = null;
@Override
public Object getProperty(int index) {
switch (index){
case 0:
return message;
case 1:
return clientNameList;
default:
return null;
}
}
@Override
public int getPropertyCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch(index)
{
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "message";
break;
case 1:
info.type = PropertyInfo.OBJECT_TYPE;
info.name = "clientNameList";
break;
default:
break;
}
}
@Override
public void setProperty(int index, Object value) {
switch(index)
{
case 0:
message = value.toString();
break;
case 1:
clientNameList = (Client[]) value;
break;
default:
break;
}
}
}
Client.java仅包含Integer类型的clientId。
更新了代码和wsdl
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
ImageProcessDAO.java
public static String sample(UserRequest userRequest) {
System.out.println(userRequest.getClientName());
UserResponse userResponse = new UserResponse();
userResponse.setMessage(SUCCESS);
Client[] clients = new Client[2];
Client client = null;
for(int i=0;i<2;i++)
{
client = new Client();
client.setClientID(i+1);
clients[i] = client;
}
userResponse.setClientNameList(clients);
return userResponse;
}
我将这些来自Android的网络服务称为
try{
String NAMESPACE = "http://impl.test.com";
String URL = "http://10.0.2.2:8080/Webservice/services/ImageProcessImpl?wsdl";
String SOAP_ACTION = "http://impl.test.com/sample";
String METHOD_NAME = "sample";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
UserRequest userRequest = new UserRequest();
userRequest.setClientName("Test");
PropertyInfo pi = new PropertyInfo();
pi.setName("userRequest");
pi.setValue(userRequest);
pi.setType(UserRequest.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.implicitTypes = true;
envelope.addMapping(NAMESPACE, "userRequest", UserRequest.class);
envelope.addMapping(NAMESPACE, "UserResponse", UserResponse.class);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
httpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject) envelope.getResponse();
userResponse.message = result.getProperty(0).toString();
Log.e(Test.LOG_TAG, userResponse.message);
}catch (Exception e) {
Log.e(Test.LOG_TAG, "throws an exception: " + e.getMessage());
}
我的新wsdl文件是,
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://impl.test.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.test.com" xmlns:intf="http://impl.test.com" xmlns:tns1="http://common.test.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://impl.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://common.test.com"/>
<element name="sample">
<complexType>
<sequence>
<element name="userRequest" type="tns1:UserRequest"/>
</sequence>
</complexType>
</element>
<element name="sampleResponse">
<complexType>
<sequence>
<element name="sampleReturn" type="tns1:UserResponse"/>
</sequence>
</complexType>
</element>
<complexType name="ArrayOf_tns1_Client">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" type="tns1:Client"/>
</sequence>
</complexType>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://common.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://impl.test.com"/>
<complexType name="UserRequest">
<sequence>
<element name="clientName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="Client">
<sequence>
<element name="clientID" type="xsd:int"/>
</sequence>
</complexType>
<complexType name="UserResponse">
<sequence>
<element name="clientNameList" nillable="true" type="impl:ArrayOf_tns1_Client"/>
<element name="message" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="sampleRequest">
<wsdl:part element="impl:sample" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sampleResponse">
<wsdl:part element="impl:sampleResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ImageProcessImpl">
<wsdl:operation name="sample">
<wsdl:input message="impl:sampleRequest" name="sampleRequest">
</wsdl:input>
<wsdl:output message="impl:sampleResponse" name="sampleResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImageProcessImplSoapBinding" type="impl:ImageProcessImpl">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sample">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sampleRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sampleResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImageProcessImplService">
<wsdl:port binding="impl:ImageProcessImplSoapBinding" name="ImageProcessImpl">
<wsdlsoap:address location="http://localhost:8080/Webservice/services/ImageProcessImpl"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
答案 0 :(得分:5)
我坚持要简单地用XML获取响应,并使用任何XML Parser来解析更容易的响应。此外,我会坚持要使用ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar
您正在使用的那个已被弃用。
AndroidHttpTransport
正在被HttpTransportSE
以下是如何使用XML获取响应,
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, 100);
androidHttpTransport.debug=true;
androidHttpTransport.call(SOAP_ACTION, envelope);
String response = androidHttpTransport.responseDump;
Log.d("Response in XML", response);
您将在response
字符串中获得响应,您可以使用SAX
或任何其他XML解析器来解析它。
答案 1 :(得分:2)
您的UserRequest类需要实现org.ksoap2.serialization.KvmSerializable。