zoukankan      html  css  js  c++  java
  • Android基于ksoap2调用WCF服务(二):Android篇

    上一篇通过一个非常简单的例子,完成了一个WCF的服务。接下来介绍一下Android端。

    Android端调用WCF,采用基于ksoap2包来实现。

    下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/

    我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437

    程序的源代码下载地址:http://download.csdn.net/detail/cnryc/7694983

    1、新建一个Android Project,如图:

    很简单,就一个Activity。

    在AndroidManifest.xml里面增加访问网络的权限。

    <uses-permission android:name="android.permission.INTERNET"/>

    把ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar文件复制到安卓项目的libs文件夹下,

    回到Eclipse,刷新libs,在项目点击ksoap2包右键,选择Build Path>Add to Build Path ,OK。

    2、在activity_main.xml布局文件里增加一个Button:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context="com.imoonstal.invokewcf.MainActivity" >
    10 
    11     <TextView
    12         android:id="@+id/tv"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:text="@string/hello_world" />
    16     <Button
    17         android:layout_width="wrap_content"
    18         android:layout_height="wrap_content"
    19         android:layout_below="@id/tv"
    20         android:text="Invoke"
    21         android:onClick="btnClick" />
    22 
    23 </RelativeLayout>

    3、在MainActivity.java中增加按钮的btnClick方法和一个实现Runnable接口的内部类。

    好像从3.0的sdk开始,Android不允许主线程访问网络了,所以这里启了一个线程来访问wcf服务。

      public void btnClick(View v){
            new Thread(runnable).start();
        }
        
        Runnable runnable = new Runnable(){
    
            @Override
            public void run() {
                
                CallWebService();
            }
            
        };

    之后增加调用WCF服务需要的四个基本信息:

        static String NameSpace = "http://tempuri.org/";
        static String URL="http://10.0.2.2:8733/WCFLibrary/TestService/";
        static String SOAP_ACTION="http://tempuri.org/ITestService/GetString";
        static String MethodName="GetString";

    NameSpace是命名空间,在WCF程序里可以指定,如果不指定,默认是http://tempuri.org/

    URL就是服务里面的endpoint,在上一篇中的配置文件里有。值得注意的是Android的本机地址不是127.0.0.1而是10.0.2.2

    soapaction就是命名空间加上方法的名称

    methodName就是需要调用的方法的名称。

    这些内容都可以再wsdl那个地址里面找到。点下面那个?wsdl文件会得到wsdl的内容:

    点击最上面那个连接之后得到一个wsdl文件,如下:

    上面那个四个基本信息在这里都能找到。

    之后完成CallWebService()方法:

    public void CallWebService(){
            //指定的命名空间和调用的方法名 
            SoapObject request = new SoapObject(NameSpace, MethodName);
            
            //设置需调用接口需要传入的参数
            request.addProperty("value", "imoonstal");
            
            // 生成调用方法的SOAP请求信息,并指定SOAP的版本  
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);  
      
            // 下面这两句是一样的作用,写一句就行了
            envelope.bodyOut = request;         
            envelope.setOutputSoapObject(request);
            
            // 设置是否调用的是dotNet开发的WebService  
            envelope.dotNet = true;  
      
            HttpTransportSE transport = new HttpTransportSE(URL);  
            try {  
                // 调用  
                transport.call(SOAP_ACTION, envelope);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
      
            // 获取返回的数据  
            SoapObject object = (SoapObject) envelope.bodyIn; 
            if(null==object){
                return;
            }
            // 获取返回的结果  
            String result = object.getProperty(0).toString();
            
            System.out.println(result);
        }

    运行,显示结果:

    得到结果,表示调用成功。

    总结:

    1、Android调用WCF,实际上是调用的WCF发布出来的WebService,也就是wsdl地址,所以如果调用其他WebService也是可以的。

    2、WebService的四个基本信息分别是:命名空间、调用的方法名称、EndPoint和SOAP Action。

      当在浏览器中访问WSDL时,就可以得到命名空间、调用的方法名称,上面已经介绍了。

      URL或者说EndPoint可以从WCF的配置文件中获得,或者将WSDL地址去掉末尾的"?wsdl"。

      而SOAP Action通常为命名空间 + 调用的方法名称。

    3、传参数时,一定要按照方法中的参顺序传入“参数名,参数值”。

    4、版本号:可以从wsdl地址中得到,xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 表示版本是12。

      但实际我在调试代码的过程中发现如果把上面的代码

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);

      中的VER10改成VER12就会报错,错误提示是:http request failed http status 415

      具体原因我也没找到,明天继续找吧,找到了再来补充,有高手的话请把原因告诉我,cnryc@126.com。

      还有WCF的绑定方式要用basicHttpBinding而别用wsHttpBinding,网上有人说也会报415的错误,我没试过。

    5、地址和权限:

      android:name=”android.permission.INTERNET” 一定要写到 AndroidManifest.xml 中去,不然调试半天发现这个问题就郁闷了,我之前写程序经常犯这个错,哈哈。

      Android的本机IP地址: 10.0.2.2而不是127.0.0.1或者localhost,这样访问不了本地的。

    6、请用多线程异步访问网络,3.0开始Android强制异步访问。即使google没有强制要求,也应该异步操作。

      

     

  • 相关阅读:
    wtforms 钩子函数
    sqlalchemy 单表增删改查
    sqlalchemy 数据库操作
    flask wtforms组件
    python----------文件操作
    编码 编码的转化
    集合、深浅copy
    字典
    sort 、sorted、range、join方法 数字的正序、倒叙、翻转
    for循环
  • 原文地址:https://www.cnblogs.com/imoonstal/p/3878169.html
Copyright © 2011-2022 走看看