Я пытаюсь получить ответ от нескольких веб-сервисов 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"
Обновлено: снова опубликовал измененный код
Кажется, w3schools.com/Xml/tempconvert.asmx?op=CelsiusToFahrenheit этот API выдает ошибку 404. Вам следует попробовать другой URL-адрес, который работает.
В 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);
}
Теперь это должно работать.
большое спасибо за ваш ответ, но, к сожалению, он не работает.
Я изменил AsyncTask<String, Void, String>, но он снова ничего не возвращает
@jacob посмотрите на свой onPostExecute (String o), имя вашего параметра «o», но в вашем утверждении используется «fahren». Вставьте onPostExecute() так же, как в моем коде.
Зохаиб Амир Я очень ценю вашу помощь, большое спасибо.
Кстати, я хотел бы спросить вас, знаете ли вы другой веб-сервис SOAP, подобный этому, который я мог бы использовать, чтобы доказать, что я делаю это правильно в коде?
@jacob извините, я не знаю о каком-либо другом сервисе мыла, но могу сказать, что вашу функцию getBolum() нужно изменить, чтобы она соответствовала запросу API мыла.
хорошо, спасибо, мне нужно следовать совершенно другому пути? к сожалению, я не нашел ничего другого, кроме этого способа сделать это.
Вам просто нужен URL-адрес другого мыльного сервиса
Посмотрите также этот пример: devexchanges.info/2015/04/…