android सकत केएसओएपी 2 का उपयोग कर एंड्रॉइड से.NET वेबसाइट सेवा कैसे कॉल करें?




बिना नंबर दिखाए कर सकते हैं कॉल, स्क्रीन पर आएगा unknown नंबर (5)

सोफेप्रिमेटिव के लिए लिफाफा टाइपकास्ट करें:

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

और यह काम करेगा।

एक webservice कॉल करते समय मुझे एक समस्या है। मेरे पास सर्वर पर एक .NET वेब सेवा है, और मैं एंड्रॉइड में केएसओएपी 2 (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());
        }
    }
}

आप वेब सेवा को कॉल करने और प्रतिक्रिया प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं। सुनिश्चित करें कि आपकी वेब सेवा डेटा तालिका प्रारूप में प्रतिक्रिया लौटाती है .. यह कोड आपको SQL सर्वर डेटाबेस से डेटा का उपयोग करने में सहायता करता है। यदि आप MYSQL का उपयोग कर रहे हैं तो आपको एक चीज को बदलें शब्द को न्यूडाटासेट को वाक्य obj2=(SoapObject) obj1.getProperty("NewDataSet"); DocumentElement द्वारा

private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://localhost/Web_Service.asmx?"; // you can use   IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = NAMESPACE + METHOD_NAME;

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("parm_name", prm_value); // Parameter for Method
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

try {
    androidHttpTransport.call(SOAP_ACTION, envelope); //call the eb service Method
} catch (Exception e) {
    e.printStackTrace();
} //Next task is to get Response and format that response

SoapObject obj, obj1, obj2, obj3;
obj = (SoapObject) envelope.getResponse();
obj1 = (SoapObject) obj.getProperty("diffgram");
obj2 = (SoapObject) obj1.getProperty("NewDataSet");

for (int i = 0; i < obj2.getPropertyCount(); i++) //the method getPropertyCount() return the number of rows
{
    obj3 = (SoapObject) obj2.getProperty(i);
    obj3.getProperty(0).toString(); //value of column 1
    obj3.getProperty(1).toString(); //value of column 2
    //like that you will get value from each column
}

यदि आपको इसके बारे में कोई समस्या है तो आप मुझे लिख सकते हैं ..



आपकी .NET वेबसाइट सेवा कैसी दिखती है?

कोड . google.com से ksoap 2.3 का उपयोग करके मेरा वही प्रभाव पड़ा। मैंने कोड प्रोजेक्ट पर ट्यूटोरियल का पालन किया (जो कि महान बीटीडब्लू है।)

और हर बार मैंने इस्तेमाल किया

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

मेरे webservice का परिणाम प्राप्त करने के लिए (इस प्रकार के बावजूद, मैंने ऑब्जेक्ट, स्ट्रिंग, int की कोशिश की) मैं org.ksoap2.serialization.SoapPrimitive अपवाद में भाग गया।

मुझे एक समाधान मिला (कामकाज)। मुझे सबसे पहले जो करना था वह मेरी webservice विधियों से "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;
    }

तब मैंने अपना एंड्रॉइड कोड बदल दिया:

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

हालांकि, मुझे एक सोपप्रिमेटिव ऑब्जेक्ट मिलता है, जिसमें "मूल्य" दायर किया जाता है जो निजी है। सौभाग्य से मूल्य toString() विधि के माध्यम से पारित किया जाता है, इसलिए मैं अपना मूल्य प्राप्त करने के लिए Integer.parseInt(result.toString()) का उपयोग करता हूं, जो मेरे लिए पर्याप्त है, क्योंकि मेरे पास कोई जटिल प्रकार नहीं है जिसे मुझे प्राप्त करने की आवश्यकता है मेरी वेब सेवा से।

यहां पूर्ण स्रोत है:

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

यदि एक से अधिक परिणाम अपेक्षित हैं, तो 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 (mosabua कांटा) के आधार पर उत्तर





ksoap