Sri*_*vas 5 android android-ksoap2
我是WSDL webservices的新手,使用KSoap2库在android中调用wsdl webservices.
这是我的soap请求转储
<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>
Run Code Online (Sandbox Code Playgroud)
我正在传递这个SopaObject,如:
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);
Run Code Online (Sandbox Code Playgroud)
这里将纬度和经度值直接传递给OffersByLocation,我应该通过元素Location.请任何人都可以帮助如何通过位置传递参数.
我已尝试过以上程序,但我得到错误说
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
Run Code Online (Sandbox Code Playgroud)
请任何人告诉我如何在Soap对象中传递上面的SOAP Request转储?
此致,Srinivas
您还可以手动构造请求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;
}
Run Code Online (Sandbox Code Playgroud)
要使用kSOAP发送自定义XML请求,您需要创建自己的Transport类.
或者您可以使用手动发送请求DefaultHttpClient(请参阅在Android上使用客户端/服务器证书进行双向身份验证SSL套接字),并仅使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12482 次 |
| 最近记录: |