【问题标题】:How to send a soap request in android?如何在android中发送soap请求?
【发布时间】:2011-06-17 06:43:22
【问题描述】:

我是 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 。请任何人帮助如何通过 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

请谁能告诉我如何在肥皂对象中传递上述肥皂请求转储?

问候, 斯里尼瓦斯

【问题讨论】:

    标签: android android-ksoap2


    【解决方案1】:

    您也可以手动构造请求 XML,并将其发送到 kSOAP 进行发送和响应处理。您可以使用soapUI 编写您的请求XML,然后使用{%key%} 等关键字将它们保存在res/raw 中,其中应在运行时放置参数。 下面是替换关键字的代码:

    // 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 请求,您需要创建自己的传输类。

    或者您可以使用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;
        }
      }
    

    【讨论】:

    • Peceps 我无法理解上面的内容,因为我是 android 的新手。请提供任何参考或示例。
    【解决方案2】:

    您必须创建自己的 xml 生成器类才能做到这一点。我也在使用相同的程序。反编译 ksoap2 库并研究它们如何生成并根据需要更改它..

    【讨论】:

    • 你能详细说明你在说什么吗?
    【解决方案3】:

    你可以这样使用。

    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);
    

    希望对你有帮助

    谢谢, 柴坦尼亚

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多