微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Axis2_webService基于REST学习笔记

      最近在研究REST发布服务的方式,看了几个框架都一头雾水,后来还是用比较熟悉的Axis2来学习,Axis2除了提供传统的webservice方法外,还提供了对Rest支持Axis2同时提供WS-*风格的接口和REST风格的接口,Axis2已经可以配置作为REST容器来发送和接收RESTful Web Service请求和应答。这让Axis2的灵活性、易用性、安全性和可靠性等都得到大幅度地提升。

      虽然做了个例子了解了,但真正项目中还没使用到,还需要继续学习吧,有在项目中用过的童鞋也可以互相交流一下。

1、准备工作

新建Axis2Rest工程项目,注意需要自己将jar文件复制到lib下,并加入工程引用。

1web.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>


2services.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调用Axis2rest服务

1REST_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>

3getPayload方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