使用改进的android调用WSDL Web服务

时间:2014-10-07 15:08:58

标签: android web-services wsdl retrofit

我正在尝试在我的应用程序中使用retrofit来调用WSDL webservice

像这样

public static String callWebservice(String username,String password)
    {

        String soapMessage="<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
                "<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
                "<Body>"+
                "<AuthenticateUser xmlns=\"http://tempuri.org/\">"+
                "<userName>"+username+"</userName>"+
                "<password>"+Helper.md5(password).toUpperCase(Locale.getDefault())+"</password>"+
                "</AuthenticateUser>"+
                "</Body>"+
                "</Envelope>";

        RequestInterceptor requestInterceptor = new RequestInterceptor() {
              @Override
              public void intercept(RequestFacade request) {
               // request.addHeader("User-Agent", "Retrofit-Sample-App");
                request.addHeader("SOAPAction", "http://tempuri.org/IAuthenticate/AuthenticateUser");
                request.addHeader("Content-Type", "application/soap+xml;charset=utf-8");
                request.addHeader("Content-Type", "text/xml;charset=utf-8");
              }
            };

            RestAdapter restAdapter = new RestAdapter.Builder()
              .setEndpoint(Constants.WEBSERVICE_URL)
              .setRequestInterceptor(requestInterceptor)
              .build();

            LoginApi loginApi=restAdapter.create(LoginApi.class);

            loginApi.getLogin(soapMessage,new Callback<String>() 
            {

                @Override
                public void success(String arg0, Response arg1)
                {

                    Helper.Log("Response==>", arg0);

                }

                @Override
                public void failure(RetrofitError arg0) 
                {
                    Helper.Log("error==>", arg0.toString());

                }
            });

            return "";
        }

但我得到了例外

retrofit.RetrofitError:400 Bad Request

如果我尝试使用post post请求相同的代码,它可以正常工作。


StringBuffer stringResponse = new StringBuffer();
        try {


            HttpURLConnection connection;
            connection =  (HttpURLConnection)new URL(Constants.WEBSERVICE_URL).openConnection();
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setConnectTimeout(20000);
            connection.setReadTimeout(20000);
            connection.setRequestProperty("SOAPAction", "http://tempuri.org/IAuthenticate/AuthenticateUser");
            connection.setRequestProperty("Content-Type", "application/soap+xml;charset=utf-8");
            connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
            //connection.setRequestProperty("Accept-Encoding", "gzip");
            connection.setRequestProperty("Content-Length", "" + soapMessage.length());
            connection.setFixedLengthStreamingMode(soapMessage.length());
            connection.setRequestMethod("POST");
            OutputStream os = connection.getOutputStream();
            os.write(soapMessage.getBytes("UTF-8"), 0, soapMessage.length());
            os.flush();
            os.close();
            int status = connection.getResponseCode();

            if(status==200)
            {

                BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream()), 8 * 1024);
                String line = null;
                while ((line = reader.readLine()) != null)
                {
                    stringResponse.append(line);
                }
                Helper.Log("Response==>", stringResponse.toString());
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

请帮忙......

1 个答案:

答案 0 :(得分:-1)

你为什么不尝试ksoap。它非常棒。我根据自己的应用对其进行了自定义,但您可以从here访问该库。这是我如何使用我的自定义版本的ksoap我喜欢称为minisoap。这是一个样本

 void fetch() {
    MiniSoap soap_client = new MiniSoap(URL, NAMESPACE, METHOD);
    soap_client.addProperty("", "");
    soap_client.addProperty("", "");
    //true for Dotnet and false for other webservices
    soap_client.queryWS(IS_DOTNET, TIMEOUT);
    //if you just wish to test/view results
    System.out.println(soap_client.envelope.bodyIn);
    // or you can get them from a list
    List<String> responce = soap_client.full_report;
    // or like this
    List<String> response_2 = soap_client.results;
    // or you can get the xml results
    String xml_request = soap_client.androidHttpTransport.requestDump;
    String xml_response = soap_client.androidHttpTransport.responseDump;
}

你可以从here获得一份minisoap副本,我希望不会太晚。