kSOAP2请求返回null对象

时间:2016-05-25 20:42:29

标签: android android-ksoap2

我是Android新手,所以请耐心等待。我试图从http://www.webservicex.net/globalweather.asmx?WSDL使用kSOAP2 Web服务,到目前为止我的请求已返回null响应。我的请求中是否有问题或者我遗失了什么?以下代码如下:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button sendBtn;
    EditText editCityName, editCountryName;
    String tempCity, tempCountry;
    SoapObject testy;

    SoapObject request;
    final String METHOD_NAME1 = "GetWeather";
    final String SOAP_ACTION1 = "http://www.webserviceX.NET/GetWeather";
    final String NAMESPACE = "http://www.webserviceX.NET";
    final String  SOAP_URL = "http://www.webservicex.net/globalweather.asmx";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendBtn = (Button) findViewById(R.id.button);
        editCityName = (EditText) findViewById(R.id.editCityName);
        editCountryName = (EditText) findViewById(R.id.editCountryName);
        sendBtn.setOnClickListener(this);
        Log.e("create", "test123");
    }

    @Override
    public void onClick(View v) {
        tempCity = editCityName.getText().toString();
        tempCountry = editCountryName.getText().toString();
        testyTask task = new testyTask();
        task.execute();
        Log.e("test", "task started");
    }

    private class testyTask extends AsyncTask <String, Void, String>
    {
        @Override
        protected String doInBackground(String... params)
        {
            request = new SoapObject(NAMESPACE, METHOD_NAME1);
            request.addProperty("CityName", tempCity);
            request.addProperty("CountryName", tempCountry);
            Log.e("request1", request.getProperty("CityName").toString());
            Log.e("request2", request.getProperty("CountryName").toString());

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

            HttpTransportSE httpTransport = new HttpTransportSE(SOAP_URL);
            Log.d("transport", httpTransport.toString());
            httpTransport.debug = true;
            try {

                httpTransport.call(SOAP_ACTION1, envelope);
                testy = (SoapObject) envelope.bodyIn;


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

            //Log.d("dump Request: " , httpTransport.requestDump);
            String xml = httpTransport.responseDump;
            Log.e("dump response: " , xml); //Error here
            //Log.e("weather", testy.toString());

            return "blah";
        }

        @Override
        protected void onPostExecute(String aVoid)
        {

            Log.e("end test", testy.toString());
            super.onPostExecute(aVoid);
            Toast.makeText(getApplicationContext(), testy.toString(), Toast.LENGTH_LONG).show();
        }

    }
}

1 个答案:

答案 0 :(得分:1)

首先,使用最新版本的kSoap2。以下是您可以从中下载最新版本的链接。目前最新版本是3.6.1。 https://oss.sonatype.org/content/repositories/ksoap2-android-releases/com/google/code/ksoap2-android/ksoap2-android-assembly/

我使用了您发布的相同代码 MainActivity.class

public class MainActivity extends AppCompatActivity {
    SoapObject request;
    SoapObject testy;
    final String METHOD_NAME1 = "GetWeather";
    final String SOAP_ACTION1 = "http://www.webserviceX.NET/GetWeather";
    final String NAMESPACE = "http://www.webserviceX.NET";
    final String SOAP_URL = "http://www.webservicex.net/globalweather.asmx";

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

        new testyTask().execute();

    }

    private class testyTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            request = new SoapObject(NAMESPACE, METHOD_NAME1);
            request.addProperty("CityName", "Delhi");
            request.addProperty("CountryName", "India");
            Log.e("request1", request.getProperty("CityName").toString());
            Log.e("request2", request.getProperty("CountryName").toString());

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

            HttpTransportSE httpTransport = new HttpTransportSE(SOAP_URL);
            Log.d("transport", httpTransport.toString());
            httpTransport.debug = true;
            try {

                httpTransport.call(SOAP_ACTION1, envelope);
                testy = (SoapObject) envelope.bodyIn;


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

            //Log.d("dump Request: " , httpTransport.requestDump);
            String xml = httpTransport.responseDump;
            Log.e("dump response: ", xml); //Error here
            //Log.e("weather", testy.toString());

            return "blah";
        }

        @Override
        protected void onPostExecute(String aVoid) {

            Log.e("end test", testy.toString());
            super.onPostExecute(aVoid);
            Toast.makeText(getApplicationContext(), testy.toString(), Toast.LENGTH_LONG).show();
        }

    }
}

我得到的回应是

GetWeatherResponse{GetWeatherResult=<?xml version="1.0" encoding="utf-16"?>
        <CurrentWeather>
        <Location>New Delhi / Palam, India (VIDP) 28-34N 077-07E 233M</Location>
        <Time>May 26, 2016 - 12:00 PM EDT / 2016.05.26 1600 UTC</Time>
        <Wind> Calm:0</Wind>
        <Visibility> 1 mile(s):0</Visibility>
        <SkyConditions> mostly clear</SkyConditions>
        <Temperature> 96 F (36 C)</Temperature>
        <DewPoint> 68 F (20 C)</DewPoint>
        <RelativeHumidity> 39%</RelativeHumidity>
        <Pressure> 29.53 in. Hg (1000 hPa)</Pressure>
        <Status>Success</Status>
        </CurrentWeather>; }

注意: 确保您的清单文件中包含Internet权限。