2011-06-17 19 views
5

Soy nuevo en los servicios web WSDL, usando la biblioteca KSoap2 para llamar a los servicios web wsdl en android.¿Cómo enviar una solicitud de jabón en Android?

Esta es mi petición de jabón volcado

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:loy="http://loyalcard.com/LoyalCardWebService/">; 
    <soapenv:Header/> 
    <soapenv:Body> 
     <loy:GetOffersByLocation> 
     <!--Optional:--> 
     <loy:Location> 
      <!--Optional:--> 
      <loy:Latitude>?</loy:Latitude> 
      <!--Optional:--> 
      <loy:Longitude>?</loy:Longitude> 
     </loy:Location> 
     </loy:GetOffersByLocation> 
    </soapenv:Body> 
</soapenv:Envelope> 

estoy pasando este SopaObject como:

PropertyInfo latitude = new PropertyInfo(); 
     latitude.name="Latitude"; 
     latitude.type=Double.class; 
     latitude.setValue(32.806673); 

    PropertyInfo longitude = new PropertyInfo(); 
     longitude.name="Longitude"; 
     longitude.type=Double.class; 
     longitude.setValue(-86.791133); 

     SoapObject results = null; 
     String methodName = "OffersByLocation"; 
     String actionName = "http://loyalcard.com/LoyalCardWebService/GetOffersByLocation"; 
     SoapObject request = new SoapObject(NAMESPACE,methodName); 

     request.addProperty(latitude); 
     request.addProperty(longitude); 

Aquí estoy pasando los valores de latitud y longitud directamente a OffersByLocation, que debe pasar a través del elemento Ubicación. Por favor, cualquiera puede ayudar a pasar parámetros a través de la ubicación.

me han tratado con el procedimiento anterior, pero estoy consiguiendo error diciendo

06-17 11:52:55.934: WARN/System.err(350): SoapFault - faultcode: 'soapenv:Server' faultstring: 'org.apache.axis2.databinding.ADBException: Unexpected subelement Latitude' faultactor: 'null' detail: [email protected] 

favor puede alguien decirme cómo pasar por encima de jabón Solicitud volcado en Soap objeto?

Saludos, Srinivas

Respuesta

5

También puede construir manualmente el XML de la solicitud y enviarlo a kSOAP para enviar y procesar la respuesta. Puede escribir su solicitud XML utilizando soapUI, y luego guardarlos en res/raw con palabras clave como {%key%} donde los parámetros se deben colocar en tiempo de ejecución. Este es el código para la sustitución de las palabras clave:

// parse the template and replace all keywords 
StringBuffer sb = new StringBuffer(); 
try { 
    // find all keywords 
    Pattern patern = Pattern.compile("\\{%(.*?)%\\}"); 
    Matcher matcher = patern.matcher(templateHtml); 

    while (matcher.find()) { 
    String keyName = matcher.group(1); 
    String keyValue = values.get(keyName); 
    if (keyValue == null) { 
     keyValue = ""; 
    } 
    // replace the key with value 
    matcher.appendReplacement(sb, keyValue); 
    } 
    matcher.appendTail(sb); 

    // return the final string 
    return sb.toString(); 
} catch (Throwable e) { 
    Log.e(LOG_TAG, "Error parsing template", e); 
    return null; 
} 

Para enviar solicitud XML personalizado con kSOAP que necesita para hacer su propia clase de transporte.

O puede enviar la solicitud manualmente usando DefaultHttpClient (vea Using client/server certificates for two way authentication SSL socket on Android), y use kSOAP solo para analizar la respuesta.

/** 
    * Sends SOAP request to the web service. 
    * 
    * @param requestContent the SOAP request XML 
    * @return KvmSerializable object generated from the SOAP response XML 
    * @throws Exception if the web service can not be 
    * reached, or the response data can not be processed. 
    */ 
    public Object sendSoapRequest(String requestContent) 
     throws Exception { 

    // send SOAP request 
    InputStream responseIs = sendRequest(requestContent); 

    // create the response SOAP envelope 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

    // process SOAP response 
    parseResponse(responseIs, envelope); 

    Object bodyIn = envelope.bodyIn; 
    if (bodyIn instanceof SoapFault) { 
     throw (SoapFault) bodyIn; 
    } 

    return bodyIn; 
    } 

    /** 
    * Sends SOAP request to the web service. 
    * 
    * @param requestContent the content of the request 
    * @return {@link InputStream} containing the response content 
    * @throws Exception if communication with the web service 
    * can not be established, or when the response from the service can not be 
    * processed. 
    */ 
    private InputStream sendRequest(String requestContent) throws Exception { 

    // initialize HTTP post 
    HttpPost httpPost = null; 
    try { 
     httpPost = new HttpPost(serviceUrl); 
     httpPost.addHeader("Accept-Encoding", "gzip,deflate"); 
     httpPost.addHeader("Content-Type", "text/xml;charset=UTF-8"); 
     httpPost.addHeader("SOAPAction", "\"\""); 
    } catch (Throwable e) { 
     Log.e(LOG_TAG, "Error initializing HTTP post for SOAP request", e); 
     throw e; 
    } 

    // load content to be sent 
    try { 
     HttpEntity postEntity = new StringEntity(requestContent); 
     httpPost.setEntity(postEntity); 
    } catch (UnsupportedEncodingException e) { 
     Log.e(LOG_TAG, "Unsupported ensoding of content for SOAP request", e); 
     throw e; 
    } 

    // send request 
    HttpResponse httpResponse = null; 
    try { 
     httpResponse = httpClient.execute(httpPost); 
    } catch (Throwable e) { 
     Log.e(LOG_TAG, "Error sending SOAP request", e); 
     throw e; 
    } 

    // get SOAP response 
    try { 
     // get response code 
     int responseStatusCode = httpResponse.getStatusLine().getStatusCode(); 

     // if the response code is not 200 - OK, or 500 - Internal error, 
     // then communication error occurred 
     if (responseStatusCode != 200 && responseStatusCode != 500) { 
     String errorMsg = "Got SOAP response code " + responseStatusCode + " " 
      + httpResponse.getStatusLine().getReasonPhrase(); 
     ... 
     } 

     // get the response content 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     InputStream is = httpEntity.getContent(); 
     return is; 
    } catch (Throwable e) { 
     Log.e(LOG_TAG, "Error getting SOAP response", e); 
     throw e; 
    } 
    } 

    /** 
    * Parses the input stream from the response into SoapEnvelope object. 
    */ 
    private void parseResponse(InputStream is, SoapEnvelope envelope) 
     throws Exception { 
    try { 
     XmlPullParser xp = new KXmlParser(); 
     xp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); 
     xp.setInput(is, "UTF-8"); 
     envelope.parse(xp); 
    } catch (Throwable e) { 
     Log.e(LOG_TAG, "Error reading/parsing SOAP response", e); 
     throw e; 
    } 
    } 
+0

Peceps no puedo entender el anterior porque soy nuevo para Android ... por favor proporcione cualquier referencia o ejemplo. – Aravin

0

usted tiene que hacer su propia clase de generador de XML para hacer eso. También estoy usando el mismo procedimiento. descompile la biblioteca ksoap2 y estudie la forma en que la generan y cambian según lo requiera ...

+0

puede u pls elaboradas, lo que ur dicho? – Srinivas

0

Puede usar esto.

SoapObject requestObj=new SoapObject(NAMESPACE,"GetOffersByLocation"); 

SoapObject locationObj=new SoapObject(NAMESPACE,"Location"); 

PropertyInfo latitude = new PropertyInfo(); 
        latitude.name="Latitude"; 
       latitude.type=Double.class; 
       latitude.setValue(32.806673); 
       locationObj.addProperty(latitude); 

     PropertyInfo longitude = new PropertyInfo(); 
       longitude.name="Longitude"; 
       longitude.type=Double.class; 
       longitude.setValue(-86.791133); 

     locationObj.addProperty(longitude); 
     requestObj.addSoapObject(locationObj); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
     envelope.setOutputSoapObject(requestObj); 
     envelope.dotNet = false; 
     envelope.bodyOut = request; 
     envelope.encodingStyle = SoapSerializationEnvelope.XSD; 
     int timeout = 60000; 
    String URL="www..........wsdl"; 
     httpTransportSE = new HttpTransportSE(URL, 
     timeout); 
     httpTransportSE.debug = true; 
     Log.v("request", request.toString()); 
     httpTransportSE.call(actionName, envelope); 

Espero que esto pueda ayudar u

Gracias, Chaitanya

Cuestiones relacionadas