加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Android调用Web服务

发布时间:2016-10-28 22:14:42 所属栏目:教程 来源:站长网
导读:副标题#e# 现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了。本文总结如何在android中调用Web服务,通过传递基类型和复杂类型对比调用.NET平台发布的WCF服务

我们需要传递复杂类型,首先我们要在android中建立一个复杂类型,并且复杂类型包含字段名称和个数一定要与服务上的复杂类型保持一致,对于服务的复杂类型具有哪些字段,我们可以通过查看服务调用的示例得知。如下图所示。

2016_10_485cf694-7bf4-409c-9074-a849cc9cb329

根据上面复杂类型的字段说明,我们在android中建立复杂类型(类型名可以随意),包含两个字段且字段名称必须是Age和Name,数据类型也要一致,上面的这个people代表该复杂类型形参名为people(服务调用的时候必须要保持一样)。需要注意的是,这个复杂类型必须要继承KvmSerializable,这样ksoap2进行服务调用的时候,能够把people对象序列化为服务端能够接受的格式。代码如下:

public class People implements KvmSerializable {      
    public int Age;  
    public String Name;  
    @Override  
    public Object getProperty(int arg0) {           
        switch (arg0){  
            case 0:  
                return Age;  
            case 1:  
                return Name;  
            default:  
                return null;  
        }  
    }  
   
    @Override  
    public int getPropertyCount() {  
        return 2;  
    }  
  
    @Override  
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {           
        switch (arg0){  
            case 0:{  
                arg2.type = PropertyInfo.INTEGER_CLASS;  
                arg2.name = "Age";  
                break;
            }  
            case 1:{  
                arg2.type = PropertyInfo.STRING_CLASS;  
                arg2.name = "Name";  
                break;
            }  
        }          
    }  
    
    @Override  
    public void setProperty(int arg0, Object arg1) {           
        switch (arg0){  
            case 0:{  
                Age = Integer.parseInt(arg1.toString()) ;  
                break;
            }  
            case 1:{  
                Name = arg1.toString();  
                break;
            }  
        }   
    }  
}   

下面是传递复杂对象调用web服务,其中服务地址、操作地址、方法名以及命名空间和前面一样,只需要在服务说明wsdl文档中找operation name节点和operation soapAction节点的值即可,其他地方也类似,只是在封装soapobject的时候有一些区别,代码如下:

//地址声明
private String nameSpace="http://tempuri.org/";
private String url="http://172.21.212.54:8888/WebService.asmx";
private String soapAction="http://tempuri.org/PostPeopleInfo";
private String methodName="PostPeopleInfo";

//服务调用
protected SoapObject getSoapResult() {
    SoapObject outObject = new SoapObject(nameSpace, methodName);

    People people = new People();
    // 设置字段值
    people.setProperty(0, 23);
    people.setProperty(1, "Juame");

    // 设置SoapObject对象
    outObject.addProperty("people", people);
    //也可以这样设置SoapObject
    /*PropertyInfo peoInfo = new PropertyInfo();    
    peoInfo.setName("people");    
    peoInfo.setValue(people);
    peoInfo.setType(People.class); 
    outObject.addProperty(peoInfo);*/
  
    SoapSerializationEnvelope serializationEnvelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);//设置soap版本
    // 这一步添加映射非常关键
    // 第一个参数为命名空间,第二参数为服务器中复杂类型的名称,第三参数是安卓的复杂类型
    serializationEnvelope.addMapping(nameSpace, "People", People.class);

    serializationEnvelope.bodyOut = outObject;
    serializationEnvelope.dotNet = true;// 调用.NET的服务

    HttpTransportSE transportSE = new HttpTransportSE(url);
    transportSE.debug = true;// 采用调试

    try {
        transportSE.call(soapAction, serializationEnvelope);// 调用服务
        Log.v("happy1", "服务调用成功");
        SoapObject result = (SoapObject) serializationEnvelope.bodyIn;
       //把结果封送到消息中去,让ui线程显示
        Bundle bundle = new Bundle();
        bundle.putString("result",result.getProperty(0).toString());
        Message message = new Message();
        message.setData(bundle);
        message.what = 11;
        hander.sendMessage(message);
        return result;

    } catch (IOException ex) {
        Log.v("sad", "IO异常");
        ex.printStackTrace();
    } catch (XmlPullParserException ex) {
        Log.v("sad", "xml解析异常");
        ex.printStackTrace();

    } catch (Exception ex) {
        Log.v("sad", "服务调用异常异常");
    }

    return null;
}
//按钮事件
btnObj.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub       
        Thread thread = new Thread(getSoapRequest);
        thread.start();
    }
});
//线程
Runnable getSoapRequest=new Runnable() {
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        getSoapResult();
    }
};
//消息处理
Handler hander = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what=11){
            lblResult.append(msg.getData().getString("result")+"rn");
        }
    }
};

上面的代码就能够传递复杂类型去调用WebService的服务,返回结果如下:

姓名:Juame/年龄:23

5 简述Wcf与WebServic的区别

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读