java एंड्रॉइड में एक साबुन webservice को कॉल करें




android xml (3)

इस सवाल का पहले से ही उत्तर दिया गया है:

मुझे एक एंड्रॉइड डिवाइस में एक साबुन webservice के लिए कॉल करने की आवश्यकता है। मैं स्टैक ओवरफ्लो और अन्य पृष्ठों पर बहुत सारे लेख पढ़ रहा हूं, वीडियो देख रहा हूं ... लेकिन मैंने हरदम की कोशिश की है और मैं इसे मेरे एंड्रॉइड डिवाइस पर काम नहीं कर सकता, और मैं एक एमुलेटर पर परीक्षण नहीं कर सकता, क्योंकि मेरा कंप्यूटर उनमें से किसी को संभाल नहीं सकता है, इसलिए मुझे नहीं पता कि त्रुटि कोड पर है या अगर यह मेरे एंड्रॉइड डिवाइस की समस्या है

लेआउट xml केवल एक EditText, एक बटन, और एक TextView है।

इस लिंक में आप अनुरोध xml को देख सकते हैं कि मुझे वेबसेवरी पर भेजना है (मुझे SOAP 1.1 या SOAP 1.2 का उपयोग करना चाहिए?) Http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry

यह मेरा वास्तविक कोड है, और मैंने कई अन्य तरीकों की कोशिश की है, और उनमें से कोई भी मेरे लिए काम नहीं कर रहा है कोई मदद? (यूआरएल, नेमस्पेस, सोप_ऑक्शन और विधि_नाम मान ओकी हैं, है ना?)

package com.example.doazdoas.webservice_prueba;


    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

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

    import android.os.AsyncTask;
    import android.widget.Toast;

    import static android.content.ContentValues.TAG;

   public class MainActivity extends Activity{
    private TextView textResult;
    private Button buttonSend;

    String NAMESPACE = "http://www.webserviceX.NET/";
    String METHOD_NAME = "GetCitiesByCountry";
    String SOAP_ACTION = NAMESPACE + METHOD_NAME;
    String URL = "http://www.webservicex.net/globalweather.asmx?WSDL";

    private Object resultsRequestSOAP = null;

    HttpTransportSE androidHttpTransport;

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

        textResult = (TextView)findViewById(R.id.textResultado);
        buttonSend = (Button)findViewById(R.id.buttonEnviar);
        //setContentView(tv);
    }

    public void onClickEnviar(View view){
        AsyncCallWS task = new AsyncCallWS();
        task.execute();
    }

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            Log.i(TAG, "onPreExecute");
        }

        @Override
        protected Void doInBackground(Void... params) {
            Log.i(TAG, "doInBackground");
            sendRequest();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Log.i(TAG, "onPostExecute");
            Log.d("dump Request: " ,androidHttpTransport.requestDump);
            Log.d("dump response: " ,androidHttpTransport.responseDump);
        }

    }


    public void sendRequest(){
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


        //SoapObject
        request.addProperty("@CountryName", "SPAIN");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);


        androidHttpTransport = new HttpTransportSE(URL);
        try
        {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            resultsRequestSOAP =  envelope.getResponse();
            String[] results = (String[])  resultsRequestSOAP;
            textResult.setText( results[0]);
        }
        catch (Exception aE)
        {
            aE.printStackTrace ();
        }
    }
}

निजी वर्ग AsyncCallWS AsyncTask विस्तारित {

    private String[] data;
    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
    }

    @Override
    protected String[] doInBackground(Void... params) {
        Log.i(TAG, "doInBackground");
        data = sendRequest();
        return data;
    }

    @Override
    protected void onPostExecute(String[] result) {
        Log.i(TAG, "onPostExecute");
        if(result != null && result.length > 0){
            Log.d("dump Request: " ,androidHttpTransport.requestDump);
            Log.d("dump response: " ,androidHttpTransport.responseDump);
            textResult.setText( result[0]);
        }else{
            Log.d("Error","There's no answer");
        }
    }

}

मैंने इसे बदल दिया है और अब ऐसा है ... लेकिन यह हमेशा प्रिंट करता है कि कोई जवाब नहीं है


आप doInBackGround में कोई भी UI संबंधित कार्रवाइयां कर सकते हैं, तो उन्हें उन्हें onPostExecute एस्किक्यूट onPostExecute जाएं।

क्योंकि doInBackGround एक UI थ्रेड नहीं है कृपया असिनक टास्क दस्तावेज़ को ध्यानपूर्वक पढ़ें। जो भी डेटा आप doInBackGround से लौट रहे हैं, यह onPostExecute इनपुट के रूप में लिया जा रहा है

