2013-02-06 53 views
2

我有以下代码以从SOAP Webservice获取响应。以编程方式获得SOAP Web服务的正确响应

这里是SOAPUI

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test.login/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <test:Login> 
     <!--Optional:--> 
     <arg0>best_buyer_editor</arg0> 
     <!--Optional:--> 
     <arg1>welcome</arg1> 
     <!--Optional:--> 
     <arg2>Mobile</arg2> 
     </test:Login> 
    </soapenv:Body> 
</soapenv:Envelope> 

我的SOAP请求这里是我在SOAPUI

越来越
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <ns2:LoginResponse xmlns:ns2="http://test.login/"> 
     <return>{"LoginDetails":{"Result":"Success","UserName":"Best Buyer Editor","token":"M7M5RMQU6","rolelist":["buyer_editor","admin_role"],"parties":[{"partynumber":"BEST","type":"self","sites":[{"companyname":"www.bestmanufacture.com","sitecode":"BESTTXUSA-1","siteaddress":"225 E Industrial Blvd Waco USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYUSA-5","siteaddress":"20 Milburn St Buffalo USA"},{"companyname":"Best Engineers Manufacturing USA Inc","sitecode":"BESTHQ","siteaddress":"8976, Hope vision Lane Simple City USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYUSA-6","siteaddress":"Cedar &amp; Ellicott Sts Batavia USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTTXUSA-2","siteaddress":"9700 Richmond Ave Ste 201 Houston USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTTXUSA-4","siteaddress":"3315 Ashlock Dr Houston USA"},{"companyname":"Best Engineers Manufacturing USA Inc","sitecode":"BESTWH","siteaddress":"1021, Industrial Bolevar San Macros City USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYMEX-10","siteaddress":"271 Madison Ave Ste 1003 New York USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYUSA-8","siteaddress":"271 Madison Ave Ste 1003 New York USA"},{"companyname":"Best Engineers Manufacturing Europe Inc","sitecode":"BESTMO","siteaddress":"789,Future Vision Towers London GBR"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYUSA-7","siteaddress":"1580 Columbia Tpke Ste 5 Castleton On Hudson USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTNYMEX-9","siteaddress":"271 Madison Ave Ste 1003 New York USA"},{"companyname":"www.bestmanufacture.com","sitecode":"BESTTXUSA-3","siteaddress":"2821 Lackland Rd Ste 340 Fort Worth USA"}]},{"partynumber":"DHL","type":"sponsors","sites":[{"companyname":"www.dhl.com","sitecode":"DHLTXUSA-2","siteaddress":"11311 N Central Expy Dallas USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYUSA-7","siteaddress":"150 W 22nd St Fl 5 New York USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYMEX-9","siteaddress":"One Markin Lane Wyoming USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYUSA-6","siteaddress":"12685 State Route 38 Berkshire USA"},{"companyname":"www.dhl.com","sitecode":"DHLTXUSA-4","siteaddress":"2221 Canada Dry St Houston USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYUSA-5","siteaddress":"521 5th Ave Rm 2130 New York USA"},{"companyname":"www.dhl.com","sitecode":"DHLTXUSA-1","siteaddress":"6505 N Houston Rosslyn Rd Houston USA"},{"companyname":"www.dhl.com","sitecode":"DHLTXUSA-3","siteaddress":"9405 N County Road 2000 Lubbock USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYMEX-10","siteaddress":"One Markin Lane Wyoming USA"},{"companyname":"www.dhl.com","sitecode":"DHLNYUSA-8","siteaddress":"One Markin Lane Wyoming USA"}]},{"partynumber":"UPS","type":"sponsors","sites":[{"companyname":"www.ups.com","sitecode":"UPSTXUSA-3","siteaddress":"1455 West Loop S Houston USA"},{"companyname":"www.ups.com","sitecode":"UPSNYUSA-8","siteaddress":"1050 Hook Rd Farmington USA"},{"companyname":"www.ups.com","sitecode":"UPSNYMEX-10","siteaddress":"1050 Hook Rd Farmington USA"},{"companyname":"www.ups.com","sitecode":"UPSNYUSA-7","siteaddress":"1400 Broadway Fl 2 New York USA"},{"companyname":"www.ups.com","sitecode":"UPSTXUSA-4","siteaddress":"14902 Sommermeyer St Ste 100 Houston USA"},{"companyname":"www.ups.com","sitecode":"UPSNYMEX-9","siteaddress":"1050 Hook Rd Farmington USA"},{"companyname":"www.ups.com","sitecode":"UPSNYUSA-6","siteaddress":"101 Cranbrook Ext Tonawanda USA"},{"companyname":"www.ups.com","sitecode":"UPSNYUSA-5","siteaddress":"290 Barrett Hill Rd Mahopac USA"},{"companyname":"www.ups.com","sitecode":"UPSTXUSA-2","siteaddress":"11308 Midmorning Dr Austin USA"},{"companyname":"www.ups.com","sitecode":"UPSTXUSA-1","siteaddress":"3900 Harrisburg Blvd Houston USA"}]},{"partynumber":"HDEPO","type":"sponsors","sites":[{"companyname":"Home Depot USA.","sitecode":"HDEPOWH","siteaddress":"55031 Hdepo WH Road Bossier City USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYUSA-8","siteaddress":"166 Haverford Rd Hicksville USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPOTXUSA-4","siteaddress":"4901 Blaffer St Houston USA"},{"companyname":"Home Depot USA.","sitecode":"HDEPOHQ","siteaddress":"5031 Hdepo HQ Road Bossier City USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYMEX-9","siteaddress":"166 Haverford Rd Hicksville USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYUSA-6","siteaddress":"1790 Broadway Ste 702 New York USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPOTXUSA-3","siteaddress":"2203 Timberloch Pl Ste 252 The Woodlands USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYMEX-10","siteaddress":"166 Haverford Rd Hicksville USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYUSA-5","siteaddress":"1040 Avenue Of The Americas New York USA"},{"companyname":"Home Depot USA.","sitecode":"HDEPOMO","siteaddress":"5031 Hdepo MO Road Bossier City USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPOTXUSA-1","siteaddress":"14603 Chrisman Rd Houston USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPOTXUSA-2","siteaddress":"16103 University Oak San Antonio USA"},{"companyname":"www.homeDepot.com","sitecode":"HDEPONYUSA-7","siteaddress":"392 Pulteney St Corning USA"}]},{"partynumber":"GWILL","type":"sponsors","sites":[{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYMEX-9","siteaddress":"3300 Northern Blvd Fl 2 Long Island City USA"},{"companyname":"GoodWill Supplies and Construction","sitecode":"GWILLHQ","siteaddress":"543, Light Ray Street Wellknown city In"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYMEX-10","siteaddress":"3300 Northern Blvd Fl 2 Long Island City USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYUSA-7","siteaddress":"1800 New Hwy Farmingdale USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYUSA-8","siteaddress":"3300 Northern Blvd Fl 2 Long Island City USA"},{"companyname":"GoodWill Supplies and Construction","sitecode":"GWILLMO","siteaddress":"6789, Engineering Laner Large city GBR"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLTXUSA-2","siteaddress":"945 McKinney St # 237 Houston USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYUSA-6","siteaddress":"580 Broadway Menands USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLTXUSA-3","siteaddress":"6921 Olson Ln Pasadena USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLTXUSA-1","siteaddress":"7075 Ranch Road 2338 Georgetown USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLTXUSA-4","siteaddress":"3839 Dilido Rd Dallas USA"},{"companyname":"www.goodwillconstruct.com","sitecode":"GWILLNYUSA-5","siteaddress":"1 Radisson Plz Ste 803 New Rochelle USA"},{"companyname":"GoodWill Supplies and Construction","sitecode":"GWILLHQ","siteaddress":"543, Light Ray Street Wellknown city USA"},{"companyname":"GoodWill Supplies and Construction","sitecode":"GWILLWH","siteaddress":"2345, Well formed lane Hope in city USA"}]},{"partynumber":"FEDEX","type":"sponsors","sites":[{"companyname":"www.fedex.com","sitecode":"FEDEXTXUSA-2","siteaddress":"400 Langford St Clint USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYUSA-8","siteaddress":"3736 Kellogg Rd Cortland USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXTXUSA-4","siteaddress":"5025 East Business 20 Abilene USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYUSA-5","siteaddress":"637 New Loudon Rd Ste 2 Latham USA"},{"companyname":"Fedex USA.","sitecode":"FEDEXWH","siteaddress":"6754 Fedex WH Road Fedex City USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXTXUSA-1","siteaddress":"4305 N Interstate 35 Denton USA"},{"companyname":"Fedex USA.","sitecode":"FEDEXHQ","siteaddress":"7800 Fedex HQ Road Bossier City USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXTXUSA-3","siteaddress":"14444 Stuebner Airline Rd Houston USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYMEX-10","siteaddress":"3736 Kellogg Rd Cortland USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYUSA-7","siteaddress":"65 Old Indian Rd Milton USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYMEX-9","siteaddress":"3736 Kellogg Rd Cortland USA"},{"companyname":"Fedex USA.","sitecode":"FEDEXMO","siteaddress":"9600 Fedex MO Road Bossier City USA"},{"companyname":"www.fedex.com","sitecode":"FEDEXNYUSA-6","siteaddress":"1254 Erie Ave North Tonawanda USA"}]}]}}</return> 
     </ns2:LoginResponse> 
    </soap:Body> 
</soap:Envelope> 

终于在这里是我的代码,我所做的得到这个数据的响应。

URL = "http://test.tpsynergy.com:8080/tpsynergy/services/login"; 
SOAP_ACTION = "http://test.tpsynergy.com:8080/tpsynergy/services/login"; 
METHOD = "Login"; 
NAMESPACE = "http://test.login/"; 
SoapObject request = new SoapObject(NAMESPACE, "Login"); 
request.addProperty("arg0", "best_buyer_editor"); 
request.addProperty("arg1", "welcome"); 
request.addProperty("arg2", "Mobile"); 

Log.i(TAG, "Request for getting airport list" + request.toString()); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.setOutputSoapObject(request); 
envelope.dotNet = true; 
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
try { 
    androidHttpTransport.call(SOAP_ACTION, envelope); 

    if (envelope.bodyIn instanceof SoapFault) { 
       String str= ((SoapFault) envelope.bodyIn).faultstring; 
       Log.i("", str); 


    } else { 
       SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn; 
       response = resultsRequestSOAP.getProperty(0).toString(); 

       Log.i(" Login Webservice Response", "Responce ---->" 
         + (resultsRequestSOAP.getProperty(0).toString())); 
      } 

    } catch (Exception e) { 

      Log.i(TAG, "Exception e" + e.toString()); 
     } 

