webService 客户端接口调用【java】
最近實際項目中使用到了WebService,簡單總結(jié)下使用方式:
?
1、拿到接口:http://*******:8080/osms/services/OrderWebService?wsdl
我們可以將該接口地址在瀏覽器打開,查看其接口描述:
?
2、導出接口類,用以后續(xù)客戶端調(diào)用,方法有兩種:
方法一:
1)新建后綴名為“.wsdl”文件,直接拷貝上一步在瀏覽器打開的內(nèi)容到該文件中:
在eclipse中新建一個WebService的Client項目:
選中剛新建的.wsdl文件:
eclipse會自動解析wsdl文件,并生成相應(yīng)的類文件:
方法二:使用jdk自帶的wsimport命令:
命令:e \> wsimport -s . ********:2080/osms/services/OrderWebService?wsdl
打開e盤,我們可看到已經(jīng)生成對應(yīng)的java類文件(其中class文件可以忽略):
3、客戶端調(diào)用:
以下環(huán)境為java環(huán)境,我們使用JaxWsProxyFactoryBean來調(diào)用:
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();//設(shè)置代理接口類svr.setServiceClass(OrderWebService.class); //設(shè)置接口調(diào)用地址 svr.setAddress("******:8080/osms/services/OrderWebService?wsdl");//創(chuàng)建代理接口OrderWebService orderWebService = (OrderWebService)svr.create();//讀取報文:參數(shù)為請求報文xml文件路徑String xml = readTxtFile("/config/"+"apiOrderService.xml");//通過客戶的validateCode加密報文數(shù)據(jù) --全包加密String data = decodingValidCode(xml);System.out.println("加密報文:" + data);//驗證數(shù)據(jù)完整性加密 -- 簽值 fc34c561a34fString validateStr = jm("fc34c561a34f", xml);//調(diào)用接口 --調(diào)用對方的接口//當使用WEBSERVICE接口時,報文通過方法參數(shù)傳入(三個參數(shù)分別為:xml報文、校驗碼、客戶編碼)String s = orderWebService.sfexpressService(data, validateStr, "OSMS_1");System.out.println("響應(yīng)結(jié)果:" + 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校驗碼的生成規(guī)則:接入IBS平臺前,IBS平臺系統(tǒng)管理員會為每個接入客戶分配一個“密鑰”,以下把密鑰簡稱為checkword,verifyCode的生成規(guī)則為:將xml報文進行Base64編碼將編碼后的報文與checkword前后連接。把連接后的字符串做MD5編碼。把MD5編碼后的數(shù)據(jù)進行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編碼后的數(shù)據(jù)進行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加簽結(jié)果:" + 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();}}由于在實際生產(chǎn)中,我們是需要對請求報文做動態(tài)賦值的,所以對接口做了從新封裝:傳入對象,解析取值,xml報文通過xslt模板轉(zhuǎn)換,請求服務(wù)端,獲取響應(yīng),解析對端報文。
改造后的工程目錄如下,因為比較簡單,就不詳細寫:
其中l(wèi)ib支持使用了apache-cxf-2.1.4.tar.gz
?
最后,附上測試結(jié)果:
?
轉(zhuǎn)載于:https://www.cnblogs.com/shindo/p/5489374.html
總結(jié)
以上是生活随笔為你收集整理的webService 客户端接口调用【java】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Powershell管理系列(三十一)P
- 下一篇: js实现上传图片及时预览