您的位置:首页 > 其它

Axis2_webService基于REST学习笔记

2013-05-06 15:48 330 查看
最近在研究REST发布服务的方式,看了几个框架都一头雾水,后来还是用比较熟悉的Axis2来学习,Axis2除了提供传统的webservice方法外,还提供了对Rest的支持。Axis2同时提供WS-*风格的接口和REST风格的接口,Axis2已经可以配置作为REST容器来发送和接收RESTful
Web Service请求和应答。这让Axis2的灵活性、易用性、安全性和可靠性等都得到大幅度地提升。
虽然做了个例子了解了,但真正项目中还没使用到,还需要继续学习吧,有在项目中用过的童鞋也可以互相交流一下。
1、准备工作
新建Axis2Rest工程项目,注意需要自己将jar文件复制到lib下,并加入工程引用。
1)web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="wmf" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 	<servlet>
		<servlet-name>AxisServlet</servlet-name>
		<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>
</web-app>


2)services.xml内容如下:
<service name="AxisService">
	<description>AxisService</description>
	<parameter name="ServiceClass">ws.TestWs</parameter>
	<operation name="showName">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</operation>
	<operation name="getName">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	</operation>
</service>


3)项目目录如下:



4)创建TestWs.java类:
package ws;

public class TestWs {
	public int showName(String name) {
		if(name.equals("aaa")) {
			return 200;
		} else if(name.equals("bbb")) {
			return 300;
		} else {
			return 400;
		}
	}
	
	public String getName(String name) {
		return "hello";
	}
	 
}


5)打包工程为.aar
然后把.aar包放在tomcat\webapps\axis2\WEB-INF\services下,启动tomcat,
一切正常的话,访问http://localhost:8081/axis2/services/REST_Service?wsdl将会看到如下界面。



2、调用Axis2的rest服务
1)REST_Service提供showName方法,传递rest字符串,如下。http://localhost:8081/axis2/services/REST_Service/showName?name=aaa



从上面可以看出这个就是rest风格,Axis1.0是无法通过showName?name=rest来获取信息的。
2、使用axis客户端调用
package ws;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

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;

public class ClientTest {
	private static String toEpr = "http://localhost:8081/axis2/services/REST_Service";
	 
	public static void main(String[] args) {
		 Options options = new Options();
		 options.setTo(new EndpointReference(toEpr));
		 options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
		//客户端REST方式调用服务跟普通服务的区别,REST调用必须加上下面这个代码。
		 options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
		 try {
			ServiceClient sender = new ServiceClient();
			sender.setOptions(options);
			OMElement result = sender.sendReceive(getPayload());
			
			XMLStreamWriter write = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
			result.serialize(write);
		} catch (AxisFault e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
	}

	private static OMElement getPayload() {
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace omNs = fac.createOMNamespace("http://ws", "xsd");
		OMElement method = fac.createOMElement("showName", omNs);
		OMElement value = fac.createOMElement("name", omNs);
		value.addChild(fac.createOMText(value, "bbb"));
		method.addChild(value);

		return method;
	}
}



说明:

1、sender.engageModule(new QName(Constants.MODULE_ADDRESSING)); axis2-1.5.4不需要下面这句代码,否则会报错
2、客户端REST方式调用服务跟普通服务的区别,就是Rest有下面这个代码;

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

两者返回的数据都是
<ns:showNameResponse xmlns:ns="Resthttp://ws"><ns:return>300</ns:return></ns:showNameResponse>
3、getPayload方法
OMNamespace omNs = fac.createOMNamespace("http://ws", "xsd");指定命名空间,如果没对的话会报如下错误<faultstring>namespace
mismatch requirehttp://ws foundhttp://ws1</faultstring>
OMElement method = fac.createOMElement("showName", omNs);要传递的方法名为 "showName"
OMElement value = fac.createOMElement("name", omNs);传递的参数为name
value.addChild(fac.createOMText(value, "Rest")); 传递参数name的值为Rest。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: