Ответ от веб-службы SOAP всегда возвращает нулевую студию Android

Я пытаюсь получить ответ от нескольких веб-сервисов SOAP, наконец, я попытался запустить код, который является хорошо известным примером в Интернете. Но я понял, что даже это не работает в моем проекте. Я с трудом пытался понять, в чем может быть ошибка, но я не знаю, почему он не работает с мылом. Я действительно хотел бы получить вашу помощь.

Скачал новую версию KSOAP2, а также дал разрешение на интернет.

public class WEBSERVİCE extends AppCompatActivity {

Button btn;
EditText et;
TextView txv;
String celcius = "21";
String fahren;
private String NAMESPACE = "https://www.w3schools.com/xml/";
private String METHOD_NAME = "CelsiusToFahrenheit";
private String SOAP_ACTİON = "https://www.w3schools.com/xml/CelsiusToFahrenheit";
private String URL = "https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit?WSDL";

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = findViewById(R.id.button);
    txv = findViewById(R.id.textView);
    et = findViewById(R.id.editText1);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AsyncCallWS task = new AsyncCallWS();
            task.execute();
        }
    });


}

private class AsyncCallWS extends AsyncTask<String, Void, String> {
    @Override
    protected void onPreExecute() {
        txv.setText("calculating");
        super.onPreExecute();

    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected String doInBackground(String... objects) {
        return getBolum(celcius);

    }

    @Override
    protected void onPostExecute(String o) {

        txv.setText(fahren + "F");
        super.onPostExecute(o);
    }


}

public String getBolum(String celsius) {
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    PropertyInfo pi = new PropertyInfo();
    pi.setName("Celcius");
    pi.setValue(celsius);
    pi.setType(double.class);
    request.addProperty(pi);
    SoapSerializationEnvelope envelope = new 
    SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHTTPTransport = new HttpTransportSE(URL);
    try {
        androidHTTPTransport.call(SOAP_ACTİON, envelope);
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
         fahren = response.toString();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    return fahren;
     }
}

Нет сообщений об ошибках, но возвращаемое значение всегда равно "null"

Обновлено: снова опубликовал измененный код

Посмотрите также этот пример: devexchanges.info/2015/04/…

Zohaib Amir 22.07.2019 19:22

Кажется, w3schools.com/Xml/tempconvert.asmx?op=CelsiusToFahrenheit этот API выдает ошибку 404. Вам следует попробовать другой URL-адрес, который работает.

Zohaib Amir 22.07.2019 19:58
1
2
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В SOAP Api нет ничего плохого. Проблема в вашем классе Асинтаск. Сначала прочитайте документацию для Асинтаск. Пожалуйста, проведите тщательное исследование, прежде чем использовать какой-либо код из Интернета. Всегда читайте о компонентах, которые используются фрагментами в Интернете, иначе вам будет трудно разобраться в проблемах.

Ваш класс AsyncTask объявлен как:

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

Измените его на

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

Третий общий параметр в вашем Void, который должен быть типом результата. Таким образом, в вашем случае ваша асинхронная задача не будет возвращать никаких данных после ее завершения.

//CHANGE TYPE TO STRING
public String getBolum(String celsius) {
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    PropertyInfo pi=new PropertyInfo();
    pi.setName("Celcius");
    pi.setValue(celsius);
    pi.setType(double.class);
    request.addProperty(pi);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHTTPTransport = new HttpTransportSE(URL);
    try {
        androidHTTPTransport.call(SOAP_ACTİON, envelope);
        SoapPrimitive response= (SoapPrimitive) envelope.getResponse();

        //RETURN RESULT
        return response.toString();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
//I forgot this line previously:
return "";

}}

В вашей асинхронной задаче вам нужно изменить возвращаемый тип doInBackground и параметр onPostExecute на String:

 @Override
    protected String doInBackground(String... objects) {
        return getBolum(celcius);     //RETURN RESULT

    }

 @Override
    protected void onPostExecute(String result) {
        txv.setText(result+"F");
        fahren = result;
        super.onPostExecute(result);
    }

Теперь это должно работать.

большое спасибо за ваш ответ, но, к сожалению, он не работает.

jacob 22.07.2019 18:52

Я изменил AsyncTask<String, Void, String>, но он снова ничего не возвращает

jacob 22.07.2019 18:53

@jacob посмотрите на свой onPostExecute (String o), имя вашего параметра «o», но в вашем утверждении используется «fahren». Вставьте onPostExecute() так же, как в моем коде.

Zohaib Amir 22.07.2019 19:46

Зохаиб Амир Я очень ценю вашу помощь, большое спасибо.

jacob 23.07.2019 08:23

Кстати, я хотел бы спросить вас, знаете ли вы другой веб-сервис SOAP, подобный этому, который я мог бы использовать, чтобы доказать, что я делаю это правильно в коде?

jacob 23.07.2019 08:24

@jacob извините, я не знаю о каком-либо другом сервисе мыла, но могу сказать, что вашу функцию getBolum() нужно изменить, чтобы она соответствовала запросу API мыла.

Zohaib Amir 23.07.2019 11:05

хорошо, спасибо, мне нужно следовать совершенно другому пути? к сожалению, я не нашел ничего другого, кроме этого способа сделать это.

jacob 23.07.2019 12:19

Вам просто нужен URL-адрес другого мыльного сервиса

Zohaib Amir 23.07.2019 12:27

Другие вопросы по теме