执行上面的代码后,我收到以下错误:

Unmarshalling Error: unexpected element (uri:"http://test.login/", local:"arg0"). Expected elements are <{}arg2>,<{}arg1>,<{}arg0> 

谁能告诉我,为什么我没有BT通过我的代码获得成功的SOAPUI。

我已经提到了许多SO链接,但无法解决我的问题。

在此先感谢。

+0

查看响应对象的创建... – Hemanth

回答

2

在面对这个问题很长一段时间后,我找到了解决方案。任何人都可以尝试它作为我的作品完美无瑕。

我对上述问题的解决方案:

首先,我做了一个txt file同样喜欢SOAP请求与{%key%}无论你想添加的参数进行动态。使这个txt文件并把它放到raw文件夹中创建res文件夹。现在你将有yourfilename.txt如看起来象下面这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test.login/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <test:Login> 
     <!--Optional:--> 
     <arg0>{%arg0%}</arg0> 
     <!--Optional:--> 
     <arg1>{%arg1%}</arg1> 
     <!--Optional:--> 
     <arg2>{%arg2%}</arg2> 
     </test:Login> 
    </soapenv:Body> 
</soapenv:Envelope> 

,现在你会做代码像下面你的java文件访问正确的反应中:

你会得到响应与调用下面的方法:

