سؤال

أنا جديد على خدمات الويب 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

آمل أن يساعدك هذا

شكرًا ، شيتانيا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top