本文讲解REST服务的概念和如何使用Axis2构建REST 服务。

    REST是的Representational State Transfer缩写,中文意思是表象化状态转换。维基百科上给出REST的宗旨是:REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表形。获得这些表形致使这些应用程序转变了其状态。随着不断获取资源的表形,客户端应用不断地在转变着其状态,所谓表形化的状态转变(Representational State Transfer)。
    REST是基于HTTP动词和标识资源的唯一的URI的,我们知道HTTP动词有GET,POST,PUT和DELETE,这也就对应我们常说的CRUD(create, Read, Update and Delete)。
    POST:    create
    GET:    read
    PUT:    update
    DELETE: delete

    REST的要求:
  • 客户端和服务器结构
  • 连接协议具有无状态性
  • 能够利用Cache机制增进性能
  • 层次化的系统
  • Code On Demand - Javascript
    这里实现一个使用Axis2构建REST服务例子。

Salary.java代码:

package  cn.edu.xidian;

public   class  Salary {
  
public   int  getSalary(String name) {
    
if  ( name.equals( "zhangsan" ) ) {
      
return  3000;
    }
    
else   if  ( name.equals( "lisi" ) ) {
      
return  4000;
    }
    
else 
      
return  5000;
  }
}

    使用axis2 service archiver发布成为web service,具体如何发布,参考:使用Eclipse+Axis2构建Web Service应用(http://panpan.blog.51cto.com/489034/119204),服务名称是SalaryService。
    在浏览器输入:http://localhost:8080/axis2/services/SalaryService/getSalary?name=zhangsan 
    即可看到服务返回信息:

< ns:getSalaryResponse >
< ns:return > 3000 </ ns:return >
</ ns:getSalaryResponse >

    写客户端代码,调用刚发布的SalaryService,代码如下。
RESTClient.java代码如下:

package  cn.edu.xidian;

import  org.apache.axiom.om.OMAbstractFactory;
import  org.apache.axiom.om.OMElement;
import  org.apache.axiom.om.OMFactory;
import  org.apache.axiom.om.OMNamespace;
import  org.apache.axis2.AxisFault;
import  org.apache.axis2.Constants;
import  org.apache.axis2.addressing.EndpointReference;
import  org.apache.axis2.client.Options;
import  org.apache.axis2.client.ServiceClient;

import  javax.xml.namespace.QName;
import  javax.xml.stream.FactoryConfigurationError;
import  javax.xml.stream.XMLOutputFactory;
import  javax.xml.stream.XMLStreamException;
import  javax.xml.stream.XMLStreamWriter;

public   class  RESTClient {

  
private   static  String toEpr =  "http://localhost:8080/axis2/services/SalaryService";

        public static void main(String[] args) throws AxisFault {

                Options options = new Options();
                options.setTo(new EndpointReference(toEpr));
                options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

                options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);

                ServiceClient sender = new ServiceClient();

                sender.setOptions(options);
                OMElement result = sender.sendReceive(getPayload());

                try {
                        XMLStreamWriter writer = XMLOutputFactory.newInstance()
                                        .createXMLStreamWriter(System.out);
                        result.serialize(writer);
                        writer.flush();
                } catch (XMLStreamException e) {
                        e.printStackTrace();
                } catch (FactoryConfigurationError e) {
                        e.printStackTrace();
                }
        }


        private static OMElement getPayload() {
                OMFactory fac = OMAbstractFactory.getOMFactory();
                OMNamespace omNs = fac.createOMNamespace(
                                "http://xidian.edu.cn", "xsd");
                OMElement method = fac.createOMElement("getSalary", omNs);
                OMElement value = fac.createOMElement("name", omNs);
                value.addChild(fac.createOMText(value, "lisi"));
                method.addChild(value);

                return method;
        }
}

    运行这段代码,结果如下:
<ns:getSalaryResponse xmlns:ns="http://xidian.edu.cn"><ns:return>4000</ns:return></ns:getSalaryResponse>

    注意:客户端REST方式调用服务跟普通服务的唯一区别就是这一句话:
options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);设置REST调用方式。

    REST有以下优点:
  • 可以利用缓存Cache来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对与其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好
    还要注意的是需要使用Axis2 1.4.1版本来发布REST服务,但是本人经过测试,Axis21.3版本也可以成功。