3

良い一日。yiiとandroid用のクライアントを使用してWebサービスサーバーを作成しようとしています。ここで私のWSDLは、ローカルホストで作成し、URLは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;
        }

    }
}

そして、私がアンドロイドでそれに接続しようとすると、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に問題がありますか?または、ローカルホストサーバーに接続しようとすると、このような問題が発生しますか?

4

4 に答える 4

0

パラメータを次のように変更してみてください。

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-05T18:44:43.137 に答える
0

少し遅いかもしれませんが、正しい答えを探している人がwsdlによって与えられた正しいパラメータを使用している場合は、プログラミング言語を変更しないでください..

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'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>

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);
        }

    }
}

そしてそれだけです、それはうまくいきます...

于 2016-04-08T18:59:33.617 に答える
0

問題は yii フレームワークにあります。異常な WSDL が必要になるからです。Java でサービスを作成しました

于 2012-05-04T11:48:39.383 に答える