App Inventor是一个用于开发Android应用的快速应用开发(RAD)工具,它提供了许多有用的功能,但在与Web服务通信方面支持有限。使用App Inventor开发的Android应用只能通过TinyWebDb接口与Web服务通信。TinyWebDb是一个简单的基于Web的键值数据库接口,它只有两个方法:StoreValue和GetValue。本文将介绍如何使用WCF服务实现TinyWebDb接口,从而实现Android应用与.Net代码之间的通信。
WCF(Windows Communication Foundation)是微软在.NET框架中创建的一项技术,用于构建连接的、面向服务的应用程序。要了解如何使用WCF创建Web服务,请参考以下文章:
App Inventor是一个非常简单的基于Web的Android视觉编程工具,不需要任何Java技能或Android应用程序生命周期知识。要了解App Inventor,请参考以下文章:
TinyWebDb API是一个RESTful接口,意味着它使用基本的HTTP请求,如GET或POST(与更复杂的协议如SOAP或CORBA相比,后者使用特定协议的请求格式)。TinyWebDb接口有两个方法:StoreValue和GetValue。
StoreValue方法通过HTTP POST请求调用,带有两个文本参数“tag”和“value”。URL格式为:{ServiceURL}/storeavalue。请求格式为XML,内容类型为“application/x-www-form-urlencoded”。这是WCF服务的默认值,因此在方法定义中不需要特别说明。响应格式为JSON:["STORED", "{tag}", {value}],例如:["STORED", "testValue", "\"Hello World!\""]。
GetValue方法通过HTTP POST请求调用,带有一个文本参数“tag”。URL格式为:{ServiceURL}/getvalue。与StoreValue一样,请求格式为XML,默认内容类型。响应格式为JSON:["VALUE","{tag}", {value}],例如:["VALUE", "testValue", "\"Hello World!\""]。
打开VS 2010,选择新建项目,然后选择WCF ->WCF服务应用程序。右键单击项目,选择“添加”->“新建项”->“WCF服务”。将添加两个文件:接口(以I开头,以.cs结尾,例如IMyService.cs)和服务(以.svc结尾,例如MyService.svc)。
打开接口文件。在这里,需要为StoreValue和GetValue方法定义操作合同。以下代码可以实现这一点:
[ServiceContract]
public interface IMyService
{
[OperationContract(Name = "getvalue")]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "getvalue")]
string[] getvalue(Stream data);
[OperationContract(Name = "storeavalue")]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "storeavalue")]
string[] storeavalue(Stream data);
}
在这里,明确指定了HTTP请求类型(两种情况都是POST),响应格式(JSON)和返回类型(字符串数组,它将自动转换为JSON格式[“string1”,“string2”,…])。
打开服务文件,并实现上述接口。为了简单起见,硬编码了返回值。在现实生活中,必须在这两个过程中实现一些有意义的业务逻辑:
public class MyService : IMyService
{
public string[] getvalue(Stream data)
{
StreamReader sr = new StreamReader(data);
string stringData = sr.ReadToEnd();
string tag = stringData.Substring(4);
string[] resultStringArray = new string[3];
resultStringArray[0] = "VALUE";
resultStringArray[1] = "testValue";
resultStringArray[2] = "Hello World!";
return resultStringArray;
}
public string[] storeavalue(Stream data)
{
StreamReader sr = new StreamReader(data);
string stringData = sr.ReadToEnd();
string tag = stringData.Substring(4, stringData.IndexOf("&value=") - 4);
string value = stringData.Substring(stringData.IndexOf("&value=") + 7);
string[] resultStringArray = new string[3];
resultStringArray[0] = "STORED";
resultStringArray[1] = "testValue";
resultStringArray[2] = "Hello World!";
return resultStringArray;
}
}
打开Web.config文件,并进行一些必要的更改,以便RESTful JSON工作。这意味着需要定义webHttpBinding和mexHttpBinding,并定义服务的httpGetEnabled="true"和端点的webHttp:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="WcfRestBased.MyService" behaviorConfiguration="myServiceBehavior">
<endpoint name="webHttpBinding" address="" binding="webHttpBinding" contract="WcfRestBased.IMyService" behaviorConfiguration="webHttp">
</endpoint>
<endpoint name="mexHttpBinding" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
为了指定正确的服务名称,右键单击服务并选择“查看标记”选项。现在构建项目并部署到主机。如果打算使用本地Wi-Fi访问Web服务器,可以使用localhost IIS托管,如这里所述:
访问,点击“创建”以创建新项目。如果是第一次访问App Inventor,系统会提示注册。将看到一个空项目,如下所示:
将2个标签和2个按钮拖到屏幕上。打开“存储”类别,在调色板中拖动“TinyWebDb”组件到屏幕上。它将被添加到“非可见组件”列表中。
在TinyWebDb组件的属性中,将ServiceURL更改为新创建的服务的地址,例如:http://192.168.1.38/MyService.svc。如果不知道计算机的IP地址,点击“开始”,在搜索框中输入“cmd”,然后输入“ipconfig”。
点击App Inventor编辑器右上角的“块”按钮。这将打开项目代码。从“块”类别中拖动代码组件,直到应用程序看起来像这样:
现在需要在真实的Android设备上测试应用程序。首先,从Google Play商店安装应用程序“MIT AI2 Companion”到Android设备。接下来,在App Inventor的项目页面上,点击“连接”->“AI伴侣”。使用屏幕上显示的QR码或文本代码将Android设备连接到项目。
当新创建的应用程序在Android设备上打开时,点击“存储值”和“获取值”按钮。应该看到应用程序从Web服务器收到响应。