了解wsdl,以及使用RPC访问axis发布的服务

了解wsdl

简单说下基本的信息。(好吧,我承认我在划水)

  • 使用的POJO:
package com.axis2.publish.model;

public class UserModel {
	private String userName;
	private String cipher;
	private int age;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getCipher() {
		return cipher;
	}
	public void setCipher(String cipher) {
		this.cipher = cipher;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public UserModel(String userName, String cipher, int age) {
		super();
		this.userName = userName;
		this.cipher = cipher;
		this.age = age;
	}
}

  • 发布的服务
package com.axis2.publish;

import java.util.ArrayList;
import java.util.List;
import com.axis2.publish.model.UserModel;

public class Testservice {
	public String test(String test) {
		return "测试: "+test;
	}
	
	public List<UserModel> getUsersInfo(){
		UserModel user1 = new UserModel("zhangxu", "man", 22);
		UserModel user2 = new UserModel("sunhongluan", "woman", 22);
		List<UserModel> users = new ArrayList<>();
		users.add(user1);
		users.add(user2);
		return users;
	}
	
	public UserModel getUserInfo() {
		return new UserModel("zhangsan", "transgender", 34);
	}
}

P.S.关于wsdl的介绍,我想说的都在下面这张图片里了。(很水==,但是一看就懂)
在这里插入图片描述


使用RPC访问上面的服务和方法

在spring整合axis2的那篇文章里,使用RPC访问了一个输入类型为String,返回类型也为String的方法。虽然在使用axis2访问webservice那篇文章中,借助生成的代码我们实现了访问今天提到的三种方法。但不用RPC还是有点遗憾的。
P.S. 使用客户端生成代码,生成了UserModel这个类。所以一切就很简单。但RPC是不同的,我们没有任何的现成的代码,除了wsdl,我们什么都不知道。一切都要靠我们自己动手动脑。

package com.axis2.publish;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class TestUwca {
	public static void main(String[] args) throws RemoteException {
		try {
			String address = "http://localhost:8080/AXIS2Project/services/Testservice?wsdl";
			String nameSpace = "http://publish.axis2.com";

			EndpointReference eReference = new EndpointReference(address);
			RPCServiceClient rpc = new RPCServiceClient();
			rpc.setTargetEPR(eReference);
			
			// 测试UserModel getUserInfo()
			QName qname = new QName(nameSpace, "getUserInfo");
			Object[] objects1 = new Object[] {};
			OMElement omElement = rpc.invokeBlocking(qname, objects);
			List<Map<String, String>> list = getResults(omElement);
			list.forEach(new Consumer<Map<String, String>>() {

				@Override
				public void accept(Map<String, String> t) {
					t.forEach(new BiConsumer<String, String>() {

						@Override
						public void accept(String t, String u) {
							System.out.println(t +": "+u);
						}
					});
				}
			});
		} catch (AxisFault e) {
			e.printStackTrace();
		}

	}

	public static List<Map<String, String>> getResults(OMElement element) {
		if (element == null) {
			return null;
		}
		
		List<Map<String, String>> list = new ArrayList<>();
		
		Iterator<?> iterator = element.getChildElements();
		while (iterator.hasNext()) {
			OMElement result = (OMElement) iterator.next();
			Iterator<?> innerItr = result.getChildElements();
			Map<String, String> map = new HashMap<>();
			while (innerItr.hasNext()) {
				OMElement elem = (OMElement) innerItr.next();
				map.put(elem.getLocalName(), elem.getText());
			} 
			list.add(map);
		}
		return list;
	}

}

这部分代码最关键的是,我们设计了一个方法(getResults)去从OMElement对象中取值并将结果存放在List<Map<String, String>>之中。这样无论结果返回一个对象,或者一组对象都可以存放结果到这个list中。
下面是访问getUserInfo(上)和getUsersInfo(下)的结果:
在这里插入图片描述
在这里插入图片描述
好吧=_=; 我屈服了。
所以推荐大家去看一下参考【1】。正如作者在参考【2】中所说,访问天气服务的确有问题。
下面是参考【1】中使用的访问方法。copy一下,嘻嘻嘻~
访问我们自己的服务是没问题的。代码如下:

package com.axis2.publish;

import java.util.Iterator;
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.axiom.soap.SOAP11Constants;
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 WeatherService {
 
	public static void main(String[] args) throws Exception {
		EndpointReference epfs = new EndpointReference("http://localhost:8080/AXIS2Project/services/Testservice?wsdl");

		Options option = new Options();
		option.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
		option.setAction("http://publish.axis2.com/getUserInfo");
		option.setTransportInProtocol(Constants.TRANSPORT_HTTP);
		option.setTo(epfs);

		ServiceClient sender = new ServiceClient();
		sender.setOptions(option);
		
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace omNs = fac.createOMNamespace("http://publish.axis2.com", "");
		OMElement data = fac.createOMElement("getUserInfo", omNs);
		OMElement result = sender.sendReceive(data);
		System.out.println("OMElement: "+result); 
		//----------------
		Iterator in = result.getChildrenWithLocalName("return");
		while(in.hasNext()){
			OMElement om = (OMElement)in.next();
			Iterator in2 = om.getChildElements();
			while(in2.hasNext()){
				System.out.println(in2.next().toString());
				//System.out.println(((OMElement)in2.next()).getText());
			}
		}
	}
}

执行后的结果:
在这里插入图片描述


参考

【1】axis2客户端调用免费的webservice服务的实例之二纯手动调用免费天气预报webservice服务
https://blog.csdn.net/mingliangniwo/article/details/44218909
【2】axis2客户端调用免费的webservice服务的实例之三axis2使用RPC方式调用网上免费WebService
https://blog.csdn.net/mingliangniwo/article/details/44238481
【3】Axis2开发WebService客户端 的3种方式
http://harveyzeng.iteye.com/blog/1849720


尾巴:

P.S.:留给我自己

  • 如果要是传递一个对象是否可以?那么服务端方法如何书写?
  • 传递map过去如何?或者是Object[]?
  • 还要研究一下,addChild之后产生的xml是什么样的。(借助最简单的那种形式先验证)
  • 网上还有一种Call方式
  • 整理调用方式
    如果你有更好的方式或者能解决这些尾巴中的问题,欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值