How to send a soap request in android?
-
I am new to WSDL webservices , using KSoap2 library to call wsdl webservices 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 am passing this SopaObject like : 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 am passing latitude and longitude values directly to OffersByLocation , I should pass through element Location . Please can any one help how to pass parameters through Location . I have tried with above procedure but am getting error saying 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 any one tell me how to pass above soap Request dump in Soap Object ? Regards, Srinivas
-
Answer:
You can also manually construct the request XML, and send it to kSOAP for sending and response processing. You can write your request XML using soapUI, then save them in res/raw with keywords like {%key%} where parameters should be placed at runtime. Here is the code for replacing 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 custom XML request with kSOAP you need to make your own Transport class. Or you can send the request manually using DefaultHttpClient (see http://stackoverflow.com/questions/4064810/using-client-server-certificates-for-two-way-authentication-ssl-socket-on-android/5951605#5951605), and use kSOAP just for parsing 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; } }
Srinivas at Stack Overflow Visit the source
Other answers
You have to make your own xml generator class to do that. I am also using the same procedure. decompile the ksoap2 library and study the how they generate and change it as you required..
Hamdullah shah
I have provided a few tutorials on using kSOAP with Android. I hope one of them helps. In particular you might want to check the ones on passing complex objects and passing simple object leveraging RPC styled WSDLs. http://roderickbarnes.com/blog/category/technology/web-services-technology The comments in my code should shed a little light on the bigger idea.
Roderick
Related Q & A:
- How To Send a Complex Object to a Rest Web Service?Best solution by codeproject.com
- How to modify a SOAP request?Best solution by Stack Overflow
- How to send a demo to a record label?Best solution by Yahoo! Answers
- How to send a photo to a phone from my computer?Best solution by Yahoo! Answers
- How to send a friend request?Best solution by Yahoo! Answers
Just Added Q & A:
- How many active mobile subscribers are there in China?Best solution by Quora
- How to find the right vacation?Best solution by bookit.com
- How To Make Your Own Primer?Best solution by thekrazycouponlady.com
- How do you get the domain & range?Best solution by ChaCha
- How do you open pop up blockers?Best solution by Yahoo! Answers
For every problem there is a solution! Proved by Solucija.
-
Got an issue and looking for advice?
-
Ask Solucija to search every corner of the Web for help.
-
Get workable solutions and helpful tips in a moment.
Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.