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:\n" + 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("请求报文:\n"+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
最后,附上测试结果: