2
package com.example.gramaniladharidetails;

import java.util.Vector;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.Marshal;
import org.ksoap2.serialization.MarshalFloat;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

  public class GramaNiladhari extends Activity {
private static String SOAP_ACTION1= "http://localhost/getGramaNiladhariData";
private static String NAMESPACE = "http://119.235.4.217/";
private static String METHOD_NAME1 = "getGramaNiladhariData";
private static String URL = "";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grama_niladhari);


    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            final String gndLifeCode = prov;
            String LifeCode = "3-2-09-060";
            request.addProperty("gndLifeCode", LifeCode);
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);


            SupportThread st = new SupportThread();
            Log.i("Request", request.toString());
            st.execute(request);

        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_grama_niladhari, menu);
    return true;
}

private class SupportThread extends
        AsyncTask<SoapObject, Object, SoapObject> {

    @Override
    protected SoapObject doInBackground(SoapObject... req) {
        SoapObject result = null;
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.setOutputSoapObject(req[0]);
        envelope.addMapping(NAMESPACE, "SerializeInfo",
                new SerializeInfo().getClass());

        Marshal floatMarshal = new MarshalFloat();
        floatMarshal.register(envelope);

        envelope.dotNet = true;

        try {
            envelope.encodingStyle = SoapSerializationEnvelope.XSD;
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            androidHttpTransport.debug = true;

            androidHttpTransport.call(SOAP_ACTION1, envelope);
            SoapObject result = (SoapObject) envelope.getResponse();



            if (envelope.bodyIn instanceof SoapFault) {
                String str = ((SoapFault) envelope.bodyIn).faultstring;
                Log.i("*******", str);

            } else {
                int elementCount = result.getPropertyCount();

                if (elementCount > 0) {
                    String element;

                    for (int i = 0; i < elementCount; i++) {


                        element = result.getProperty(i).toString();
                        Log.d("This is an element", Integer.toString(i)
                                + " --" + element);


                    }
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    @Override
    protected void onPostExecute(SoapObject result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        if (result != null) {
            String response_name = result.getName();

            TextView tv = (TextView) findViewById(R.id.textView5);
            tv.setText(result.getProperty(0).toString());
        }

        else {

            Toast.makeText(getApplicationContext(), "No Response",
                    Toast.LENGTH_LONG).show();

        } 
    }
}

}

私が呼び出している Web サービス メソッドは、GramaNiladhari と呼ばれる complexType オブジェクトを返します。5種類の弦で構成されています。このコードを実行すると、次の SoapObject の結果が得られます。

anyType{gnName=anyType{}; address=anyType{}; workingDays=anyType{}; gnDivision=anyType{}; contactNumber=anyType{}; } 

しかし、ここでは値が欠落しており、それらはanyType{}に置き換えられています。実際の値を取得するにはどうすればよいですか?

質問を編集しました。

これは XML で解析された要求です。

    <v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:d="http://www.w3.org/2001/XMLSchema" 
xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header /><v:Body>
<getGramaNiladhariData xmlns="http://119.235.4.217/GNService/">
<gndLifeCode i:type="d:string">1-1-21-065</gndLifeCode>
</getGramaNiladhariData></v:Body></v:Envelope>

これは、Web サービスを呼び出した後の結果です。

 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <getGramaNiladhariDataResponse xmlns="http://localhost/"> <getGramaNiladhariDataResult><gnName /><address /><workingDays /><gnDivision /><contactNumber /></getGramaNiladhariDataResult></getGramaNiladhariDataResponse></soap:Body></soap:Envelope>

リクエストを確認すると、リクエストがうまく渡されたようです (リクエスト パラメータ gndLifeCode の正しい値 1-1-21-065 も)。

しかし、応答は null です。取得する必要があるすべての要素には、空のタグがあります。

これは Web サービスの問題でしょうか。SoapUI でこの Web サービスを確認しましたが、そこではうまく動作します (SoapClient でも動作します)。それでも、ここで何が問題なのか理解できませんか?

4

3 に答える 3

1

申し訳ありませんが、私は Android 開発者ではないため、正確な答えを提供することはできませんが、私の視点で何が問題なのかについてのヒントを提供できます。

うまくいけば、あなたのリクエストはサーバーによって推測されるほど理解するのにそれほどクールではありません

あなたのリクエストはこんな感じだと思います

REQUEST:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/">
        <SOAP-ENV:Body>
            <ns1:getGramaNiladhariData/>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

そのため、これが返されます

stdClass Object
(
    [getGramaNiladhariDataResult] => stdClass Object
        (
            [gnName] => 
            [address] => 
            [workingDays] => 
            [gnDivision] => 
            [contactNumber] => 
        )

)

だからあなたのリクエストはこのようでなければなりません

REQUEST:
<?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/">
        <SOAP-ENV:Body>
            <ns1:getGramaNiladhariData>
                <ns1:gndLifeCode>3-2-09-060</ns1:gndLifeCode>
            </ns1:getGramaNiladhariData>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

そして、あなたは正確な答えを得るでしょう

また、ns1、SOAP-ENV(私の場合)などのxmlnsのタグが同じであることを確認して、soap uiの使用をお勧めすることを確認してください

涼しい

于 2012-09-12T06:14:08.933 に答える
0

輸入品:

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

ウェブサービス:

/*web service parameters*/
private static final String TAG = SearchResultFragment.class.getSimpleName();
private static final String SOAP_ACTION = "http://tempuri.org/GetMethod";
private static final String METHOD_NAME = "GetMethod";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://127.0.0.1/App_Services/service.asmx";

こうやって使ってる…

private SoapObject CallWebServiceDemo() {
    SoapObject result = null;
    try {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.implicitTypes = true;
        envelope.dotNet = true;
        envelope.encodingStyle = SoapSerializationEnvelope.XSD;
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);
        result = (SoapObject) envelope.getResponse();
    } catch (Exception ex) {
        Log.e(TAG, ex.getMessage());
    }
    return result;
}
于 2012-09-12T06:12:43.893 に答える