كيفية إرسال طلب الصابون في الروبوت؟
-
28-10-2019 - |
سؤال
أنا جديد على خدمات الويب WSDL، باستخدام مكتبة KSoap2 للاتصال بخدمات الويب wsdl في نظام التشغيل Android.
هذا هو تفريغ طلب الصابون الخاص بي
<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>
أقوم بتمرير 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);
أقوم هنا بتمرير قيم خطوط الطول والعرض مباشرة إلى OffersByLocation، ويجب أن أقوم بالمرور عبر موقع العنصر.من فضلك هل يمكن لأي أحد أن يساعد في كيفية تمرير المعلمات من خلال الموقع.
لقد حاولت مع الإجراء أعلاه ولكنني أتلقى خطأً في القول
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
من فضلك هل يمكن لأحد أن يقول لي كيفية تمرير طلب تفريغ الصابون فوق كائن الصابون؟
التحيات ، سرينيفاس
المحلول
يمكنك أيضًا إنشاء طلب XML يدويًا وإرساله إلى kSOAP للإرسال ومعالجة الاستجابة.يمكنك كتابة طلبك بتنسيق XML باستخدام SoapUI، ثم حفظه فيه 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;
}
لإرسال طلب XML مخصص باستخدام kSOAP، يلزمك إنشاء فئة النقل الخاصة بك.
أو يمكنك إرسال الطلب يدويًا باستخدام DefaultHttpClient
(يرى استخدام شهادات العميل/الخادم لمقبس SSL للمصادقة الثنائية على نظام Android)، واستخدم 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;
}
}
نصائح أخرى
يتعين عليك إنشاء فئة منشئ xml الخاص بك للقيام بذلك.أنا أيضا أستخدم نفس الإجراء.فك مكتبة ksoap2 ودراسة كيفية إنشائها وتغييرها كما تريد ..
يمكنك استخدام مثل هذا Genacodicetagpre
آمل أن يساعدك هذا
شكرًا ، شيتانيا