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; } }
peceps
source share