Soap between Yii and Android

Go To StackoverFlow.com

3

Good day. I try to create web service server with yii and client for android. Here my WSDL, I created it on my local host and the url is http://localhost:8888/places/index.php?r=Service/service

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:ServiceControllerwsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" name="ServiceController" targetNamespace="urn:ServiceControllerwsdl">
<wsdl:message name="registrateRequest">
<wsdl:part name="login" type="xsd:string"/>
<wsdl:part name="password" type="xsd:string"/>
<wsdl:part name="email" type="xsd:string"/>
<wsdl:part name="name" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="registrateResponse">
<wsdl:part name="return" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="authenticateRequest">
<wsdl:part name="login" type="xsd:string"/>
<wsdl:part name="password" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="authenticateResponse"/>
<wsdl:portType name="ServiceControllerPortType">
<wsdl:operation name="registrate">
<wsdl:documentation/>
<wsdl:input message="tns:registrateRequest"/>
<wsdl:output message="tns:registrateResponse"/>
</wsdl:operation>
<wsdl:operation name="authenticate">
<wsdl:documentation/>
<wsdl:input message="tns:authenticateRequest"/>
<wsdl:output message="tns:authenticateResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceControllerBinding" type="tns:ServiceControllerPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="registrate">
<soap:operation soapAction="urn:ServiceControllerwsdl#registrate" style="rpc"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:ServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:ServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="authenticate">
<soap:operation soapAction="urn:ServiceControllerwsdl#authenticate" style="rpc"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:ServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:ServiceControllerwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServiceControllerService">
<wsdl:port name="ServiceControllerPort" binding="tns:ServiceControllerBinding">
<soap:address location="http://localhost:8888/places/index.php?r=service/service&ws=1"/>
</wsdl:port>
</wsdl:service>
</definitions>

I create it with this class in yii

<?php

class ServiceController extends CController
{
    public function actions()
    {
        return array(
            'service'=>array(
                'class'=>'CWebServiceAction',
            ),
        );
    }
    /**
     * @param string login
     * @param string password
     * @param string email
     * @param string name
     * @return string 
     * @soap
     */
    public function registrate($login, $password, $email, $name)
    {
        $user = new UserModel();
        /*create new user*/
        $user->login = $login;
        $user->password = md5($password);
        $user->email = $email;
        $user->name = $name;
        $user->active = 0;
        //save to DB
        $user->save(); 
        return 'success';

    }
    /**
     * @param string login
     * @param string password
     * return int
     * @soap
     */
    public function authenticate($login, $password)
    {
        $post=Post::model()->find('postID=:postID', array(':postID'=>10));
        $user = UserModel::model()->find('login:=login and password:=password', 
                                    array(':login' => $login, ':password'=>$password));
        if (!empty ($user)){
            return 1;
        }
        else{
            return 0;
        }

    }
}

And when I try to connect to it on android whith ksoap

public class PlacesActivity extends Activity {
    /** Called when the activity is first created. */
    private static String SOAP_ACTION = "urn:#registrate";
    private static String NAMESPACE = "urn:ServiceControllerwsdl";
    private static String METHOD_NAME = "registrate";
    private static String URL = "http://localhost:8888/places/index.php?r=Service/service";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);       
            //Use this to add parameters
            request.addProperty("login","nabiullin11");
            request.addProperty("password","qwer1234");
            request.addProperty("email","nabiullinas@gmail.com");
            request.addProperty("name","nabiullin11");
            //Declare the version of the SOAP request
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
            //Needed to make the internet call
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            try {
                //this is the actual part that will call the webservice
                androidHttpTransport.call(SOAP_ACTION, envelope);
            } catch (Exception e) {
                TextView t = (TextView)this.findViewById(R.id.resultbox);
                //Get the first property and change the label text
                t.setText("FAIL");
                e.printStackTrace();
            }
            SoapObject result = (SoapObject)envelope.bodyIn;
            if(result != null){
                TextView t = (TextView)this.findViewById(R.id.resultbox);
                //Get the first property and change the label text
                t.setText("SOAP response:\n\n" + result.getProperty(0).toString());
            }

    }

}

I alwase take Fail. There is a problem of my wsdl? or I have such problems becous try to connect to localhost server?

2012-04-04 19:38
by nabiullinas
I tried to post on hosting server part, nothing changed = - nabiullinas 2012-04-05 17:27
What stack trace did you received while exception occurred? Which exception message was gained - asolovyov 2012-04-05 18:06


0

The problem is in yii framework, becouse it takes me unnormal WSDL. I Have Made sevice on Java