response = new sendSoapRequest(
         getApplicationContext(), yourargument1, yourargument2, yourargument3); 

与包含如下方法:

/** 
    * 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 String sendSoapRequest(Context c, String arg0, String arg1, 
      String arg2) throws Exception { 


URL = "PASTE YOUR WS URL";//"http://test.tpsynergy.com:8080/tpsynergy/services/login"; 
     String FinalString = getStringFromRaw(c); 
     Log.i("TAG", "*********************** FinalString Before " 
       + FinalString); 

     FinalString = getFinalString(FinalString, arg0, arg1, arg2); 

     Log.i("TAG", "***********************After Finallyyy : FinalString " 
       + FinalString); 

     // send SOAP request 
     InputStream responseIs = sendRequest(FinalString); 

     // create the response SOAP envelope 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 

     // process SOAP response 
     parseResponse(responseIs, envelope); 

     Object bodyIn = envelope.bodyIn; 

     SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn; 
     String response = resultsRequestSOAP.getProperty(0).toString(); 

     Log.i(" Login Webservice Response", 
       "Responce ---->" + response.toString()); 

     // 

     if (bodyIn instanceof SoapFault) { 
      throw (SoapFault) bodyIn; 
     } 

     return response.toString(); 
    } 

    public String getFinalString(String ABC, String arg0, String arg1, 
      String arg2) { 
     // parse the template and replace all keywords 

     HashMap<String, String> hashMap = new HashMap<String, String>(); 

     hashMap.put("arg0", arg0); 
     hashMap.put("arg1", arg1); 
     hashMap.put("arg2", arg2); 

     StringBuffer sb = new StringBuffer(); 
     try { 
      // find all keywords 
      Pattern patern = Pattern.compile("\\{%(.*?)%\\}"); 
      Matcher matcher = patern.matcher(ABC); 

      while (matcher.find()) { 
       String keyName = matcher.group(1); 

       Log.i("LOG_TAG", "Key Name" + keyName); 
       String keyValue = hashMap.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; 
     } 
    } 

    private String getStringFromRaw(Context c) throws IOException { 
     Resources r = c.getResources(); 
     InputStream is; 
     if (MainActivity.PRODUCTION) { 
      Log.i(TAG, "Inside Production Raw File"); 
      is = r.openRawResource(R.raw.logininfoproduction); 
     } else { 
      Log.i(TAG, "Inside Test Raw File"); 
      is = r.openRawResource(R.raw.logininfotest); 
     } 

     String statesText = convertStreamToString(is); 
     is.close(); 
     return statesText; 
    } 

    private String convertStreamToString(InputStream is) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     int i = is.read(); 
     while (i != -1) { 
      baos.write(i); 
      i = is.read(); 
     } 
     return baos.toString(); 
    } 

    /** 
    * 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(URL); 
      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; 
     HttpClient httpClient = new DefaultHttpClient(); 
     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; 
     } 
     return null; 
    } 

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

     } 

    } 

现在您不必担心ComplexType请求参数或其他任何事情。 因为您正在传递与XML相同的formate,就像SOAPUI工具正在传递一样。

现在你有了你想要的正确答案。

希望它会为别人工作也。

0

我在另一个重复问题中添加了以下评论,但如果您错过了它,

使用TCP监视器来检查发送的SOAP请求是什么。我怀疑根据错误消息,元素arg *限定了命名空间,因为webservice并不期望他们那样。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test.login/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <test:Login> 
     <!--Optional:--> 
     <test:arg0>best_buyer_editor</test:arg0> 
     <!--Optional:--> 
     <test:arg1>welcome</test:arg1> 
     <!--Optional:--> 
     <test:arg2>Mobile</test:arg2> 
     </test:Login> 
    </soapenv:Body> 
</soapenv:Envelope>