了解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方式
- 整理调用方式
如果你有更好的方式或者能解决这些尾巴中的问题,欢迎留言。