zoukankan      html  css  js  c++  java
  • webService 客户端接口调用【java】

    最近实际项目中使用到了WebService,简单总结下使用方式:

    1、拿到接口:http://*******:8080/osms/services/OrderWebService?wsdl

    我们可以将该接口地址在浏览器打开,查看其接口描述:

      

    2、导出接口类,用以后续客户端调用,方法有两种:

      方法一:

      1)新建后缀名为“.wsdl”文件,直接拷贝上一步在浏览器打开的内容到该文件中:

      在eclipse中新建一个WebService的Client项目:

      

      选中刚新建的.wsdl文件:

      

      eclipse会自动解析wsdl文件,并生成相应的类文件:

      

      

      方法二:使用jdk自带的wsimport命令:

      命令:e > wsimport -s . ********:2080/osms/services/OrderWebService?wsdl

      

      打开e盘,我们可看到已经生成对应的java类文件(其中class文件可以忽略):

      

      

    3、客户端调用:

      以下环境为java环境,我们使用JaxWsProxyFactoryBean来调用:

    package test;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.rmi.RemoteException;
    
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    
    import com.sf.osms.wbs.services.order.server.impl.OrderWebService;
    
    //import com.sf.novatar.util.codec.Base64Codec;
    
    public class Test_apiOrderService{
        
        public static void main(String[] args) throws RemoteException {
            
            JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
            
            //设置代理接口类
            svr.setServiceClass(OrderWebService.class); 
            //设置接口调用地址    
            svr.setAddress("******:8080/osms/services/OrderWebService?wsdl");
            //创建代理接口
            OrderWebService orderWebService = (OrderWebService)svr.create();
            
            //读取报文:参数为请求报文xml文件路径
            String xml = readTxtFile("/config/"+"apiOrderService.xml");
            
            //通过客户的validateCode加密报文数据   --全包加密
            String data = decodingValidCode(xml);
            System.out.println("加密报文:" + data);
            
            //验证数据完整性加密           -- 签值   fc34c561a34f
            String validateStr = jm("fc34c561a34f", xml);
            
            //调用接口    --调用对方的接口
            //当使用WEBSERVICE接口时,报文通过方法参数传入(三个参数分别为:xml报文、校验码、客户编码)
            String s = orderWebService.sfexpressService(data, validateStr, "OSMS_1");
            System.out.println("响应结果:" + s);
        }
        
        /**
         * 报文加密
         * @param orderData  报文
         * @return
         */
        private static String decodingValidCode(String orderData) {
        	
    //		1、使用org.apache.commons.codec.binary.Base64加密
            return new Base64().encodeToString(orderData.getBytes());
        	
    //		2、使用sun.misc.BASE64Encoder加密
    //    	return new sun.misc.BASE64Encoder().encode(orderData.getBytes());
        }
        
        /**
         * 报文加签:验证报文完整性
         * @param validCode  秘钥
         * @param xml  报文
         * verifyCode校验码的生成规则:接入IBS平台前,IBS平台系统管理员会为每个接入客户分配一个“密钥”,以下把密钥简称为checkword,verifyCode的生成规则为:
    			将xml报文进行Base64编码
    			将编码后的报文与checkword前后连接。
    			把连接后的字符串做MD5编码。
    			把MD5编码后的数据进行Base64编码,此时编码后的字符串即为verifyCode。
         */
        public static String jm(String validCode ,String xml){
        	//校验加密测试
    //    	xml = "123456";
    //    	System.out.println("xml=" + xml);
    //    	System.out.println("checkword=" + validCode);
        	
        	//(1)xml+validCode 
        	String bind = xml + validCode;
    //    	System.out.println("xml+validCode:
    " + bind);
        	//(2)对连接后的字符串做md5编码
        	String md5 = DigestUtils.md5Hex(bind);
    		System.out.println("md5连接后的字符串:" + md5);
        	//(3)把MD5编码后的数据进行Base64编码
    //		--1、使用sun.misc.BASE64Encoder加密
    //    	BASE64Encoder base64Sun = new sun.misc.BASE64Encoder();
    //    	String result = base64Sun.encode(md5.getBytes());
    //		--2、使用org.apache.commons.codec.binary.Base64加密
    		Base64 base64Apache = new Base64();
    		String result = base64Apache.encodeToString(md5.getBytes());
        	System.out.println("base64加签结果:" + result);
        	return result;
        }
    
        /**
         * 读取接口xml文档
         * @param filePath 接口文档路径
         * @return
         */
        public static String readTxtFile(String filePath) {
            
            StringBuilder builder = new StringBuilder();
            try {
                String encoding = "UTF-8";
                //请求报文输出
                InputStream is = Test_apiOrderService.class.getResourceAsStream(filePath);
                byte[] buf = new byte[3072];
                int len = is.read(buf);
                System.out.println("请求报文:
    "+new String(buf,0,len,"utf-8"));
                
                
                InputStreamReader read = new InputStreamReader(Test_apiOrderService.class
                        .getResourceAsStream(filePath), encoding);// 考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    builder.append(lineTxt);
                }
                
                read.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return builder.toString();
        }
        
    }
    

      由于在实际生产中,我们是需要对请求报文做动态赋值的,所以对接口做了从新封装:传入对象,解析取值,xml报文通过xslt模板转换,请求服务端,获取响应,解析对端报文。

      改造后的工程目录如下,因为比较简单,就不详细写:

      

      其中lib支持使用了apache-cxf-2.1.4.tar.gz

      最后,附上测试结果:

      

      

      

  • 相关阅读:
    Linux 常用命令总结(二)
    Linux(CentOS7)使用 RPM 安装 mysql 8.0.11
    Linux(CentOS7) 相关软件安装
    8、js——字符串
    7、js——数组
    6、js——创建对象方式
    5、js——this说明
    4、js——函数
    4、js——对象
    2、js编写位置
  • 原文地址:https://www.cnblogs.com/shindo/p/5489374.html
Copyright © 2011-2022 走看看