AXIS2 webservice客户端调用服务端的三种方式

转载至:https://blog.csdn.net/zz210891470/article/details/52316011?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-8-52316011-blog-89667922.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-8-52316011-blog-89667922.pc_relevant_landingrelevant&utm_relevant_index=17

  1 package samples.quickstart.client;  
  2   
  3 import javax.xml.namespace.QName;  
  4 import org.apache.axiom.om.OMAbstractFactory;  
  5 import org.apache.axiom.om.OMElement;  
  6 import org.apache.axiom.om.OMFactory;  
  7 import org.apache.axiom.om.OMNamespace;  
  8 import org.apache.axis2.AxisFault;  
  9 import org.apache.axis2.addressing.EndpointReference;  
 10 import org.apache.axis2.client.Options;  
 11 import org.apache.axis2.client.ServiceClient;  
 12 import org.apache.axis2.rpc.client.RPCServiceClient;  
 13 import samples.quickstart.StockQuoteServiceStub;  
 14 import samples.quickstart.xsd.GetPrice;  
 15 import samples.quickstart.xsd.GetPriceResponse;  
 16   
 17 public class StockQuoteClient {  
 18   
 19   /** 
 20    * 方法一: 
 21    * 应用rpc的方式调用 这种方式就等于远程调用, 
 22    * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。 
 23    * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService 
 24    * 
 25     【注】: 
 26      
 27         如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数 
 28           第一个参数的类型是QName对象,表示要调用的方法名; 
 29           第二个参数表示要调用的WebService方法的参数值,参数类型为Object[]; 
 30             当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。 
 31           第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。 
 32          
 33          
 34         如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法 
 35           该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。 
 36  
 37         在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名, 
 38         也就是 <wsdl:definitions>元素的targetNamespace属性值。 
 39    * 
 40    */  
 41   public static void testRPCClient() {  
 42     try {  
 43       // axis1 服务端  
 44 // String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";  
 45       // axis2 服务端  
 46       String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";  
 47   
 48       // 使用RPC方式调用WebService  
 49       RPCServiceClient serviceClient = new RPCServiceClient();  
 50       // 指定调用WebService的URL  
 51       EndpointReference targetEPR = new EndpointReference(url);  
 52       Options options = serviceClient.getOptions();  
 53       //确定目标服务地址  
 54       options.setTo(targetEPR);  
 55       //确定调用方法  
 56       options.setAction("urn:getPrice");  
 57   
 58       /** 
 59        * 指定要调用的getPrice方法及WSDL文件的命名空间 
 60        * 如果 webservice 服务端由axis2编写 
 61        * 命名空间 不一致导致的问题 
 62        * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0 
 63        */  
 64       QName qname = new QName("http://quickstart.samples/xsd", "getPrice");  
 65       // 指定getPrice方法的参数值  
 66       Object[] parameters = new Object[] { "13" };  
 67         
 68       // 指定getPrice方法返回值的数据类型的Class对象  
 69       Class[] returnTypes = new Class[] { double.class };  
 70   
 71       // 调用方法一 传递参数,调用服务,获取服务返回结果集  
 72       OMElement element = serviceClient.invokeBlocking(qname, parameters);  
 73       //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。  
 74       //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果  
 75       String result = element.getFirstElement().getText();  
 76       System.out.println(result);  
 77   
 78       // 调用方法二 getPrice方法并输出该方法的返回值  
 79       Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);  
 80       // String r = (String) response[0];  
 81       Double r = (Double) response[0];  
 82       System.out.println(r);  
 83   
 84     } catch (AxisFault e) {  
 85       e.printStackTrace();  
 86     }  
 87   }  
 88   
 89   /** 
 90    * 方法二: 应用document方式调用 
 91    * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合 
 92    */  
 93   public static void testDocument() {  
 94     try {  
 95       // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";  
 96       String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";  
 97   
 98       Options options = new Options();  
 99       // 指定调用WebService的URL  
100       EndpointReference targetEPR = new EndpointReference(url);  
101       options.setTo(targetEPR);  
102       // options.setAction("urn:getPrice");  
103   
104       ServiceClient sender = new ServiceClient();  
105       sender.setOptions(options);  
106         
107         
108       OMFactory fac = OMAbstractFactory.getOMFactory();  
109       String tns = "http://quickstart.samples/";  
110       // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的  
111       OMNamespace omNs = fac.createOMNamespace(tns, "");  
112   
113       OMElement method = fac.createOMElement("getPrice", omNs);  
114       OMElement symbol = fac.createOMElement("symbol", omNs);  
115       // symbol.setText("1");  
116       symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));  
117       method.addChild(symbol);  
118       method.build();  
119         
120       OMElement result = sender.sendReceive(method);  
121   
122       System.out.println(result);  
123   
124     } catch (AxisFault axisFault) {  
125       axisFault.printStackTrace();  
126     }  
127   }  
128   
129  /** 
130   * 为SOAP Header构造验证信息, 
131   * 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息 
132   * 
133   * @param serviceClient 
134   * @param tns 命名空间 
135   * @param user 
136   * @param passwrod 
137   */  
138   public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {  
139     OMFactory fac = OMAbstractFactory.getOMFactory();  
140     OMNamespace omNs = fac.createOMNamespace(tns, "nsl");  
141     OMElement header = fac.createOMElement("AuthenticationToken", omNs);  
142     OMElement ome_user = fac.createOMElement("Username", omNs);  
143     OMElement ome_pass = fac.createOMElement("Password", omNs);  
144       
145     ome_user.setText(user);  
146     ome_pass.setText(passwrod);  
147       
148     header.addChild(ome_user);  
149     header.addChild(ome_pass);  
150   
151     serviceClient.addHeader(header);  
152   }  
153   
154     
155   /** 
156    * 方法三:利用axis2插件生成客户端方式调用 
157    * 
158    */  
159   public static void testCodeClient() {  
160     try {  
161       String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";  
162       StockQuoteServiceStub stub = new StockQuoteServiceStub(url);  
163       GetPrice request = new GetPrice();  
164       request.setSymbol("ABCD");  
165       GetPriceResponse response = stub.getPrice(request);  
166       System.out.println(response.get_return());  
167     } catch (org.apache.axis2.AxisFault e) {  
168       e.printStackTrace();  
169     } catch (java.rmi.RemoteException e) {  
170       e.printStackTrace();  
171     }  
172   
173   }  
174   
175   public static void main(String[] args) {  
176      StockQuoteClient.testRPCClient();  
177 // StockQuoteClient.testDocument();  
178     // StockQuoteClient.testCodeClient();  
179   
180   }  
181 }  

 

posted @ 2022-12-26 12:03  894316728  阅读(132)  评论(0编辑  收藏  举报