从 Android 调用 Web 服务

这是一篇关于开始使用 Android的持续博客。在早期博客中,提供了 Android 应用的架构概述,随后设置了 Android 开发环境并创建和运行了一个简单的应用。

在本博客中,将描述如何通过 Android 调用 Web 服务(基于 SOAP 的服务),下一篇博客将介绍如何调用基于 REST 的服务。尝试本教程需要按照之前博客[http://naveenbalani.com/index...]中所述设置 Android 开发环境。

调用 Web 服务有两种方式:

  • 原始 API:使用 HttpClient 和 XML 解析器手动创建 SOAP 请求并解析 SOAP 响应。
  • 使用 SOAP 客户端库:如 KSOAP 库,它负责解析和处理 SOAP 消息的底层工作 - 对于 Android,可在[http://code.google.com/p/ksoa...]获取库。看到 KSOAP 2 的活跃开发很不错,记得 2003 年就写过关于 KSOAP 2 的第一篇文章[http://naveenbalani.com/index...],很高兴它又在为 Android 开发。

将从后一种方法开始开发,但计划在后续帖子中使用原始 API。
下载 KSOAP2 库,前往[http://code.google.com/p/ksoa...],点击菜单上的下载链接,下载最新版本的工件 - [http://code.google.com/p/ksoa...]。在发布工件页面,点击“查看原始文件”并选择“另存为”下载包含所有必需依赖项的 jar 文件。

接下来创建一个示例 Android 项目,该项目将调用.NET Web 服务。在网站中托管一个简单的.NET Web 服务,服务地址为[http://naveenbalani.com/Wassu...]。

创建 Android 项目步骤:

  • 启动 eclipse。
  • 选择“文件>新建>项目”。
  • 选择“Android>Android 项目”,点击“下一步”。
  • 为项目输入以下信息:

    • 项目名称 - AndroidClientService
    • 构建目标 - Android 2.3
    • 应用名称 - WasuppTodaysMessage
    • 包名称 - org.android.websevice.client.samples
    • 创建活动 - AndroidClientService
    • 最小 SDK 版本 - 9
  • 点击“完成”。

为项目添加 ksoap2-andriod 依赖:选择 AndroidClientService,点击“属性”,点击“Java 构建路径”,点击“库”,选择“添加外部 JAR”并添加 ksoap2 库(ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar),然后点击“确定”。

打开 WasuppServiceClientAndroid 类,将 onCreate 方法替换为以下代码:

package android.websevice.client.samples;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class AndroidClientService extends Activity {
    private static final String SOAP_ACTION = "http://www.naveenbalani.com/webservices/WassupAndroidService/todaysMessage";
    private static final String OPERATION_NAME = "todaysMessage";
    private static final String WSDL_TARGET_NAMESPACE = "http://www.naveenbalani.com/webservices/WassupAndroidService/";
    private static final String SOAP_ADDRESS = "http://naveenbalani.com/WassupAndroid.asmx";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView = new TextView(this);
        setContentView(textView);
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
        try {
            httpTransport.call(SOAP_ACTION, envelope);
            Object response = envelope.getResponse();
            textView.setText(response.toString());
        } catch (Exception exception) {
            textView.setText(exception.toString());
        }
    }
}

运行 AndroidClientService Android 应用:点击它并选择“运行作为>Android 应用”。

在 eclipse 控制台中,会看到类似以下消息:
[AndroidClientService] 执行 android.websevice.client.samples.AndroidClientService 活动启动
[AndroidClientService] 自动目标模式:启动具有兼容 AVD‘AVD’的新模拟器
[AndroidClientService] 启动具有虚拟设备‘AVD’的新模拟器
[AndroidClientService] 等待 HOME(‘android.process.acore’)启动…
应看到 Android AVD 启动。上述消息后,首次在模拟器上获取 Android 主页需要一些时间(2 - 3 分钟)。

设备启动后,在控制台上应看到以下消息:
[AndroidClientService] 将 AndroidClientService.apk 上传到设备‘emulator-5554’
[AndroidClientService] 安装 AndroidClientService.apk…
[AndroidClientService] 成功!
[AndroidClientService] 在设备 emulator-5554 上启动活动 android.websevice.client.samples.AndroidClientService

如果应用未在模拟器上显示,点击模拟器上的“菜单”选项,应看到 WasuppTodayMessage Android 应用和显示的消息。

在 Android 模拟器中调用 Web 服务应用时遇到的问题:

  • 未知主机异常:如果得到“java.net.UnKnownHostException: naveenbalani.com”异常,需要添加模拟器将使用的必需域名服务器以解析域名。关于模拟器的网络限制列表可在[http://developer.android.com/...]获取。根据文档,启动时模拟器会读取系统当前使用的 DNS 服务器列表,然后在需要时在模拟地址 10.0.2.3、10.0.2.4、10.0.2.5 和 10.0.2.6 上设置别名。在 Linux 和 OS X 上,模拟器通过解析 /etc/resolv.conf 文件获取 DNS 服务器地址。在 Windows 上,模拟器通过调用 GetNetworkParams()API 获取地址。注意,这通常意味着模拟器忽略“hosts 文件”的内容。要添加域名服务器,点击“运行配置”并选择 AndroidClientService,在附加模拟器命令行选项中添加“-dns-server ns15.unitechost.in”,然后点击“运行”以运行配置。
  • 安全问题:如果在访问互联网时遇到权限问题,需要在<uses-permission android:name="android.permission.INTERNET"></uses-permission>中添加以下行以允许应用访问互联网。以下是完整的 AndroidManifest.xml 清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.websevice.client.samples" android:versionCode="1" android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AndroidClientService" 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>
    <uses-sdk android:minSdkVersion="9" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
阅读 11
0 条评论