How to send a soap request in Android?

I am new to WSDL web services using KSoap2 library to call wsdl web services in android.

This is my soap request dump

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

I pass this SopaObject as:

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

Here I pass the latitude and longitude values ​​directly to OfferByLocation, I have to go through the Location element. Please help how to pass parameters through Location.

I tried with the procedure described above, but I get an error

 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: org.kxml2.kdom.Node@44f6ddc0 

Please, can someone tell me how to go above the soap? Request dump in Soap object?

Regards, Srinivas

+5
source share
3 answers

You can also manually create an XML request and send it to kSOAP to send and process responses. You can write your XML query using soapUI and then save them in res/raw with keywords such as {%key%} , where the parameters should be placed at runtime. Here is the code to replace the keywords:

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

To send your own XML request using kSOAP, you need to create your own transport class.

Or you can send the request manually using DefaultHttpClient (see Using client / server certificates for two-way authentication of the SSL socket on Android ) and use kSOAP only to parse the response.

  /** * 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; } } 
+5
source

To do this, you need to create your own xml generator class. I also use the same procedure. decompile the ksoap2 library and learn how they generate and modify it as needed.

0
source

You can use this.

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

Hope this helps u

Thanks Chaitanya

0
source

All Articles