2017-06-26 3 views
0

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; 
     } 

    } 
} 

Répondre

0

j'ai trouvé moi-même voici les fichiers:

Demande

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

      request.addProperty("IPAddress","127.0.0.1"); 

      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      soapEnvelope.dotNet= true; 

      soapEnvelope.setOutputSoapObject(request); 

      soapEnvelope.addMapping(NAMESPACE,"GetGeoIPResponse", GetGeoIPResponse.class); 
      soapEnvelope.addMapping(NAMESPACE,"GetGeoIPResult", GetGeoIPResult.class); 

      soapEnvelope.implicitTypes = true; 
      HttpTransportSE transport = new HttpTransportSE(URL); 
      transport.debug = true; 
      transport.call(SOAP_ACTION, soapEnvelope); 

      GetGeoIPResponse resultString = (GetGeoIPResponse) soapEnvelope.bodyIn; 

GetGeoIPResult.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; 
      } 

     } 
    } 

GetGeoIPResponse.java

public class GetGeoIPResponse implements KvmSerializable { 

    private GetGeoIPResult getGeoIPResult; 

    @Override 
    public Object getProperty(int index) { 
     switch (index){ 
      case 0: 
       return getGeoIPResult; 
      default: return null; 
     } 
    } 

    @Override 
    public int getPropertyCount() { 
     return 1; 
    } 

    @Override 
    public void setProperty(int index, Object value) { 
     switch (index){ 
      case 0: 
       getGeoIPResult = (GetGeoIPResult) value; 
       break; 
     } 

    } 

    @Override 
    public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) { 
     switch (index){ 
      case 0: 
       info.name = "GetGeoIPResult"; 
       info.type = GetGeoIPResult.class; 
       break; 
     } 

    } 
}