转载至: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 }
标签:调用,String,AXIS2,new,org,apache,import,服务端,webservice From: https://www.cnblogs.com/BelieveFish/p/17005451.html