前提: 前兩天公司讓微信公眾號對個人發送消息模板的接口,供其他系統訪問,剛開始領導說直接用個action實現,我覺的不安全,加上了des對稱加密算法和時間戳做攔截器 把需要的參數編成json,加密后傳遞,但是后面覺得這種方法太low了,因為還要把des加密的那一塊也得在其他系統上面引入,約定算法的key,這個方法顯得很野,就百度了webservice的原理及用法,感覺這個最合適,然后自己寫了一個demo跑通了,但是有個問題是直接用webservice發布服務器端,不能和tomcat的端口號一樣,這個顯然不太合適,就百度了cfx,讓cfx和spring整合,最后由spring管理webservice的發布。
webservice本以為很高大聲,研究了一下原理其實很簡單,就是服務器端(提供接口端)寫一個service方法,而這個方法本身想暴露給客戶端(使用接口端)調用,實現不同系統直接的方法的調用。就需要先有個webservice類,然后用@webservice注解類,用@WebMethod注解類中暴露的方法,最后把這個類通過webservice的方法發布出去,外界獲取了一個wsdl(接口詳情清單頁)的地址,根據這個頁面的信息,通過cmd等命令把webservice編譯的代碼下載到客戶端,最后客戶端直接調用生成的代碼即實現了不同系統直接方法的調用。
這里不再贅敘,網上這位朋友講的很透徹,可以參考:https://blog.csdn.net/yhahaha_/article/details/81395397
客戶端調用
經過測試分了三種方式:

1 URL wsdlURL = null; 2 try { 3 wsdlURL = new URL("http://localhost:6060/fms/soap/wechat_sendMessage?wsdl"); 4 } catch (MalformedURLException e) { 5 e.printStackTrace(); 6 } 7 //目標命名空間 這兩個wsdl文件里面有說明 8 String targetNamespace = "http://impl.service.commom.webchat.bms.vimtech.com/"; 9 QName serviceName = new QName(targetNamespace,"SendMessageFaceImplService"); 10 11 //獲取service 12 Service service = Service.create(wsdlURL, serviceName); 13 SendMessageFace ms = service.getPort(SendMessageFace.class);//這個service接口是需要在客戶端創建的,包名類名,方法名一致,或者引入服務端的此接口的jar 14 String string = ms.sendMessageByWeTemp("xiaoming", "asdfardf"); 15 System.out.println(string);

1 wsimport -s 客戶端地址 -p 客戶端包名 -keep wsdl的網絡地址 2 3 如: 4 wsimport -s D:\Workspaces\TheClient\src -p com.sl.client -keep http://localhost:9094/Service2/ServiceBora?wsdl

1 .spring配置文件信息: 2 <jaxws:client id="wechat_sendMessagePoint" serviceClass="com.wp.learn.webservice.cxf.service.SendMessageFaceImpl" address="http://localhost:8080/ws/wechat_sendMessage"> 3 </jaxws:client> 4 5 6 //注意,該出的targetNamespace的值必須和webService服務項目中定義的必須一致,否則調用不成功 7 @WebService(targetNamespace = "http://impl.service.commom.webchat.bms.vimtech.com/", name = "SendMessageFaceImplService") 8 public interface SendMessageFace{ 9 @WebMethod 10 String sendMessageByWeTemp(String userid,String message); 11 }