5

KSoap2 ライブラリを使用して android で wsdl webservices を呼び出す 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>

私はこの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

Soap Object で soap Request dump の上を渡す方法を教えてください。

よろしく、 スリニバス

4

3 に答える 3

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リクエストを送信するには、独自のトランスポートクラスを作成する必要があります。

または、を使用して手動でリクエストを送信し( Androidでの双方向認証SSLソケットにクライアント/サーバー証明書を使用するDefaultHttpClientを参照)、応答を解析するためだけに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;
    }
  }
于 2011-06-17T08:12:48.010 に答える
0

これを行うには、独自のxmlジェネレータークラスを作成する必要があります。私も同じ手順を使用しています。ksoap2ライブラリを逆コンパイルし、それらがどのように生成するかを調べ、必要に応じて変更します。

于 2011-06-17T07:51:46.787 に答える
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);

これがあなたに役立つことを願っています

ありがとう、Chaitanya

于 2012-07-17T04:29:01.060 に答える