2012-05-04 11:48
by nabiullinas
can you tell me what is the problem in the wsdl my methods are not working ... i am not able to call my method - Anand 2013-12-07 10:39


1

try with this parameters, im working with yii and android and im getting the same problem in last days, and here is the solution:

static String SOAP_ACTION = "urn:ServiceControllerwsdl#authenticate";
private static String NAMESPACE = "urn:ServiceControllerwsdl";
private static String METHOD_NAME = "authenticate";
private static String URL = "http://localhost:8888/places/index.php?r=service/service&ws=1";
2013-07-01 21:30
by Victor Yanez


0

Try to change your parameters to following:

private static String SOAP_ACTION = "urn:ServiceControllerwsdl#authenticate";
private static String NAMESPACE = "http://windwalk.ru";
private static String METHOD_NAME = "authenticate";
private static String URL = "http://windwalk.ru/places/index.php?r=service/service&ws=1";
2012-04-05 18:44
by asolovyov


0

Maybe it's a little late, but if someone is looking for the correct answer is using the correct params given by the wsdl, not change the programming language..

YII WEB SERVICE CONTROLLER

<?php class WebServiceController extends Controller{

 public function actions()
{
    return array(
        'quote'=>array(
            'class'=>'CWebServiceAction',
        ),
    );
}


 /**
 * @return string the joke
 * @soap
 */
public function getJoke()
{
    $jokes= array(0=>"Ordinarily, staring is creepy. But if you spread your attention across many individuals, then it's just people watching.",
                     1=>"A bear walks into a bar and says to the bartender, I'll have a pint of beer and a.......... packet of peanuts. The bartender asks, 'Why the big pause?'",
                     2=>"A man goes to a $10 hooker and contracts crabs. When he goes back to complain, the hooker laughs and says, What do you expect for $10 --lobster?"
                     );
    return $jokes[rand(0,2)];
}?>

WSDL

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:WebServiceControllerwsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" name="WebServiceController" targetNamespace="urn:WebServiceControllerwsdl"> <wsdl:message name="getJokeIn"/> <wsdl:message name="getJokeOut"> <wsdl:part name="return" type="xsd:string"/> </wsdl:message> <wsdl:portType name="WebServiceControllerPortType"> <wsdl:operation name="getJoke"> <wsdl:documentation/> <wsdl:input message="tns:getJokeIn"/> <wsdl:output message="tns:getJokeOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="WebServiceControllerBinding" type="tns:WebServiceControllerPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getJoke"> <soap:operation soapAction="urn:WebServiceControllerwsdl#getJoke" style="rpc"/> <wsdl:input> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:WebServiceControllerwsdl"/> </wsdl:input> <wsdl:output> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:WebServiceControllerwsdl"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="WebServiceControllerService"> <wsdl:port name="WebServiceControllerPort" binding="tns:WebServiceControllerBinding"> <soap:address location="http://192.168.117.1/webservice_test/index.php?r=webservice/quote&ws=1"/> </wsdl:port> </wsdl:service> </definitions>

Constants using ksoap2-android-assembly-2.5.2

   package jvasconez.com.webservicetest;

/**
 * Created by jvasconez on 8/4/2016.
 */
import android.app.Activity;
import android.os.AsyncTask;
import android.widget.TextView;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class WSManager extends AsyncTask<String,Integer,Boolean> {

    public String response="";
    public Activity mActivity;
    public WSManager(Activity act)
    {
        mActivity=act;
    }
    protected Boolean doInBackground(String... params) {

        boolean result = true;


        final String NAMESPACE = "urn:WebServiceControllerwsdl";
        final String URL="http://192.168.0.8/webservice_test/index.php?r=webservice/quote&ws=1";
        final String METHOD_NAME = "getJoke";
        final String SOAP_ACTION = "urn:WebServiceControllerwsdl#getJoke";
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope envelope =
                new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = false;

        envelope.setOutputSoapObject(request);

        HttpTransportSE transporte = new HttpTransportSE(URL,10000);

        try


     {
            transporte.call(SOAP_ACTION, envelope);

            response =(String) envelope.getResponse();
        }
        catch (Exception e)
        {
            result = false;
            response="";
        }

        return result;
    }

    protected void onPostExecute(Boolean result) {

        if (result)
        {
           TextView joke=(TextView)mActivity.findViewById(R.id.txt_joke);
            joke.setText(response);
        }

    }
}

And that's it, it works fine...

2016-04-08 18:59
by Julio Vásconez
It's just an example working SOAP between Android and PHP (With Yii Framework - Julio Vásconez 2016-04-08 19:00
Ads