来自SOAP Web服务的响应总是返回空的Android studio

来自SOAP Web服务的响应总是返回空的Android studio,android,soap,Android,Soap,我试图从几个SOAP Web服务中得到一些响应,最后我尝试运行了一个在internet上非常有名的示例代码。但我意识到,即使这样也不能在我的项目上运行。我几乎无法理解错误可能是什么,但我不知道为什么它不能与soap一起工作。 我非常感谢你的帮助 已下载KSOAP2的新版本,并已获得互联网许可 public class WEBSERVİCE extends AppCompatActivity { Button btn; EditText et; TextView txv; String celc

我试图从几个SOAP Web服务中得到一些响应,最后我尝试运行了一个在internet上非常有名的示例代码。但我意识到,即使这样也不能在我的项目上运行。我几乎无法理解错误可能是什么,但我不知道为什么它不能与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;
     }
}
公共类WEBSERVİCE扩展了AppCompative活动{
按钮btn;
编辑文本;
TextView热膨胀阀;
字符串celcius=“21”;
弦法伦;
私有字符串命名空间=”https://www.w3schools.com/xml/";
私有字符串方法\u NAME=“CelsiusToFahrenheit”;
私有字符串SOAP_ACTİON=”https://www.w3schools.com/xml/CelsiusToFahrenheit";
专用字符串URL=”https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit?WSDL";
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.按钮);
txv=findViewById(R.id.textView);
et=findViewById(R.id.editText1);
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
AsyncCallWS任务=新建AsyncCallWS();
task.execute();
}
});
}
私有类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
txv.setText(“计算”);
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
}
@凌驾
受保护的字符串doInBackground(字符串…对象){
返回getBolum(celcius);
}
@凌驾
受保护的void onPostExecute(字符串o){
txv.setText(法伦+F”);
super.onPostExecute(o);
}
}
公共字符串getBolum(字符串摄氏度){
SoapObject请求=新的SoapObject(名称空间、方法名称);
PropertyInfo pi=新的PropertyInfo();
pi.setName(“Celcius”);
设定值(摄氏度);
pi.setType(double.class);
请求。添加属性(pi);
SoapSerializationEnvelope=new
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
HttpTransportSE androidHTTPTransport=新的HttpTransportSE(URL);
试一试{
androidHTTPTransport.call(SOAP_ACTİON,信封);
SoapPrimitive响应=(SoapPrimitive)信封.getResponse();
fahren=response.toString();
}捕获(IOE异常){
e、 printStackTrace();
}catch(XMLPullParseRexE){
e、 printStackTrace();
}
返回法伦;
}
}
没有错误消息,但返回的值始终为“null”


编辑:再次发布更改的代码

SOAP Api没有任何问题。问题是你的班级。首先请阅读文档。请在使用任何来自互联网的代码之前进行适当的研究始终阅读互联网上使用的组件片段,否则您将很难找出问题所在

您的AsyncTask类声明为:

private class AsyncCallWS extends AsyncTask<String,Void,Void>
在异步任务中,需要将doInBackground的返回类型和onPostExecute的参数更改为字符串:

 @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,但它没有返回任何内容again@jacob看看onPostExecute(字符串o),参数名是“o”,但语句使用“fahren”。粘贴onPostExecute(),就像在我的代码中一样。Zohaib Amir我真的很感谢你的帮助,非常感谢。顺便问一下,我想问你是否知道另一个类似这样的SOAP Web服务,我可以用它来证明我在代码中这样做是正确的?也看看这个例子:这个api似乎给出了错误404。您应该尝试另一个有效的url。
//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 "";

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