तो अपने कोड को निम्नानुसार बदल दें,

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
    }

    @Override
    protected String[] doInBackground(Void... params) {
        Log.i(TAG, "doInBackground");
        String[] data = sendRequest();
        return data;
    }

    @Override
    protected void onPostExecute(String[] result) {
        Log.i(TAG, "onPostExecute");
        if(result != null && result.length > 0){
             textResult.setText( results[0]);
        }
    }

}


private String[] sendRequest(){
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


    //SoapObject
    request.addProperty("@CountryName", "SPAIN");
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);


    androidHttpTransport = new HttpTransportSE(URL);
    try
    {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        resultsRequestSOAP =  envelope.getResponse();
        String[] results = (String[])  resultsRequestSOAP;
    }
    catch (Exception aE)
    {
        aE.printStackTrace ();
    }
}

क्या आपने पुस्तकालयों के उपयोग के बिना साबुन अनुरोध करने पर विचार किया है? मुझे पहले ही समस्या थी और मुझे पता चला कि पुस्तकालय आपके काम को कठिन बना देगा, खासकर जब अनुरोध की संरचना में परिवर्तन करने की बात आती है। इस तरह आप पुस्तकालयों के उपयोग के बिना एक साबुन अनुरोध कैसे बनाते हैं: सबसे पहले आपको यह जानना होगा कि SOAP Ui का उपयोग कैसे करना है जो एक खिड़की अनुप्रयोग है आप अपनी wsdl फाइल को यहां आयात कर सकते हैं और अगर यह हमें सही वाक्यविन्यास देता है, तो आपको अपने वेबसेवी के लिए अनुरोध निकाय को दिखाए जाने वाला स्क्रीन मिलेगा। आप परीक्षण मान दर्ज कर सकते हैं और आपको एक प्रतिक्रिया संरचना मिल जाएगी। यह लिंक आपको साबुन यूआई का उपयोग करने के बारे में मार्गदर्शन करेगा https://www.soapui.org/soap-and-wsdl/working-with-wsdls.html

एंड्रॉइड कोड पर अब:

हम रनटास्क नामक एक क्लास बनाएंगे जो एसिंक कार्य का विस्तार करता है और अनुरोध निकाय भेजने और अनुरोध प्रतिक्रिया प्राप्त करने के लिए http का उपयोग करता है:

 private class runTask extends AsyncTask<String, String, String> {

        private String response;
        String string = "your string parameter"
        String SOAP_ACTION = "your soap action here";

        String stringUrl = "http://your_url_here";
        //if you experience a problem with url remove the '?wsdl' ending



        @Override
        protected String doInBackground(String... params) {

            try {

                        //paste your request structure here as the String body(copy it exactly as it is in soap ui)
                        //assuming that this is your request body


                String body = "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">" +
                                "<soap:Body>"+
                                "<GetCitiesByCountryResponse xmlns="http://www.webserviceX.NET">"+
                                "<GetCitiesByCountryResult>"+string+"</GetCitiesByCountryResult>"+
                                "</GetCitiesByCountryResponse>"+
                                "</soap:Body>"+
                                "</soap:Envelope>";


                try {
                    URL url = new URL(stringUrl);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("POST");
                    conn.setDoOutput(true);
                    conn.setDefaultUseCaches(false);
                    conn.setRequestProperty("Accept", "text/xml");
                    conn.setRequestProperty("SOAPAction", SOAP_ACTION);

                    //push the request to the server address

                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                    wr.write(body);
                    wr.flush();

                    //get the server response

                    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    StringBuilder builder = new StringBuilder();
                    String line = null;

                    while ((line = reader.readLine()) != null) {


                        builder.append(line);
                        response = builder.toString();//this is the response, parse it in onPostExecute

                    }


                } catch (Exception e) {

                    e.printStackTrace();
                } finally {

                    try {

                        reader.close();
                    } catch (Exception e) {

                        e.printStackTrace();
                    }
                }


            } catch (Exception e) {

                e.printStackTrace();
            }

            return response;
        }

        /**
         * @see AsyncTask#onPostExecute(Object)
         */
        @Override
        protected void onPostExecute(String result) {



           try {

              Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show();

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

अब बस क्लास को निष्पादित करें और जादुई घड़ी देखें:

runTask runner = new runTask();
runner.execute();

इच्छित मान प्राप्त करने के लिए आप DOM या SAX पार्सर का उपयोग करके प्रतिक्रिया को पार्स कर सकते हैं। अधिक स्पष्टीकरण के लिए पूछने के लिए स्वतंत्र महसूस करें।





android-ksoap2