您还可以手动构造请求XML,并将其发送到kSOAP进行发送和响应处理。您可以使用soapUI编写请求XML,然后将它们保存在res/raw
与关键字类似{%key%}
运行时参数应放置在何处。
下面是替换关键字的代码:
// 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;
}
要使用 kSOAP 发送自定义 XML 请求,您需要创建自己的 Transport 类。
或者您可以使用手动发送请求DefaultHttpClient
(see 在 Android 上使用客户端/服务器证书进行双向身份验证 SSL 套接字 https://stackoverflow.com/questions/4064810/using-client-server-certificates-for-two-way-authentication-ssl-socket-on-android/5951605#5951605),并使用 kSOAP 仅用于解析响应。
/**
* 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;
}
}