如何在android中发送soap请求?

时间:2011-06-17 06:43:22

标签: android android-ksoap2

我是WSDL webservices的新手,使用KSoap2库在android中调用wsdl webservices。

这是我的肥皂请求转储

<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,我应该通过元素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

请任何人告诉我如何在Soap对象中传递上面的SOAP Request转储?

此致 SRINIVAS

3 个答案:

答案 0 :(得分:5)

您还可以手动构建请求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手动发送请求(请参阅Using client/server certificates for two way authentication SSL socket on 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;
    }
  }

答案 1 :(得分:0)

您必须创建自己的xml生成器类才能执行此操作。我也在使用相同的程序。反编译ksoap2库并研究它们如何生成并根据需要进行更改。

答案 2 :(得分:0)

你可以这样使用。

SoapObject requestObj=new SoapObject(NAMESPACE,"GetOffersByLocation");

SoapObject locationObj=new SoapObject(NAMESPACE,"Location");

 PropertyInfo latitude = new PropertyInfo();
                  latitude.name="Latitude";
                 latitude.type=Double.class;
                 latitude.setValue(32.806673);
                locationObj.addProperty(latitude);

       PropertyInfo longitude = new PropertyInfo();
                longitude.name="Longitude";
                longitude.type=Double.class;
                longitude.setValue(-86.791133);

       locationObj.addProperty(longitude);
       requestObj.addSoapObject(locationObj);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.setOutputSoapObject(requestObj);
        envelope.dotNet = false;
        envelope.bodyOut = request;
        envelope.encodingStyle = SoapSerializationEnvelope.XSD;
         int timeout = 60000;
     String URL="www..........wsdl";
         httpTransportSE = new HttpTransportSE(URL,
         timeout);
         httpTransportSE.debug = true;
         Log.v("request", request.toString());
         httpTransportSE.call(actionName, envelope);

我希望这可以帮助你

谢谢, 切塔尼亚