使用Axis2构建REST Service

    本文讲解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版本也能够成功。
相关文章
相关标签/搜索