未获得SOAP Web服务的正确响应编程方式 [英] Not Getting Correct Response of SOAP Web service Programatically

查看:430
本文介绍了未获得SOAP Web服务的正确响应编程方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的code,以获得从SOAP web服务的响应。

I have the Following Code to Get the Response from SOAP Webservice.

下面是SOAPUI我的SOAP请求

Here is My SOAP Request in 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>

下面是响应我得到的SOAPUI

Here is the Response I am getting in 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>

和最后这里是我的code,我所做的得到这个数据。

And Finally here is my Code that I have done to get this Data.

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

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

After Executing the above code i am getting Following Error:

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

谁能告诉我为什么我收到成功SOAPUI BT不是通过我的code。

Can Anyone Tell me why i am getting Success in SOAPUI bt not through my code.

我刚才提到很多SO链接,但没能解决我的问题。

I have referred many SO link but not able to solve my Problem.

在此先感谢。

推荐答案

面对这个问题很长一段时间,我已经找到解决这个之后。任何一个可以尝试一下它的工作对我来说完全没有问题。

After Facing this Issue for a Very Long time I have found Solution to this. Any one can try it out as its Works for me Perfectly fine.

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

首先,我已经做了 TXT文件同样喜欢SOAP请求与 {%键%} 无论你想添加参数动态。使这个txt文件,并把它变成创建的文件夹 RES 文件夹。现在你将有 yourfilename.txt 的样子如下:

Firstly i have made an txt file same like SOAP Request with {%key%} wherever you want to add the Parameters Dynamically. make this txt file and put it into raw folder created res folder. Now you will have the yourfilename.txt as looks like below :

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

,现在你会做code像下面你的java文件来访问正确的回应里面:

And Now you will do Code as like Below inside your java file to access the Right Response :

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

you will get response with Calling the Below Method :

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作为请求像SOAPUI工具传递。

Now you will not have to worry about the ComplexType Request parameter or Any other thing. Because you are passing the Same formate with XML as Request as Like SOAPUI tool is Passing.

现在你有正确的反应,你想要的。

Now you have the correct Response that you want.

希望这会为别人打工也。

Hope it will Work for others Also.

这篇关于未获得SOAP Web服务的正确响应编程方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