android studio + .Net webservice 连接

android studio连接visual studio开发的程序主要分为两部分:第一部分是先在visual studio端开发一个webservice服务,第二部分是在android studio端调用webservice端的服务。

android studio版本:android-studio-ide-141.2178183-windows
visual studio 版本:visual studio 2012

webservice端服务

  1. 文件-》新建-》网站-》Asp .Net空网站

    android studio + .Net webservice 连接_第1张图片

  2. 添加新项

    android studio + .Net webservice 连接_第2张图片

  3. 先择Web服务

    android studio + .Net webservice 连接_第3张图片

  4. 呈现如下图所示状态。在这里可以看到一个HelloWorld()函数,这个函数返回一个字符串”Hello world”,我们在Android studio中要做的是把这个”Hello world”字符串显示在手机上。同时在这里也可以返回数据库中的数据,显示到手机上,可以参考一下http://blog.csdn.net/zhyl8157121/article/details/8169172这篇文章。本文也是参考的这篇文章,只是所用平台不一样。
    android studio + .Net webservice 连接_第4张图片

  5. 这时候执行一下会在浏览器中看到如下画面:

    android studio + .Net webservice 连接_第5张图片

  6. 下面我将这个网站发布一下(有关内容可以百度一下win7 IIS的配置以及网站发布等有关知识)。另外电脑开visual studio 和 android studio两个软件实在是卡,发布完了之后就可以将visual studio关了,直接在浏览器中访问了。

    android studio + .Net webservice 连接_第6张图片

使用android studio 调用Web Service

以下部分内容参考<<疯狂Android讲义>>
1. 新建一个android空项目,最小SDK:API 15: Android 4.0.3
android studio + .Net webservice 连接_第7张图片
2. Google为Android平台开发Web Service客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还需要开发人员自行下载。为Android应用增加ksoap2-android运行请按如下步骤进行:

  1.1 登录http://simpligility.github.io/ksoap2-android/getting-started.html站点,下拉一直到如下界面。(另:再见,Google Code,你好,GitHub)
  android studio + .Net webservice 连接_第8张图片
  此时最新为3.5.0,我下载的是3.3.0。
  android studio + .Net webservice 连接_第9张图片
  1.2 切换到Project面板
  android studio + .Net webservice 连接_第10张图片
将ksoap2JAR包直接复制粘贴到app->libs目录下
android studio + .Net webservice 连接_第11张图片
   右键Add as Library…,弹出对话框,OK就行了。
  android studio + .Net webservice 连接_第12张图片
  
3. 先在activity_main.xml中添加一个按钮。代码如下:

"http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    

design界面如下图所示:
android studio + .Net webservice 连接_第13张图片
4. MainActivity.java

package com.tudou.demo;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {


    private Button btn1;
    private String result;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
                case 0:
                    Toast.makeText(MainActivity.this, "连接服务器失败", Toast.LENGTH_LONG).show();
                case 1:
                    Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
                default:
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.btn1);


        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BtnClick();
            }
        });
    }

    private void BtnClick() {

        final  String SERVICE_NS = "http://tempuri.org/";//命名空间
        final  String SOAP_ACTION = "http://tempuri.org/HelloWorld";//用来定义消息请求的地址,也就是消息发送到哪个操作
        final  String SERVICE_URL = "http://110.240.192.182/WebService.asmx";//URL地址,这里写发布的网站的本地地址
        String methodName = "HelloWorld";
        //创建HttpTransportSE传输对象,该对象用于调用Web Service操作
        final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
        ht.debug = true;
        //使用SOAP1.1协议创建Envelop对象。从名称上来看,SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对
        //SoapSerializationEnvelope的处理比较特殊,它是HttpTransportSE调用Web Service时信息的载体--客户端需要传入的参数,需要通过
        //SoapSerializationEnvelope对象的bodyOut属性传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
        final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        //实例化SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间、Web Service方法名
        SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
        //对dotnet webservice协议的支持,如果dotnet的webservice
        envelope.dotNet = true;
        //调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为
        //SoapSerializationEnvelope的付出SOAP消息体
        envelope.bodyOut = soapObject;

        new Thread(){
            @Override
            public void run() {
                try {
                    //调用WebService,调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
                    ht.call(SOAP_ACTION, envelope);
                    if(envelope.getResponse() != null){
                        //获取服务器响应返回的SOAP消息,调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个
                        //SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值
                        SoapObject so = (SoapObject) envelope.bodyIn;
                        //接下来就是从SoapObject对象中解析响应数据的过程了
                        result = so.getPropertyAsString(0);
                        Message msg = new Message();
                        msg.what = 1;
                        handler.sendMessage(msg);
                    }
                    else{
                        Message msg=new Message();
                        msg.what=0;
                        handler.sendMessage(msg);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

还有一步非常重要的步骤,就是在AndroidManifest.xml文件中添加对internet的访允许:Android.Manifest.xml


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tudou.demo" >
    
    <uses-permission android:name="android.permission.INTERNET">uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
    application>
manifest>
  1. 运行。运行这里需要说一下,我这里是用真机调试的。用真机调试之前先在电脑端开个无线wifi(笔记本直接开个360免费wifi,台式机买个360随身wifi安上就行了),然后用手机连上这个wifi,打开手机浏览器输入你发布网站的地址测试一下,看能不能访问之前发布的页面。我的也就是http://255.255.255.255/WebService.asmx这个地址(这里的IP地址是你网站发布的地址,我这里写的是假地址)。能访问之后,将手机用USB连接到电脑上,打开手机USB调试选项
    (这里最好将电脑上的360手机助手退出去,好几次连接手机失败都是360手机助手的事,好像是占了个端口什么的)。等一会看看左下角Android(1)面板中的(2)处有没有显示你手机。如果如下图所示,则显示连接上了。
    android studio + .Net webservice 连接_第14张图片
    如果(2)处显示的是红色的No Connected Devices,可以在cmd中切换到android-sdk->platform-tools下查看一下,命令为:adb devices。如下图,如果显示为下图所示的样子,证明手机连上了,可以运行了。
    android studio + .Net webservice 连接_第15张图片
    配置一下用USB设备启动。
    android studio + .Net webservice 连接_第16张图片
    android studio + .Net webservice 连接_第17张图片
  2. 程序构建之中(第一次运行的话用的时间稍微会长点,视电脑配置而定)
    构建之中
  3. 程序安装好
    android studio + .Net webservice 连接_第18张图片
  4. 点击屏幕上的“显示”按钮,显示”Hello World, This is my first app”

    这里我将webService中的返回字符串改了。

另外这里有几个问题想说一下:
1. 可能是在android2.3以上的版本中,必须将访问网络的代码写在一个新的线程中。也就是我访问网络的代码ht.call()写入了一个新线程的原因。
2. 如果想知道SOAP协议是什么样子的,可以直接在发布网站上的WebService页面点击一个方法名,在页面下方就可以看到SOAP各版本的请求及响应信息。这里列一个SOAP1.1版本的。


POST /WebService.asmx HTTP/1.1
Host: 10.204.92.182
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/HelloWorld"


<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <HelloWorld xmlns="http://tempuri.org/" />
  soap:Body>
soap:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length


<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <HelloWorldResponse xmlns="http://tempuri.org/">
      <HelloWorldResult>stringHelloWorldResult>
    HelloWorldResponse>
  soap:Body>
soap:Envelope>

OK,到这里就完了。^_^

你可能感兴趣的:(android)