J'utilise actuellement KSOAP2 pour mon projet qui est lié à un WebService SOAP. Jusqu'à présent, j'ai réussi à obtenir un résultat, mais maintenant j'ai eu envie d'analyser ce résultat dans un POJO. J'ai lu cela en utilisant addMapping(namespace,node,class)
je pourrais obtenir mon résultat dans cet objet mais je ne sais pas où est le problème dans mon code. Donc ma question serait: Comment analyser la réponse KSOAP dans mon objet personnalisé?KSOAP analyse de réponse complexe
wsdl: http://www.webservicex.net/geoipservice.asmx?wsdl
Mon XML Réponse
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetGeoIPResponse xmlns="http://www.webservicex.net/">
<GetGeoIPResult>
<ReturnCode>1</ReturnCode>
<IP>127.0.0.1</IP>
<ReturnCodeDetails>Success</ReturnCodeDetails>
<CountryName>Reserved</CountryName>
<CountryCode>ZZZ</CountryCode>
</GetGeoIPResult>
</GetGeoIPResponse>
</soap:Body>
</soap:Envelope>
MainActivity.java
private static final String SOAP_ACTION = "http://www.webservicex.net/GetGeoIP";
private static final String METHOD_NAME = "GetGeoIP";
private static final String NAMESPACE = "http://www.webservicex.net/";
private static final String URL = "http://www.webservicex.net/geoipservice.asmx?wsdl";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
addProperty("IPAddress","127.0.0.1");
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet= true;
soapEnvelope.setOutputSoapObject(request);
soapEnvelope.addMapping(NAMESPACE,"getGeoIPResponse", new GetGeoIPResponse().getClass());
soapEnvelope.addMapping(NAMESPACE,"getGeoIPResult", new GetGeoIPResult().getClass());
soapEnvelope.implicitTypes = true;
HttpTransportSE transport = new HttpTransportSE(URL);
transport.debug = true;
try {
transport.call(SOAP_ACTION, soapEnvelope);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
SoapObject resultString = (SoapObject) soapEnvelope.bodyIn;
Log.i(TAG, "Result: " + resultString);
} catch (Exception ex) {
Log.e(TAG, "Error: " + ex.getMessage());
}
GetGeoResponse.java
public class GetGeoIPResponse implements KvmSerializable{
GetGeoIPResult getGeoIPResult = new GetGeoIPResult();
@Override
public Object getProperty(int index) {
if(index == 0){
return this.getGeoIPResult;
}
return null;
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void setProperty(int index, Object value) {
if(index == 0){
this.getGeoIPResult =(GetGeoIPResult) value;
}
}
@Override
public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {
if(index == 0){
info.name = "GetGeoIPResult";
info.type = GetGeoIPResult.class;
}
}
}
Ge tGeoIPResult.java
public class GetGeoIPResult implements KvmSerializable {
private Integer returnCode;
private String IP;
private String returnCodeDetails;
private String countryName;
private String countryCode;
@Override
public Object getProperty(int index) {
switch (index){
case 0: return returnCode;
case 1: return IP;
case 2: return returnCodeDetails;
case 3: return countryName;
case 4: return countryCode;
default: return null;
}
}
@Override
public int getPropertyCount() {
return 5;
}
@Override
public void setProperty(int index, Object value) {
switch (index){
case 0:
returnCode = Integer.parseInt(value.toString());
break;
case 1:
IP = value.toString();
break;
case 2:
returnCodeDetails = value.toString();
break;
case 3:
countryName = value.toString();
break;
case 4:
countryCode = value.toString();
break;
default:
break;
}
}
@Override
public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {
switch (index){
case 0:
info.name = "ReturnCode";
info.type = PropertyInfo.INTEGER_CLASS;
break;
case 1:
info.name = "IP";
info.type = PropertyInfo.STRING_CLASS;
break;
case 2:
info.name = "ReturnCodeDetails";
info.type = PropertyInfo.STRING_CLASS;
break;
case 3:
info.name = "CountryName";
info.type = PropertyInfo.STRING_CLASS;
break;
case 4:
info.name = "CountryCode";
info.type = PropertyInfo.STRING_CLASS;
break;
default:
break;
}
}
}