3

.net Webservice に接続しているときに、Android プロジェクトで Ksoap2 を使用すると問題が発生します。パラメーターなしで Ws を呼び出す限り、すべて正常に機能しますが、パラメーターを追加しようとすると、サーバーはそれらを取得しません。これが私のコードです

import java.util.Vector;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ServicioWeb extends Activity {

SoapObject response;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   // String NAMESPACE = "http://tempuri.org/";
    String NAMESPACE = "IDBN.WS";
    String METHOD_NAME = "getClientesByName";
    //String SOAP_ACTION = "http://tempuri.org/getClientesByName";
    String SOAP_ACTION = "IDBN.WS/getClientesByName";
    //String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx";
    String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx";
    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
   PropertyInfo pi = new PropertyInfo();
    pi.setName("Nombre");
    pi.setValue("RIQUELME");
    pi.setType(int.class);
    Request.addProperty(pi);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(Request);
    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
    ListView Lista = (ListView)findViewById(R.id.Lista);

    try
    {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        response = (SoapObject)envelope.getResponse();
        String[] Clientes = getStringArrayResponse(response, null);
        Lista.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,Clientes));
    }
    catch(Exception e)
    {
        Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG);
        toast.show();
    }
}

public String[] getStringArrayResponse(SoapObject node, Vector<String> strings) {
    boolean isFirstCall = false;
    if (strings == null) {
        isFirstCall = true;
        strings = new Vector<String>();
    }
    int count = response.getPropertyCount();
    for (int i = 0; i < count; i++) {
        Object obj1 = node.getProperty(i);
        if (obj1 instanceof SoapObject) {
            // don't recurse empty objects
            if (((SoapObject)obj1).getPropertyCount() > 0) {
                // recurse into another node to process its nodes/primitives
                getStringArrayResponse((SoapObject)obj1, strings);
            }
        } else if (obj1 instanceof SoapPrimitive) {
            strings.add(((SoapPrimitive)obj1).toString());
        }
    }
    // only make this for the original caller
    if (isFirstCall) {
        return (String[])strings.toArray(new String[strings.size()]);
    }
    return null;
}
}

サーバー側をハードコードして、文字列 + 送信したパラメーターを返します。そして、取得したのはハードコードされた部分だけです。soap オブジェクトに追加したパラメーターがサーバーによって受信されることはないようです。

すでに試してみてください:-) Webサービスの名前空間から「http://」を削除します-)「envelope.dotNet = true;」を使用しません -) プロパティをリクエストに直接追加する

何が悪いの?

4

2 に答える 2

2

これらの行は私を混乱させます:

PropertyInfo pi = new PropertyInfo();
pi.setName("Nombre");
pi.setValue("RIQUELME");
pi.setType(int.class);
Request.addProperty(pi);

整数の値として文字列( "RIQUELME")を使用するのはなぜですか?

コードを実行するとどうなりますか?設定してみてくださいenvelope.debug = trueenvelope.requestDumpブレークポイントを設定し、との値を調べてみますenvelope.responseDump。そうすれば、何が送信され、何が受信されるかを確認できます。

于 2011-05-13T15:13:11.077 に答える
0
pi.setName("Nombre");
    pi.setValue("RIQUELME");
    pi.setType(int.class);
    Request.addProperty(pi);

pi.setValue は整数 (1、2 など) であるか、 pi.setType は string.class である必要があります。

または、pi.setType を持つ必要はありません。その行を削除すると、機能するはずです。

于 2012-01-26T17:27:33.603 に答える