Search code examples
androidweb-servicessoapnamespacesksoap2

Making a SoapRequest object using Namespaces in android


I am working on a project where i have to make a SOAP Request object from the following code:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mod="http://www.tmforum.org/xml/tip/model" xmlns:prob="http://www.tmforum.org/xml/tip/cbe/problem" xmlns:geo="http://www.tmforum.org/xml/tip/cbe/loc/geo" xmlns:loc="http://www.tmforum.org/xml/tip/cbe/loc" xmlns:tt="http://www.tmforum.org/xml/tip/cbe/tt" xmlns:ent="http://www.tmforum.org/xml/tip/internal/entity" xmlns:ext="http://www.tmforum.org/xml/tip/cbe/problem/extensions">
   <soapenv:Header/>
   <soapenv:Body>
      <mod:retrieveProblemRequest>
         <!--Optional:-->
         <mod:customerProblem>
            <!--Optional:-->
            <prob:problemId>0005004426</prob:problemId>

         </mod:customerProblem>
      </mod:retrieveProblemRequest>
   </soapenv:Body>
</soapenv:Envelope>

I am using KSOAP2 to make request object but suffereing a problem in assigning namespaces, so the request sent is always incorrect.

Kindly provide me the Code to convert this SoapRequest into SoapObject in android..

EDIT: my code is as follows:

private static String SOAP_ACTION1 = "/BusinessServices/Inbound/TIP_R4GCanonicalModel_model_problemservicev1dot3-service0.serviceagent/ProblemServiceV1dot3Endpoint0/retrieveProblem";
    private static String REQUEST_TARGET_NAMESAPCE="http://xmlns.example.com/1362214927265/";
    private static String TARGET_NAMESPACE_MOD = "http://www.tmforum.org/xml/tip/model/";
    private static String NAMESPACE_PROB="http://www.tmforum.org/xml/tip/cbe/problem/";
    private static String METHOD_NAME = "retrieveProblem";
    private static String URL = "http://10.128.28.44:10005/BusinessServices/Inbound/ProblemService_proxy.serviceagent/ProblemServiceV1dot3Endpoint0";
public static String LOG_TAG = "SOAPRequestResponseActivity";


    @Override
    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            btnFar = (Button) findViewById(R.id.btnFar);
        btnFar.setOnClickListener(new View.OnClickListener()

        {
            @Override
            public void onClick(View v)

            {

                // Initialize soap request + add parameters

                SoapObject request = new SoapObject(REQUEST_TARGET_NAMESAPCE,METHOD_NAME);

                SoapObject retrieveInfo=new SoapObject(TARGET_NAMESPACE_MOD,"retrieveProblemRequest");

                SoapObject customerObject=new SoapObject(TARGET_NAMESPACE_MOD, "customerProblem");

                PropertyInfo info=new PropertyInfo();
                info.setNamespace(NAMESPACE_PROB);
                info.setName("problemId");
                info.setValue("0005004426");

                customerObject.addProperty(info);
                retrieveInfo.addSoapObject(customerObject);
                request.addSoapObject(retrieveInfo);

   Log.i(LOG_TAG, "===Request soap object after params=="
                        + request.toString());

                // Declare the version of the SOAP request

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);


                envelope.implicitTypes=true;
                envelope.setOutputSoapObject(request);

                try {

                    HttpTransportSE androidHttpTransport = new HttpTransportSE(
                            URL);



                    ArrayList<HeaderProperty> headerProperty = new ArrayList<HeaderProperty>();

                    headerProperty.add(new HeaderProperty("SOAPAction", "/BusinessServices/Inbound/TIP_R4GCanonicalModel_model_problemservicev1dot3-service0.serviceagent/ProblemServiceV1dot3Endpoint0/retrieveProblem"));

                    androidHttpTransport.call(SOAP_ACTION1, envelope,headerProperty);

As Soon As Call methode is called it throws Exception HttpRequestFailed with error code 500.Since the request is incorrect somewhere server is not able to parse it.

Kindly provide me appropriate solution.


Solution

  • I came across a library named ksoap2-android which is very helpful you can try this .Here is the class file i used to call web methods

     public class CallSOAP {
    
    private String SOAP_ACTION="your action url";
    private String OPERATION_NAME="";//The web method OR web service you are going to call
    private final String WSDL_TARGET_NAMESPACE=SOAP_ACTION;
    private  final String SOAP_ADDRESS=Configuration.WEB_SERVICE_URL;//ip-address of serever where you host your service 
    private Exception exception;
    private String ErrorMsg="";
    private String TERST_URL="" ;
    public Object call(String MethodeName,ArrayList<PropertyInfo> Parameters){
    
      this.OPERATION_NAME=MethodeName;
      SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
     if(Parameters != null && Parameters.size()>0){
       for(PropertyInfo propertyInfo : Parameters){
          request.addProperty(propertyInfo);
     }
    }
    
    SoapSerializationEnvelope  envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet= true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE httpTransport =null;
    if(!this.TERST_URL.equals(""))
      httpTransport = new HttpTransportSE(this.TERST_URL);
    else
      httpTransport = new HttpTransportSE(SOAP_ADDRESS);
     Object Response =null;
     try{
        httpTransport.call(SOAP_ACTION+OPERATION_NAME, envelope);
        Response=envelope.getResponse();
      }
     catch (SocketTimeoutException ex) {
         this.ErrorMsg="Unable to connect";
          Response=null;
         this.exception=ex;
      }
      catch (IOException ie) {
       this.ErrorMsg="Unable to connect";
      Response=null;
       this.exception=ie;
      }
       catch (Exception e) {
        this.ErrorMsg="Unable to connect";
        Response=null;
        this.exception=e;
     }
          return Response;
       }
    }
    

    Please note that i was using web-service written in ASP.NET frame work .That's why i provide

    envelope.dotNet= true;
    

    For reference :See this tutorial

    and See this Question