50

Web サービスの呼び出し中に問題が発生しました。サーバーに .NET Web サービスがあり、Android で KSOAP2 (ksoap2-j2se-full-2.1.2) を使用しています。プログラムの実行中に、「org.ksoap2.serialization.SoapPrimitive」のような実行時例外が発生しました。私は何をすべきか?

これが私のコードです。

package projects.ksoap2sample;

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

import android.app.*;
import android.os.*;
import android.widget.TextView;

public class ksoap2sample extends Activity {
    /** Called when the activity is first created. */
    private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld";
    private static final String METHOD_NAME = "HelloWorld";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx";
    TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.text1);

        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            //request.addProperty("prop1", "myprop");

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet=true;
            envelope.setOutputSoapObject(request);

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            androidHttpTransport.call(SOAP_ACTION, envelope);

            Object result = (Object)envelope.getResponse();

            String[] results = (String[])  result;
            tv.setText( ""+results[0]);
        }
        catch (Exception e) {
            tv.setText(e.getMessage());
        }
    }
}
4

6 に答える 6

24

とても簡単です。結果をObjectプリミティブなものに取得しています。

あなたのコード:

Object result = (Object)envelope.getResponse();

正しいコード:

SoapObject result=(SoapObject)envelope.getResponse();

//To get the data.
String resultData=result.getProperty(0).toString();
// 0 is the first object of data.

これは絶対にうまくいくはずだと思います。

于 2010-01-12T13:26:49.157 に答える
14

.NET Web サービスはどのように見えますか?

code.google.com のksoap 2.3を使用しても同じ効果がありました。私はThe Code Projectのチュートリアルに従いました(これは素晴らしいです。)

そして、私が使用するたびに

    Integer result = (Integer)envelope.getResponse();

私のWebサービスの結果を取得するために(タイプに関係なく、Object、String、intを試しました)org.ksoap2.serialization.SoapPrimitive例外に遭遇しました。

解決策(回避策)を見つけました。最初にやらなければならなかったことは、Web サービス メソッドから「SoapRpcMethod()」属性を削除することでした。

    [SoapRpcMethod(), WebMethod]
    public Object GetInteger1(int i)
    {
        // android device will throw exception
        return 0;
    }

    [WebMethod]
    public Object GetInteger2(int i)
    {
        // android device will get the value
        return 0;
    }

次に、Android コードを次のように変更しました。

    SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

ただし、プライベートな「値」フィールドを持つ SoapPrimitive オブジェクトを取得します。幸いなことに、値はtoString()メソッドを介して渡されるのでInteger.parseInt(result.toString())、Web サービスから取得する必要がある複雑な型がないため、これで十分です。

完全なソースは次のとおりです。

private static final String SOAP_ACTION = "http://tempuri.org/GetInteger2";
private static final String METHOD_NAME = "GetInteger2";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:4711/Service1.asmx";

public int GetInteger2() throws IOException, XmlPullParserException {
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo pi = new PropertyInfo();
    pi.setName("i");
    pi.setValue(123);
    request.addProperty(pi);

    SoapSerializationEnvelope envelope =
        new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
    androidHttpTransport.call(SOAP_ACTION, envelope);

    SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
    return Integer.parseInt(result.toString());
}
于 2009-10-05T17:15:09.167 に答える
7

エンベロープを SoapPrimitive に型キャストします。

SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
String strRes = result.toString();

そしてそれはうまくいくでしょう。

于 2009-12-17T18:22:31.563 に答える
0

複数の結果が予想される場合、メソッドはさまざまな応答を含むgetResponse()を返します。Vector

その場合、問題のあるコードは次のようになります。

Object result = envelope.getResponse();

// treat result as a vector
String resultText = null;
if (result instanceof Vector)
{
    SoapPrimitive element0 = (SoapPrimitive)((Vector) result).elementAt(0);
    resultText = element0.toString();
}

tv.setText(resultText);

ksoap2-android (モサブアフォーク)に基づく回答

于 2011-09-27T12:45:42.227 に答える
0

電話できないと思う

 androidHttpTransport.call(SOAP_ACTION, envelope);

メインスレッドで。

ネットワーク操作は別のスレッドで行う必要があります。

メソッドを呼び出す別の Thread または AsyncTask を作成します。

于 2013-08-26T15:36:32.077 に答える