RPC(RPCServiceClient)方式调用webservice SOAP调用

/**
 * 应用rpc的方式调用 这种方式就等于远程调用,
 * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
 * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
 *
 【注】:

 如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
 第一个参数的类型是QName对象,表示要调用的方法名;
 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
 第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。

 如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
 也就是 元素的targetNamespace属性值。
 *
 */
public String webserviceAxis2(String methodName,LinkedHashMap param) {
   log.info("调用方法:"+methodName+",输入参数:"+JSON.toJSONString(param));
   String result = "";
   // 使用RPC方式调用WebService
   RPCServiceClient serviceClient = null;
   try {
      // axis2 服务端地址
      String htWsUrl = htDomain+"OAapp/WebObjects/OAapp.woa/ws/WSClientInterface";
      serviceClient = new RPCServiceClient();

      // 指定调用WebService的URL
      EndpointReference targetEPR = new EndpointReference(htWsUrl);

      /*MessageContext msgContext = new MessageContext();
      msgContext.setServiceContext(serviceClient.getServiceContext());
      MessageContext.setCurrentMessageContext(msgContext);*/

      Options options = serviceClient.getOptions();

      //确定目标服务地址
      options.setTo(targetEPR);
      //确定调用方法
      options.setAction("urn:"+methodName);
      options.setProperty(HTTPConstants.CHUNKED, "false");// 把chunk关掉后,会自动加上Content-Length
      //解决高并发链接超时问题
      options.setManageSession(true);
      options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT,true);

      //设置响应超时,默认5s
      options.setProperty(HTTPConstants.SO_TIMEOUT, TIMEOUT_MILLISECONDS);
      //设置连接超时,默认5s
      options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, TIMEOUT_MILLISECONDS);

      //options.setTimeOutInMilliSeconds(TIMEOUT_MILLISECONDS_AXIS2);
      /**
       * 指定要调用的getPrice方法及WSDL文件的命名空间
       * 如果 webservice 服务端由axis2编写
       * 命名空间 不一致导致的问题
       * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
       */
      QName qname = new QName("http://xml.apache.org/axis/wsdd/", methodName);

      // 指定传递参数值
      //Object[] parameters = new Object[] { "18911215691","ROOT" };
      Object[] parameters = new Object[param.size()];

      // 设置参数名称,具体参照从浏览器中看到的
      if(param!=null&&!param.isEmpty()){
         Set set = param.entrySet();
         Iterator it = set.iterator();
         int i=0;
         while(it.hasNext()){
            Entry entry = (Entry)it.next();
            String key = entry.getKey().toString();

            if(entry.getValue() instanceof byte[]){//把object转换成字节数组
               parameters[i]=toByteArray(entry.getValue());
            }else{
               parameters[i]=entry.getValue();
            }

            i++;
         }
      }

      // 指定方法返回值的数据类型的Class对象
      Class[] returnTypes = new Class[] { String.class };

      // 调用方法并输出该方法的返回值
      Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
      result = (String) response[0];

      log.info("webserviceAxis2 result:"+result);
   } catch (org.apache.axis2.AxisFault e) {
      log.error("第三方接口异常",e);
      if(e.getCause()!=null&&e.getCause().toString().toLowerCase().contains("timeout")){
         throw new BusinessException("第三方服务连接超时,请稍候重试!","WB_301");
      }
      throw new BusinessException("第三方服务异常,请稍候重试!","WB_301");
   } finally {
      try {
         if(serviceClient != null){
            serviceClient.cleanupTransport();
         }
      } catch (org.apache.axis2.AxisFault e) {
         log.error("第三方接口异常 finally",e);
         if(e.getCause()!=null&&e.getCause().toString().contains("SocketTimeoutException")){
            throw new BusinessException("第三方服务连接超时,请稍候重试!","WB_301");
         }
         throw new BusinessException("第三方服务异常,请稍候重试!","WB_301");
      }
   }

   return result;
}
 
public static void main(String[] args) {
   try {
      //测试
      LinkedHashMap map = new LinkedHashMap();
      map.put("phone", "189000000");
      map.put("parentId", "ROOT");
      String result = new 类名.webserviceAxis2("getDMagazineDirList",map);
   } catch (Exception e) {
      e.printStackTrace();
   }
}

 

 下面是个人创建的公众号,主攻Java方向,有兴趣的可以扫描二维码。

你可能感兴趣的:(webservice)