在android中调用soap webservice

阿西尔·阿兹科兰

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

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

在此链接中,您可以看到我需要发送到网络服务的请求 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 ();
        }
    }
}
罗希特

你可以在 中做任何 UI 相关的操作doInBackGround,所以在onPostExecutemethnod 中移动它们

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Call SOAP webservice in Phonegap for Android

来自分类Dev

使用SOAP调用Webservice方法时出错

来自分类Dev

How to connect localhost SOAP webservice to my android

来自分类Dev

使用android改造请求soap wcf webService

来自分类Dev

使用Java对WebService的SOAP请求

来自分类Dev

Java soap调用将.XML文件传递给WebService

来自分类Dev

使用WinHttp调用RESTFul WebService

来自分类Dev

从soap webservice传递xml响应以保存在表中

来自分类Dev

如何从 PHP 中的 SOAP WebService 的 WSDL 创建对象?

来自分类Dev

通过WebService Android阅读JSON

来自分类Dev

通过WebService Android阅读JSON

来自分类Dev

使用webService的Android小部件

来自分类Dev

在php中处理webservice对象?

来自分类Dev

从Android中的WebService获取数组列表

来自分类Dev

Android Webservice中的java.lang.NullPointerException

来自分类Dev

将请求发布到Android中的WebService

来自分类Dev

WebService生成的C#代码在以前的WebService版本中丢失

来自分类Dev

通过对等呼叫soap Webservice重置连接

来自分类Dev

使用android中的android volley库使用参数调用dotnet asmx webservice

来自分类Dev

从jQuery安全地调用安全的WebService

来自分类Dev

Webservice动态调用+获取原始数据

来自分类Dev

通过jquery Ajax调用WebService的问题

来自分类Dev

在WebService连接方法之前调用viewDidAppear

来自分类Dev

调用WebService后不显示UIActivityIndicator

来自分类Dev

通过jquery Ajax调用WebService的问题

来自分类Dev

通过Get调用Webservice的最佳方法

来自分类Dev

如何调用和获取json webservice?

来自分类Dev

调用带有服务参考的WebService

来自分类Dev

错误500从C#调用WebService