科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道设计移动 Web 服务

设计移动 Web 服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

从何时选择移动 Web 服务到总体设计指导原则再到用于移动 Web 服务的值类型,本文提出了在设计用于移动设备的 Web 服务时需要考虑的许多设计事项。文中还介绍了许多设计移动 Web 服务方面的最佳实践。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

移动 Web 服务的设计考虑事项

我已经讨论了设计 Web 服务的指导原则,现在我将把重点放在移动 Web 服务的考虑事项上。在大多数情况下,当将 JAX-RPC 值类型用于移动 Web 服务时需要考虑一些事情。JAX-RPC 值类型(遵循 JSR-101)是 Java 类,其值可以在服务客户端和服务端点之间移动。为了获得一致的值类型,必须遵循一系列规则。我只列出其中的几条,与本文关系最大的规则是:

  • 您必须具有公共缺省构造器。
  • 您必须具有用于需要在网络上传输的字段的 setter 和 getter 方法。
  • 在处理数据集合时您应该使用数组。
  • 移动 Web 服务中有一些首选的数据类型。
  • 在处理输入和输出参数时注意可能出现的问题。

您必须具有公共缺省构造器

在反序列化的过程中,SOAP 运行时环境使用缺省构造器来构造对象。如果您试图在没有公共缺省构造器的情况下编写值类型(也称为数据传输对象),在当 JAX-RPC 运行时尝试序列化和反序列化数据对象时可能会遇到错误。对于像 IBM Rational® Application Developer (RAD) 6.0 这样的 IDE,将不为该数据类型生成序列化和反序列化 Helper 类(由 RAD 通过前缀 _Helper、_Ser 和 _Deser 生成),所以在调用与自定义数据类型相关的方法时会出现序列化错误。不带参数的构造器确保可以根据序列化状态远程构造对象。

您必须具有用于网络传输字段的 setter 和 getter 方法

首先,看一看清单 5 中的类 FailTask 的源代码:



清单 5. FailTask 类的定义

public class FailTask {
    /**
     * The owner of the task
     */
    private int ownerid;
    /**
     * The name of the task
     */
    private String name;
    
    /**
     * Default public non-argument constructor 
     *
     */
    public FailTask(){
    	
    }
    /**
     * Constructor of FailTask class
     * @param ownerid Owner of the task
     * @param name Name of the task
     */
    public FailTask(int ownerid, String name){
    	this.ownerid = ownerid;
    	this.name = name;
    }
    
    /**
     * Getter method
     * @return the ownerid of the task
     */
    public int getOwnerid(){
    	return ownerid;
    }
    
    /**
     * Setter method
     * @param ownerid the ownerid to be set
     */
    public void setOwnerid(int ownerid){
    	this.ownerid = ownerid;
    }
  }

您可以将清单 6 中所示的方法添加到 Web 服务中,该方法将返回单个 FailTask 对象。



清单 6. 返回 FailTask 对象的方法

public FailTask getFailTask(int ownerid, String name){
		return new FailTask(ownerid, name);
	}

当使用 RAD 6.0 附带的 Universal Test Client 中的 1 和 Rachel 参数调用 getFailTask() 方法时,所得到的响应如图 1 中所示。



图 1. Universal Test Client 中的响应视图
Universal Test Client 中的响应视图

name 字段在哪里?它不在这里,因为我没有通过 getter 和 setter 方法提供 name 字段。Setter 和 getter 方法是必须提供的两个方法。和 FailTask_Ser 类中一样,name 字段 getter 方法用于将 name 字段值写入 SOAP 消息。在 FailTask_Deser 类中,name 字段 setter 方法用于设置反序列化的 FailTask 对象的 name 值。

在处理数据集合时您应该使用数组

为了有效地使用 Web 服务,您必须或多或少地使用数据集合。但是,必须提醒:当处理许多值类型时,事情会变得比较麻烦,因此需要考虑以下问题。

当需要动态长度的数组时,请考虑 ArrayList。您已经反复听说过,如果不考虑同步,则 ArrayList 比 Vector 更有效。但遗憾的是,JSR-101 JAX-RPC 规范没有强制要求支持 Java Collection 类型。有些 Web 服务引擎可能没有为 ArrayList 提供支持。例如,IBM Web 服务引擎只正式支持 Java Collection Framework 中的一小部分类,包括 java.util.Vector、java.util.HashTable 和 java.util.HashMap。

那么,尝试一下另一个动态数组 Vector 会如何呢?如果在相同平台上生成存根文件,它将正常工作。但是,如果在不同的平台上生成存根文件,则将遇到一些问题。例如,在 Web 服务描述语言 (WSDL) 文件中,Vector 或其他 Collection 类型映射到 ArrayOfAnyType。其他平台可能不知道将其映射到哪个 Collection 类型,而且 Vector 中包含的数据元素也映射到 WSDL 中的 AnyType。(这里存在的一个大问题是,其他的平台不知道 AnyType 代表什么类型。)有关该主题的详细信息,请参阅参考资料中的“ Web services programming tips and tricks: Improve the interoperability between J2EE and .NET ”。

使用数组的最后一个原因是,移动 Web 服务不支持 Java Collection 类型,这使得所有其他的解释都显得没有必要。这意味着您可能无法从形式良好的 WSDL 文件为移动 Web 服务生成存根文件。

移动 Web 服务中的首选的一些数据类型

使用基元类型 long 传输 Date 或 Calendar 表示形式

对于标准 JAX-RPC 运行时实现,有两种支持的标准类型映射:

  • Java 类型到 XML 数据类型
  • XML 数据类型到 Java 类型

在 JAX-RPC 子集规范中,只需要第二种映射。表 1 显示了从支持的 XML 数据类型到 Java 类型的映射的简要列表;有关详细信息,请参阅 JSR-172。



表 1. 从 XML 数据类型到 Java 类型的映射

简单 XML 类型 Java 类型
xsd:string java.lang.String
xsd:int int
xsd:long long
xsd:short short
xsd:boolean boolean
xsd:byte byte
xsd:float java.lang.String 或 float
xsd:double java.lang.String 或 double
xsd:QName javax.xml.namespace.QName
xsd:base64Binary byte[]
xsd:hexBinary byte[]

从表 1 中您可以清楚地看出,该列表中不存在像 xsd:dateTime、xsd:date 或 xsd:time 这样的元素,而在标准 JAX-RPC 规范中,这三个元素确实是映射到 java.util.Calendar 的 XML 类型。请注意,在 JAX-RPC1.1 中定义的 Java 据类型映射到 XML 类型的映射中,java.util.Date 映射到 xsd:dateTime。

那么,在尝试传输日期或时间表示形式时,您应该使用什么?改为使用 long 类型的时间。long 类型的日期格式与不同时区的时间表示形式无关,并且因为它是基元类型,所以比其他类型的 Java 对象更有效。

 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章