2014-10-18 96 views
2

我需要自定義SABA頁面才能在特殊渲染頁面上添加HTML按鈕。 按下按鈕必須調用Web服務才能根據輸入參數獲取答案,因此請採取適當的措施。從SABA使用web服務

的WS接受作爲輸入的JSON變量,如: { 「檢查」:INT, 「planTitle」: 「......」 }

調用WS後(即:在URI調用它像:http://www.blablabla.com:8080/resource/services/service1 我會得到一個JSON變量的結果

服務器返回的傳統SOAP信封是:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
   <ns1:getInfoResponse xmlns:ns1="http://www.blablabla.com/">{"check":1,......}</ns1:getInfoResponse> 

請考慮一下,薩巴服務器和web服務服務器可以託管在不同的機器上,但在同一個Intranet上。

現在,我有兩個可能的解決方案:

  1. 實現在服務器上的Java web服務.......但我不明白的簡單或這種努力的有效性.... 。(客戶端?)

  2. 使用Jquery或直接使用Javascript直接在HTML呈現頁面調用webservice,並以動態 直接獲得結果,並且具有很多優雅和簡單性。唯一的問題在於可能存在的跨瀏覽器問題或其他基於SABA SW限制的問題, 但Intranet上的I映像,例如,可以克服跨瀏覽器方面。

那麼,哪種解決方案您可以建議我,爲什麼?

回答

0

經過一段時間,沒有任何幫助我自己解決了這個問題。所以我希望與大家分享所使用的方法。

此刻消耗從jQuery的客戶端Web服務的雷米布洛姆插件(指:http://plugins.jquery.com/soap/) 可以被認爲是一個有效的替代,足夠有效的使它的工作對你越簡單越好。 這個插件必須再次改進,但它很容易使用。當然,它基於ajax回調。 因此,您如何能想象,如果不可能管理服務器端配置以允許「Access-Control-Allow-Origin」,並且如果我們需要從互聯網連接到Intranet Web服務服務器,則主要是 ,我們需要擴大我們的視野。

根據我的經驗來解決這種情況可能是最好的,簡單的方法:

  1. 編寫服務器端Web服務代理請求並返回結果
  2. 編寫服務器端代理頁

我喜歡寫一個簡單的,最小的服務器端網頁,只是爲了使用Web服務並將答案返回給調用。 參數必須通過post/get調用傳遞給這樣的頁面,並且生成的頁面必須包含適當的字段以包含結果。

爲什麼我更喜歡這樣做? 由於在服務器端使用最少的代碼行,我還可以向客戶提供測試對WS的調用是否正確運行的可能性 ,其中某些參數由客戶即時決定並查找瀏覽器上的html頁面結果。

對我來說,在服務器端創建代理服務器,在客戶端使用代理服務器並讓客戶自己測試代理服務器是妥當的妥協方案。

安全問題?不好了。它們完全取決於添加代理頁面的Web服務器的安全性。

該解決方案還具有足夠的靈活性,以用於:JAVA,C#,的NodeJS,PHP,PERL,......

所以這絕對不是我重要是哪一種類型的Web服務器:有時薩巴唯一可以混淆的詞。

讓我們來描述解決方案。

在服務器端,我創建了一個簡單的Saba網頁,主要包含以下服務器代碼,以便從請求中獲取輸入參數, 構建Web服務調用並使用它。結果輸出字段被滿足。 (使用軸1) 的Java代碼是:

try { 
    if (wsEndPoint == null || wsEndPoint.trim().length() == 0 || wsNAME == null || wsNAME.trim().length() == 0 || 
     id == null || id.trim().length() == 0 || code == null || code.trim().length() == 0) { 
     retVal = "Error: mandatory parameter missing."; 
    } else { 
     Service service = new Service(); 
     Call call = (Call)service.createCall(); 

     call.setTargetEndpointAddress(new java.net.URL(wsEndPoint)); 
     call.setOperationName(new QName("http://service.name.it/", wsNAME)); 
     call.addParameter(new QName("http://service.name.it/", "arg0"), new QName("http://www.w3.org/2001/XMLSchema", "string"), ParameterMode.IN); 
     call.addParameter(new QName("http://service.name.it/", "arg1"), new QName("http://www.w3.org/2001/XMLSchema", "string"), ParameterMode.IN); 
     call.setSOAPActionURI(""); 
     call.setEncodingStyle(null); 
     call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE); 
     call.setProperty(AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); 

     retVal = ((String)call.invoke(new Object[] {id, code})).trim(); 
    } 
} catch (Exception e) { 
    retVal = String.format("Error: %s.", e.getMessage()); 

}

對應參照前一代碼客戶端頁的核心是:

<form method="POST" name="myform"> 
    <table border="0" width="75%"> 
    <tbody> 
     <tr> 
      <td>Web Service proxy page</td> 
     </tr> 
     <tr> 
      <td>ws End Point</td> 
      <td><input name="wsEndPoint" type="text"></td> 
     </tr> 
     <tr> 
      <td>ws Function Name</td> 
      <td><input name="wsNAME" type="text"></td> 
     </tr> 
     <tr> 
      <td><ID</td> 
      <td><input name="ID" type="text"></td> 
     </tr> 
     <tr> 
      <td>code</td> 
      <td><input name="CODE" type="text"></td> 
     </tr> 
     <tr> 
      <td>return Value</td> 
      <td><input name="retVal" type="text"></td> 
     </tr> 
     </tbody> 
     </table> 
</form> 

現在,爲了測試的頁面只需要在瀏覽器中打開如下鏈接:

http://localhost/myproxypage?ID=312001&CODE=CV2W1-OF00MA&wsEndPoint=http:%2F%2Ffedora:9000%2Faxis%2Fservices%2FwsInfo&wsNAME=mywsname 

如果客戶離你很遠,你可以發送頁面給他,並要求用他希望的參數運行上一個鏈接並讀取結果字段。 這可以幫助您完成這部分工作。

完成服務器端代理頁面後,我們可以考慮在需要執行如下更改的頁面中使用javascript: 添加一個按鈕以便在最終用戶輸入的兩個值通過調用網絡服務。 因爲我不能擁有大量的知識,並且因爲我需要加速實現一個良好而靈活的解決方案,所以我更願意使用 javascript和jquery庫來創建一個簡單的腳本以添加到感興趣的代碼頁面,如下所示:

....... some globals and locals..... ...... function wsCall(callback) { var IDVal = _idAzioneObj.val().trim(); if ((wsCallCanStart == false) || ((typeof callback !== 'function') && (IDVal.length == 0))) { return; // when waiting for ajax to complete or when called from the save button and the input field is empty.....nothing to do } if ((typeof callback === 'function') && (IDVal.length == 0)) { callback(); // on save click and input field null......continue with normal flow return; } wsCallCanStart = false; jQuery('').css('cursor', 'progress'); jQuery.ajax({ type: 'POST', url: wsProxyPage, async: true, data: { ID : _idAzioneObj.val(), CODE : codiceCorso, wsEndPoint : wsEndPoint, wsNAME : wsName }, }).done(function(data, textStatus, jqXHR) { var retValObj = jQuery(data).find('input[name="retVal"]'); if (retValObj.length > 0) { var retValJson = null; try { retValJson = jQuery.parseJSON(retValObj.val()); } catch (e) { retValJson = null; } if (retValJson != null) { try { var check = retValJson.check; var retval1 = retValJson.retval1; var retval2 = retValJson.retval2; var retval3 = retValJson.retval3; if (check < 0 || check > 6) { check = 6; } if (check == 1) { // all ok: use new variables.... if (typeof callback === 'function') { callback(); // continue with nornal flow return; } else { displayMsg(RetMsg[check]); // display message to user } } else { displayMsg(RetMsg[check]); } } catch (e) { displayMsg(genericErrorMsg); } } else { displayMsg(err, retValObj.val()); } } else { displayMsg(genericErrorMsg); } }).fail(function(jqXHR, textStatus, errorThrown) { displayMsg(genericErrorMsg); }).always(function() { wsCallCanStart = true; jQuery('').css('cursor', 'auto'); }); };

...... 
some other code 
..... 

jQuery(function() { 
    _idAzioneObj = jQuery('input[name="localname"]'); 

    if (_idAzioneObj.is(':not([type=hidden])')) { 
     _idAzioneObj.after('<a class="sbWDKButton" href="javascript:void(\'check\')" onclick="wsCall(null);return false;" title="' + btnWcTitle + '"><span class="sbDummy">' + btnWcTitle + '</span></a>'); 
     var SaveObj = jQuery('a[href="javascript:void(\'save\')"]'); 
     var saveOnClickFuncStr = SaveObj.attr('onclick'); 
     SaveObj.attr('onclick', 'wsCall(function(){' + saveOnClickFuncStr + '});return false;'); 
    } 
}); 

這樣,我克服了單純使用JavaScript在服務器端的認識不足和承諾的技術: 如果最終用戶點擊驗證按鈕WS是通過代理頁面調用,否則同樣的動作發生,如果ws回答ok,剩下的流程可以正常執行 而對Saba沒有任何知識。

這就是所有人