`
tedygrate
  • 浏览: 30528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Axi2学习总结及如何在client端加入header头

阅读更多

最近项目用到WebService 要求用Axis2实现,以前没用过Axis2,最近把网上的资料加上自己的琢磨写在这里,网上大多介绍了服务端Service简单的传递字符串 和数组对象,没具体介绍传递对象里封装嵌套简单对象和数组对象,类似如下对象:

public class BuissnessInfo {

    //返回状态业务码;
	private String code;
	//数组对象;
	private User[] user;

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public User[] getUser() {
		return user;
	}

	public void setUser(User[] user) {
		this.user = user;
	}
}

 

好了,废话少说 直接贴图 配置Axis2 Webservice:

第一步:写服务端servcie:

public class HelloImpl {

	public BuissnessInfo getList(Prameters p)  throws  AppAxis2 {
		
	    System.out.println("p="+p.getCode());
		
	    System.out.println("p="+p.getCode2());
		
	    BuissnessInfo info = new BuissnessInfo();
		User user = new User();
		user.setId("1");
		user.setName("张三");
		
		User user1 = new User();
		user1.setId("2");
		user1.setName("李四");
		
		User user2 = new User();
		user2.setId("3");
		user2.setName("王五");
		
		User user3 = new User();
		user3.setId("4");
		user3.setName("小六");
		
		User[] users = new User[]{user,user1,user2,user3};

		info.setCode("00000000001");
		info.setUser(users);
		return info;
	}


}

 

public class User {
	private String id;
	private String name;

	private String errorCode;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

暴露服务接口方法:配置services.xml

<service name="Hello">

	<parameter name="ServiceClass">
		HelloImpl
	</parameter>
	<operation name="getList">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</operation>
</service>

 好了服务端生成好了 直接访问:http://127.0.0.1:8090/HelloWorld/services/Hello?wsdl 看是否发布成功;

客户端代码实现如下:客户端也是用axis2实现的,axis2实现的客户端调用方式比较多,为了能满足对象里封装对象数组和简单对象 的需求,我采用了stub ,用wsdl2java方式生成,命令如下:

%AXIS2_HOME%\bin\wsdl2java -uri http://127.0.0.1:8090/HelloWorld/services/Hello?wsdl -p client -s -o stub

 当然 wsdl2java 工具得上网上下,下载后 %AXIS2_HOME%类似于java_home 得配置下环境变量;

最后在 你的当前目录下会生成一个stub目录 里面有生成的客户端文件

客户端文件生成好后调用如下:

package client;

import java.rmi.RemoteException;

public class Client {

    public static void main(String args[]) throws RemoteException, AppAxis2Exception{
        
        HelloStub stub = new HelloStub();
        HelloStub.GetList gg = new HelloStub.GetList();
        HelloStub.Prameters param = new HelloStub.Prameters();
        param.setCode("test");
        param.setCode2("hello ");
        gg.setP(param);
      //调用
        HelloStub.BuissnessInfo info  = stub.getList(gg).get_return();
        //返回
        String ss =info.getCode();
        HelloStub.User[] strArray = info.getUser();
        for (HelloStub.User s : strArray)
            System.out.println("id="+s.getId()+"name="+s.getName());
        System.out.println(ss);
    }
}

 完成系统输出:

id=1name=张三
id=2name=李四
id=3name=王五
id=4name=小六
00000000001

 

 当然 或许你还会说 为了安全考虑 Axis2生成了客户端代码,但是服务端要求用户名、密码验证,不知道客户端如何加入?(资料出处  axis2 客户端调用wss4j 安全web服务的方法 http://blog.csdn.net/bibitoo712/archive/2008/10/30/3184252.aspx)

其实很简单:直接上图了

package client;

import java.rmi.RemoteException;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.impl.dom.SOAPHeaderBlockImpl;
import org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory;
import org.apache.axiom.soap.impl.dom.soap11.SOAP11HeaderBlockImpl;

public class AddHeaderClinet {

    public static void main(String args[]) throws RemoteException, AppAxis2Exception{
        
        HelloStub stub = new HelloStub();
        HelloStub.GetList gg = new HelloStub.GetList();
        HelloStub.Prameters param = new HelloStub.Prameters();
        param.setCode("test");
        param.setCode2("hello ");
        gg.setP(param);
      
        
        
        SOAP11Factory factory = new SOAP11Factory();

        OMNamespace SecurityElementNamespace = factory.createOMNamespace(
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse");

        OMElement usernameTokenEl = factory.createOMElement("UsernameToken", SecurityElementNamespace);
        OMElement usernameEl = factory.createOMElement("Username", SecurityElementNamespace);
        OMElement passwordEl = factory.createOMElement("Password", SecurityElementNamespace);
        OMElement actionEl = factory.createOMElement("Action", SecurityElementNamespace);

        passwordEl.addAttribute(factory.createOMAttribute("Type", null,
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"));

        usernameEl.setText("");
        passwordEl.setText("");
        usernameTokenEl.addChild(usernameEl);
        usernameTokenEl.addChild(passwordEl);
        usernameTokenEl.addChild(actionEl);
        SOAPHeaderBlockImpl block = new SOAP11HeaderBlockImpl("Security", SecurityElementNamespace, factory);
        block.addChild(usernameTokenEl);
        //加入head头
        stub._getServiceClient().addHeader(block);
        
        //调用
        HelloStub.BuissnessInfo info  = stub.getList(gg).get_return();
        //返回
        String ss =info.getCode();
        HelloStub.User[] strArray = info.getUser();
        for (HelloStub.User s : strArray)
            System.out.println("id="+s.getId()+"name="+s.getName());
        System.out.println(ss);
    }
}

 

以上都是我在网上查询的资料整合,希望对大家有需求的有帮助,谢谢,希望共同探讨,同时,,我正对AXIS2在服务端对Header头报文的验证 很郁闷!!!!,期望 有高手给指点下,谢谢

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics