当前位置: 首页 > 面试题库 >

在Android中呼叫Soap Web服务

荀振国
2023-03-14
问题内容

我需要在Android设备中致电Soap
Web服务。我已经在其他页面上阅读了很多文章,观看了视频…但是我尝试了所有方法,但是我无法使其在我的android设备上正常工作,也无法在模拟器上进行测试,因为我的计算机无法处理其中任何一个,所以我不知道错误是否在代码上,或者这是否是我的android设备的问题。

布局xml只是一个EditText,一个Button和一个TextView。

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

这是我的实际代码,并且我尝试了许多其他方法,但没有一种对我有用。有什么帮助吗?(URL,名称空间,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 ();
    }
}


 类似资料:
  • 我想在Android系统中拦截来电。一种方法是扩展“broadcastreceiver”。还有别的办法吗?

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户

  • 本章主要讲述智齿客服系统中,呼叫中心业务模块的全部介绍,将以呼叫管理员和呼叫客服两个角色来进行讲解; 同时还会单独介绍IVR的配置流程。 5.1.客服业务-作为呼叫管理员 作为呼叫管理员,在本节主要介绍呼叫管理员对企业下的呼叫客服成员以及呼叫相关业务设置进行的操作。 技能组管理 通话设置 呼叫质检评分方案设定 路由策略设置 队列溢出策略设置 IVR设置 号码管理 5.1.1.技能组管理 技能组包括

  • 这些文件来自于我的项目谁工作完美的另一个分支。 下面是我的脚本应该如何工作: 导航到“auth/login” 用户输入他的凭据 AuthService调用后端wepApi以获取承载令牌 后端返回令牌。 AuthService将他的var“is loggedin”设置为true; AuthService用于路由器导航到'/home' AuthGuard通过检查AuthService的“正在登录”来检

  • 在Android 10(Pixel 3A)中,通话记录器在持续时间内录制空白。它适用于所有手机,直到Android 8和Android 9,大多数手机只录制一侧语音(但在像素3A中工作正常) 有没有办法在Android10中录制通话? 下面的代码似乎不再工作了。 如果使用SDK 28或更低版本,则会在整个过程中进行通话录音,但没有任何语音。如果使用SDK 29,则通话录音开始时失败,提示检查回调中

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres