不同方式调用webservice接口
发布时间:2020-12-16 22:41:34 所属栏目:安全 来源:网络整理
导读:package cn.mr.rw.service.orderSynchronize.emos.failureOrder;import java.net.MalformedURLException;import java.rmi.RemoteException;import java.util.Date;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import org.apach
package cn.mr.rw.service.orderSynchronize.emos.failureOrder; import java.net.MalformedURLException; import java.rmi.RemoteException; import java.util.Date; import javax.xml.namespace.QName; import javax.xml.rpc.ServiceException; import org.apache.axis.AxisFault; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.LogFactory; import cn.mr.common.exception.InvokeWebServiceException; import cn.mr.rw.system.core.utils.LogUtils; /** * WebService调用接口,无需事务控制。 * 2013-11-7 下午6:38:12 */ public class InvokeWebService { private static final org.apache.commons.logging.Log log = LogFactory.getLog(InvokeWebService.class); /** * 使用拼装好的接口报文,调用指定WSDL路径的指定方法。该客户端使用AXIS1实现。 * @param xmlRequest 接口报文字符串。 * @param url 服务器端WSDL路径 * @param methodName 服务器端方法名 * @return 响应报文字符串。 * @throws InvokeWebServiceException */ public String callAxis(String xmlRequest,String url,String methodName) throws InvokeWebServiceException{ String resObj = ""; try { if(StringUtils.isBlank(url)){ throw new InvokeWebServiceException("请提供访问WebService接口方法的URL"); } if(StringUtils.isBlank(methodName)){ throw new InvokeWebServiceException("请提供要调用的WebService接口方法!"); } Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setOperationName(methodName); call.addParameter("xml",org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN); call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); Object[] obj = new Object[] {xmlRequest}; resObj = (String) call.invoke(obj); } catch (ServiceException e) { e.printStackTrace(); throw new InvokeWebServiceException("创建服务出错!"); } catch (AxisFault e) { e.printStackTrace(); throw new InvokeWebServiceException("网络异常连接超时!"); } catch (RemoteException e) { e.printStackTrace(); throw new InvokeWebServiceException("调用远程方法出错!"); } catch(MalformedURLException e){ e.printStackTrace(); throw new InvokeWebServiceException("不能解析的URL!"); } catch (Exception e) { throw new InvokeWebServiceException("调用Webservice接口方法出现未知异常!"); } return resObj; } /** * 用多个参数调用webservice。 * 使用拼装好的接口报文,调用指定WSDL路径的指定方法。该客户端使用AXIS1实现。 * @param xmlRequest * @param url * @param methodName * @return * @throws InvokeWebServiceException */ public String callAxisWithMultiParam(Object[] xmlRequest,String namespace,String methodName) throws InvokeWebServiceException{ String resObj = ""; try { if(StringUtils.isBlank(url)){ throw new InvokeWebServiceException("请提供访问WebService接口方法的URL"); } if(StringUtils.isBlank(methodName)){ throw new InvokeWebServiceException("请提供要调用的WebService接口方法!"); } Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setOperationName(new QName(namespace,methodName)); for(int i = 0; i < xmlRequest.length; i++){ call.addParameter("xml",javax.xml.rpc.ParameterMode.IN); } call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); resObj = (String) call.invoke(xmlRequest); } catch (ServiceException e) { e.printStackTrace(); throw new InvokeWebServiceException("创建服务出错!"); } catch (AxisFault e) { e.printStackTrace(); throw new InvokeWebServiceException("网络异常连接超时!"); } catch (RemoteException e) { e.printStackTrace(); throw new InvokeWebServiceException("调用远程方法出错!"); } catch(MalformedURLException e){ e.printStackTrace(); throw new InvokeWebServiceException("不能解析的URL!"); } catch (Exception e) { throw new InvokeWebServiceException("调用Webservice接口方法出现未知异常!"); } return resObj; } /** * 如果服务器端是用Axis2实现的,客户端用Axis可能需要很长时间 * @param wsdlUrl * @param nameSpace * @param method * @param param * @return * @throws AxisFault * @throws org.apache.axis2.AxisFault * @throws InvokeWebServiceException */ public String invokeAxis2MultiParam(String wsdlUrl,String nameSpace,String method,Object[] xmlRequest) throws InvokeWebServiceException { String response = ""; try { RPCServiceClient client; client = new RPCServiceClient(); Options options = client.getOptions(); options.setTo(new EndpointReference(wsdlUrl)); Object[] result; Date d1 = new Date(); log.error("开始调用" + method + ",请求参数为" + xmlRequest); result = client.invokeBlocking(new QName(nameSpace,method),xmlRequest,new Class[]{String.class }); response = (String) result[0]; log.error("结束调用" + method +",耗时" + (new Date().getTime() - d1.getTime())/1000 + "秒,返回结果为" + response); } catch (org.apache.axis2.AxisFault e) { LogUtils.failureOrderClientLog.error(e.getMessage(),e); throw new InvokeWebServiceException("网络异常连接超时!"); } return response; } /** * 如果服务器端是用Axis2实现的,客户端用Axis可能需要很长时间 * @param wsdlUrl * @param nameSpace * @param method * @param param * @return * @throws AxisFault * @throws org.apache.axis2.AxisFault */ public String invokeAxis2(String wsdlUrl,String param,Long timeOut) throws InvokeWebServiceException { try { RPCServiceClient client; client = new RPCServiceClient(); Options options = client.getOptions(); options.setTo(new EndpointReference(wsdlUrl)); if(timeOut != null && timeOut.longValue() > 0) { options.setTimeOutInMilliSeconds(timeOut); } Object[] result; // Date d1 = new Date(); // log.error("开始调用" + method + ",请求参数为" + param); result = client.invokeBlocking(new QName(nameSpace,new Object[] {param},new Class[]{String.class }); String response = (String) result[0]; // log.error("结束调用" + method +",返回结果为" + response); return response; } catch (Exception e) { throw new InvokeWebServiceException("调用Axis2的服务器端失败",e); } } /** * 该构造方法针对java 客户端调用.net服务端时,必须传递namespace和soapURI参数 * 使用拼装好的接口报文,调用指定WSDL路径的指定方法。该客户端使用AXIS1实现。 * @param xmlRequest 接口报文字符串。 * @param url 服务器端WSDL路径 * @param methodName 服务器端方法名 * @return 响应报文字符串。 * @throws InvokeWebServiceException */ public String callAxis(String namespace,String xmlRequest,String methodName,String soapURI) throws InvokeWebServiceException{ String resObj = ""; try { if(StringUtils.isBlank(url)){ throw new InvokeWebServiceException("请提供访问WebService接口方法的URL"); } if(StringUtils.isBlank(methodName)){ throw new InvokeWebServiceException("请提供要调用的WebService接口方法!"); } if (StringUtils.isBlank(namespace)) { throw new InvokeWebServiceException("请提供访问WebService接口命名空间的namespace!"); } if (StringUtils.isBlank(soapURI)) { throw new InvokeWebServiceException("请提供访问WebService接口参数soapURI!"); } Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(url)); call.setOperationName(new QName(namespace,methodName)); call.addParameter(new QName(namespace,"xml"),javax.xml.rpc.ParameterMode.IN); call.setUseSOAPAction(true); call.setSOAPActionURI(soapURI); call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); Object[] obj = new Object[] {xmlRequest}; resObj = (String) call.invoke(obj); } catch (ServiceException e) { e.printStackTrace(); throw new InvokeWebServiceException("创建服务出错!"); } catch (AxisFault e) { e.printStackTrace(); throw new InvokeWebServiceException("网络异常连接超时!"); } catch (RemoteException e) { e.printStackTrace(); throw new InvokeWebServiceException("调用远程方法出错!"); } catch(MalformedURLException e){ e.printStackTrace(); throw new InvokeWebServiceException("不能解析的URL!"); } catch (Exception e) { throw new InvokeWebServiceException("调用Webservice接口方法出现未知异常!"); } return resObj; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |