cxf 調用 .net webservice

来源:https://www.cnblogs.com/EllisQian/archive/2019/10/30/11764033.html
-Advertisement-
Play Games

1. 問題背景 現在我們兩套語言並行,其中必然會涉及到不同系統的相互訪問。 .net 的會員信息是用 webservice 提供服務的。那如何對現有 .net webservice 不做任何改動的情況下,用 Java 的 cxf 來訪問呢,公司的知識庫裡面也有這個技術專題,但是我們公司招投標的 .n ...


1.   問題背景          現在我們兩套語言並行,其中必然會涉及到不同系統的相互訪問。 .net 的會員信息是用 webservice  提供服務的。那如何對現有 .net webservice 不做任何改動的情況下,用 Java 的 cxf 來訪問呢,公司的知識庫裡面也有這個技術專題,但是我們公司招投標的 .net webservice 涉及到一些比較特別的加密方式 和 特有的數據返回結構,比如加密信息是放在 SoapHeader 裡面,返回的數據格式為 DataSet 。特別是 DataSet 這個是 .net 特有的,這個時候通用的方法就顯得不能為力了,我們需要做點小小的改動。           2.  cxf 攔截器        要處理這個問題,我們要需要回歸到最初的 soap (Simple Object Access Protocol),可以理解為一份有規定格式的xml 文件。我們需要自己來處理髮送和返回的 xml 文件。為了做這件事情,我們先來瞭解一下 cxf 的攔截器          上圖顯示了一個請求流程中的各個攔截點。我們使用其中的 WRITE、PRE_STREAM、RECEIVE         1)  WRITE 攔截器 我們增加SoapHeader認證信息              2)PRE_STREAM 攔截器 ,獲取發送報文,這個攔截器可以不加,我加只是為了獲取發送的報文,方便我們最後對比發送報文和返回的報文。   3)Receive 攔截器,獲取返回的報文,這個攔截器非常重要,這裡面有我們需要的全部信息。          3.  解析SOAP 報文    這個時候我們已經完成了80% 的工作。現在我們來看一下獲取的報文。重點關註一下文件的結構。       1) 發送的報文,已經添加了認證需要的SoapHeader信息。                   2) 返回的報文,已經有我們需要的信息,然後當作一份 xml 文件來處理就可以了。               4.  小結         在這個問題處理當中,我們需要註意的一點就是,不同語言對這份規定格式的 xml 文件有不同的解析,會對我們的處理造成一定的困擾。這個時候我們要不忘初心,回到最原始的起點,二進位流 、字元串、xml 文件。方得始終,需要的信息就隱藏在裡面。   5. 小疑問       為什麼我們用的是 Write、PreStream、Receive 這三個攔截器,其他的行不行。要說明這個問題,我們就要瞭解每個攔截器的作用以及在流程中所處的位置。可以看一下這篇文章 https://www.cnblogs.com/luangeng/p/6602667.html,可能看完了還是有點雲里霧裡,那也沒有關係,你可以每個攔截都去試一下,看一下獲取的是什麼,輸出的什麼,這個過程當中,可能還需要其他一些協議來幫助你理解,也許會有一些意想不到的新發現,那就邊學邊試吧。   6. 展望一下        經過這麼一番折騰,也算解決了一些問題,那麼有沒有一種協議、標準、設計風格可以優雅的在不同的系統中暢行呢,或許RESTful 可以試一下, REST(Representational State Transfer )這個詞是Roy Thomas Fielding在他2000年的博士論文中提出的(文末有論文中文版附件),最後引用一下 Roy Thomas Fielding 博士介紹論文寫作目的來結尾,原文如下: "本文研究電腦科學兩大前沿,軟體和網路的交叉點。長期以來,軟體研究主要關註軟體設計的分類、設計方法的演化,很少客觀地評估不同的設計選擇對系統行為的影響。而相反地,網路研究主要關註系統之間通信行為的細節、如何改進特定通信機制的表現,常常忽視了一個事實,那就是改變應用程式的互動風格比改變互動協議,對整體表現有更大的影響。我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網路為基礎的應用軟體的架構設計,得到一個功能強、性能好、適宜通信的架構。"