再会。我尝试使用 yii 和 android 客户端创建 Web 服务服务器。这是我的 WSDL,我在本地主机上创建它,网址是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>
我在 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;
}
}
}
当我尝试在 android 上用 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());
}
}
}
我总是以失败告终。我的wsdl有问题吗?或者我有这样的问题,因为尝试连接到本地主机服务器?