The soap between Yii and Android
Good day. I am trying to create a web service server with yii and an android client. Here's 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 am creating it using 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 using 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'm wrong anyway. Is there a problem with my wsdl? or am i having such problems because trying to connect to localhost server?
source to share
try with these options, im working with yii and android and im getting the same problem in recent 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";
source to share
Try changing the following parameters:
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";
source to share
Maybe this is a little late, but if anyone is looking for the correct answer, use the correct options given by wsdl without changing the programming language ..
WEB SERVICE CONTROLLER YII
<?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 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 what it is, it works great ...
source to share