我有以下代码来从SOAP Web服务获取响应。
这是我在SOAPUI中的SOAP请求
<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>
这是我在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 & 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>
谁能告诉我为什么我没有通过代码在SOAPUI bt中获得成功。
我已经提到了许多SO链接,但无法解决我的问题。
提前致谢。
长期面对此问题后,我找到了解决方案。任何人都可以尝试一下,因为它对我有用。
我对上述问题的解决方案:
首先txt file,{%key%}无论您要在何处动态添加参数,我都做出了类似SOAP Request的请求。制作此txt文件,并将其放入raw文件夹创建的res文件夹中。现在您将具有yourfilename.txt如下所示的外观:
txt file
{%key%}
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文件中执行以下代码,以访问Right Response:
您将通过调用以下方法获得响应:
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 Request参数或任何其他事情。因为您正在传递与XML相同的请求,例如SOAPUI工具正在传递。
现在,您具有所需的正确响应。
希望它对其他人也有用。