Man*_*noj 2 android web-services ksoap2
我正在使用ksoap2来调用Android中的java webservice.Java Web服务方法是,
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
Run Code Online (Sandbox Code Playgroud)
ImageProcessDAO.java
public static String sample(UserRequest userRequest) {
System.out.println(userRequest.getClientName());
UserResponse UserResponse = new UserResponse();
userResponse.setMessage("SUCCESS");
return userResponse;
}
Run Code Online (Sandbox Code Playgroud)
我从Android调用这些web服务,
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());
}
Run Code Online (Sandbox Code Playgroud)
但我在我的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>
Run Code Online (Sandbox Code Playgroud)
我用过KvmSerializable.我private Client[] clientNameList = null;在UserRequest.java中添加了一个数组bean变量
.
当我调用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Client.java仅包含Integer类型的clientId.
更新了代码和wsdl
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
我从Android调用这些web服务,
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());
}
Run Code Online (Sandbox Code Playgroud)
我的新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>
Run Code Online (Sandbox Code Playgroud)
我坚持要简单地用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);
Run Code Online (Sandbox Code Playgroud)
您将获得responseString中的响应,您可以使用SAX或任何其他XML解析器来解析它.