java - 在android中调用soap webservice

标签 java android xml web-services android-ksoap2

我需要在 Android 设备中调用 SOAP 网络服务。我已经在 stackoverflow 和其他页面上阅读了很多文章,观看了视频...但是我已经尝试了所有方法,但无法使其在我的 Android 设备上运行,并且无法在模拟器上进行测试,因为我的电脑无法处理其中任何一个,所以我不知道错误是否出在代码上,或者是否是我的 Android 设备的问题。

布局 xml 只有一个 EditText、一个 Button 和一个 TextView。

在此链接中,您可以看到我需要发送到 Web 服务的请求 xml(我应该使用 SOAP 1.1 还是 SOAP 1.2?) http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry

这是我的实际代码,我尝试了很多其他方法,但没有一个对我有用。有什么帮助吗? (url、namespace、soap_action 和 method_name 值都可以,不是吗?)

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

最佳答案

您可以在doInBackGround中执行任何与UI相关的操作,因此将它们移至onPostExecute方法中。

因为doInBackGround不是UI线程。请仔细阅读AsyncTask文档。无论您从 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 ();
    }
}

关于java - 在android中调用soap webservice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43088447/

相关文章:

xml - JSF 2 - 如何在 HTML 输出中保留 XML 实体定义?

ruby - 使用 Nokogiri 从空标签中递归清理 XML 文档?

android - Google Play 计费库 - querySkuDetailsAsync 偶尔会返回 BillingResponseCode.ERROR (6)

Android O 自动位置建议功能(又名自动填充),如何关闭

xml - 如何在 PowerShell 中添加 XML 命名空间作为属性前缀?

java - Hibernate 在列中插入自动编号

Java计算器,如何处理负数

java - Urban Airship 推送码

java - 如何在特定键处启动 Jackson JSON ObjectMapper?

android - Intent 始终为 null onStartCommand