加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Axis2_webService基于REST学习笔记

发布时间:2020-12-17 00:21:20 所属栏目:安全 来源:网络整理
导读:????? 最近在研究REST发布服务的方式,看了几个框架都一头雾水,后来还是用比较熟悉的Axis2来学习,Axis2 除了提供传统的 webservice 方法外,还提供了对 Rest 的支持。 Axis2 同时提供 WS-* 风格的接口和 REST 风格的接口, Axis2 已经可以配置作为 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包放在tomcatwebappsaxis2WEB-INFservices下,启动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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读