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

Android调用Web服务

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

声明服务调用需要的地址和方法

private String nameSpace="http://www.juame.edu";//和wcf服务契约特性的Namespace是一样的
private String url="http://172.21.212.54:8888/TestService.svc";//svc服务地址
private String soapAction="http://www.juame.edu/JuameService/Add";//操作地址
private String methodName="Add";//方法名称

上面声明的服务地址、命名空间、操作地址和方法名称都可以从服务的wsdl文档中查看,

2016_10_bab1b9f2-cb82-4092-a3e3-e3fc133b4186

下面利用ksoap2对服务进行调用的代码如下。

protected SoapObject getSoapResult(int op1,int op2){
    SoapObject outObject=new SoapObject(nameSpace,methodName);
    //添加输出参数
    outObject.addProperty("op1", op1);
    outObject.addProperty("op2",op2);
    
    SoapSerializationEnvelope serializationEnvelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);//设置soap版本
    
    serializationEnvelope.bodyOut=outObject;
    serializationEnvelope.dotNet=true;//调用.NET的服务
    
    HttpTransportSE transportSE=new HttpTransportSE(url);
    transportSE.debug=true;//采用调试

    try{
        transportSE.call(soapAction, serializationEnvelope);//调用服务
        SoapObject result=(SoapObject)serializationEnvelope.bodyIn;//获取调用结果
        Log.v("happy1", "服务调用成功");
      //把结果封送到消息中去,让ui线程显示
        Bundle bundle=new Bundle();
        bundle.putString("result", result.getProperty(0).toString());//获取结果中的值
        Message message=new Message();
        message.setData(bundle);
        message.what=12;
        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;
}

按钮事件代码,采用多线程。在android3.0后,有关网络资源的调用代码都不能直接在主UI线程中调用,否则会出现android.os.NetworkOnMainThreadException异常。关于android中的多线程机制有时间再进行总结。

//绑定按钮事件
btnJlx.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(10, 20);
    }
};
//消息处理
Handler hander = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what=12){
            lblResult.append(msg.getData().getString("result")+"rn");
        }
    }
};

到目前为止,我们已经调用了wcf服务第一个服务,就说明传递基类型是没有问题。但是很遗憾的是,对于传递复杂类型和数组集合参数进行调用,在服务那边总是提示无法对传递进来的数据进行反序列化的错误(希望高手指点)。还好我们可以把所以的服务类型都转为json数据,通过json数据进行传递调用,就可以解决复杂类型传递的问题。

对于有强迫症的我来说,不甘心,因为在网上看了许多的教程,利用Ksoap2是可以直接传递复杂类型的来调用.NET平台的服务的。不过网上大部分教程调用的都是传统的webservice服务(asmx文件),于是我就在wcf服务项目中新建一个传统的asmx文件,提供的服务与wcf服务一样的。结果发现,果然能够利用ksoap2传递一个复杂类型来调用服务。下一节总结利用ksoap2传递复杂对象来调用传统的webservice服务。

3 传统的WebService服务

为了和wcf服务进行对比,webservice提供的服务和wcf一致,代码如下:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public int Add(int op1, int op2)
    {
        return op1 + op2;
    }
    [WebMethod]
    public string PostPeopleInfo(People people)
    {
        return "姓名:" + people.Name + "/" + "年龄:" + people.Age; 
    }
}

其中WebService特性中的Namespace属性和wcf的Namespace的作用一样的。

同样的也在iis中进行发布。发布成功之后,能够访问到asmx文件。

4 Android调用WebService服务

不管是调用WCF的服务还是WebService的服务,传递基类型去调用,代码都是一样的,且能够正确的调用。下面利用复杂的People类型来调用WebService的服务。

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

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

热点阅读