Java: 討人厭的SOAP Web Service;使用SoapUI解決
我們有個和第三方系統以Web Service同步的作業,使用傳統的SOAP溝通,不知為何在送出request後總會停頓十多秒才會接到回應,這個問題困擾許久,一直無法找到解決方法。
IE 11除錯追蹤
我們以IE 11的F12除錯偵測的狀況如下:
- 在呼叫Web Service之前按〔F12〕→【網路】並啟動其追蹤功能。
- 送出request後會記錄網路傳輸狀況。
- 按【詳細資訊】可以查看要求與回應的詳細內容。
其實這些追蹤只是證實每次都會等待才會接到回應,延遲狀態依舊無法改善。最後只好修改程式,放棄標準的SOAP寫法改用更低階些的java.net.URL,改寫步驟是:
1. 下載並安裝SoapUI
SoapUI是一套開源的Web Service測試應用程式,透過SoapUI我們就能擷取到傳輸過程中的內容,再用java.net.URL來傳送這些內容。
2. 執行SoapUI
首先建立新的request並指定Web Service的WSDL網址,再將request的XML內容存入剪貼簿,這個內容就是我們要使用的request內容。
3. 撰寫Java程式
使用java.net.URL叫用Web Service的寫法示範如下:
URL baseURL = new URL(urlAddress); con = (HttpURLConnection) baseURL.openConnection(); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); // 發送請求参数;要換成由SoapUI取到的request內容 String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://第三方WebService網址/\">" + " <soapenv:Header/>" + " <soapenv:Body>" + " <ws:process>" + " <arg0>" + params + "</arg0>" + " </ws:process>" + " </soapenv:Body>" + "</soapenv:Envelope>"; System.out.println("soap:"+soap); con.setRequestMethod("POST"); con.setRequestProperty("Accept", "application/soap+xml"); con.setRequestProperty("Content-length", String.valueOf(soap.length())); con.setRequestProperty("Content-Type", "application/soap+xml;charset=UTF-8"); dataOutput = new DataOutputStream(con.getOutputStream()); dataOutput.write(soap.getBytes("UTF-8")); dataOutput.flush(); dataOutput.close(); // 取出回應 dataOutput = null; int code = con.getResponseCode(); System.out.println("Code=" + code); System.out.println("resp msg=" + con.getResponseMessage() + "<hr>"); StringBuilder result = new StringBuilder(); InputStream is = con.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line; while ((line = reader.readLine()) != null) { result.append(line); } String _sResponse = result.toString().trim(); System.out.println("response:"+_sResponse);
測試後連線速度大幅提升,停頓狀況消失了。至於造成遲延的原因,推測是對方AP Server的版本比較舊的原因,也有同事提出或許是IPv6的問題,不過既然問題解決了就沒有再深入探討的興致了。
##
您可能也會有興趣的類似文章
- 用IntelliJ IDEA寫第一支Java程式;程式結構說明;Live Tempate用法(IDEA #4) (0則留言, 2019/08/09)
- Java的資料型態與簡單的計算機程式 (IDEA #8) (0則留言, 2019/08/25)
- IntelliJ IDEA Live Template(即時樣板)的使用與範例說明(IDEA #5) (0則留言, 2019/08/11)
- 以Scribe-java實作Google OAuth 2.0的認證機制 (0則留言, 2013/02/19)
- Servlet 3.0的檔案上傳寫法 (2則留言, 2012/06/19)
- Java: 使用jCIFS存取遠端網路磁碟機的檔案 (0則留言, 2015/05/20)
- [轉貼CNet] 開原碼Java工具熱 昇陽能否突圍? (0則留言, 2005/06/30)
- Java十年有成 (0則留言, 2005/04/12)
- Java程式庫Markdown4J簡介 (0則留言, 2013/02/22)
- 快速找出類別所在jar檔的命令行工具:LibraryFinder (0則留言, 2016/02/18)
- Java之父James Gosling由Oracle辭職了… (2則留言, 2010/04/10)
- Apache Web Server/Resin Server設置https通訊的步驟 (0則留言, 2015/06/23)
- [Windows] 刪除特定Java process的方法 (0則留言, 2017/08/02)
- 取得iReport / JasperReports報表內特定元件的方法 [修訂] (5則留言, 2011/10/17)
- 使用JUnit5測試程式的操作步驟 (IDEA教學 #10) (0則留言, 2019/08/31)
Sorry, 很久沒用Google sc…