从SABA消费Web服务

时间:2014-10-18 14:05:53

标签: javascript jquery json web-services soap

我需要自定义SABA页面,以便在特殊呈现页面上添加HTML按钮。 按下按钮必须调用Web服务以根据输入参数获得答案,然后采取适当的措施。

WS接受JSON变量作为输入,如: { “check”:int, “planTitle”: “......” }

在调用WS之后(即:在uri调用它:http://www.blablabla.com:8080/resource/services/service1 我将得到一个结果的JSON变量。

服务器返回的经典肥皂包围是:

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

    

另请注意,Saba服务器和Web服务服务器可以托管在不同的计算机上,但位于同一个Intranet上。

现在,我有两种可能的解决方案:

  1. 在服务器上用java实现web服务.......但我无法理解这种努力的简单性或有效性.....(客户端?)

  2. 使用Jquery或直接Javascript直接在HTML呈现的页面中调用webservice并动态获取结果 有很多优雅和简洁。唯一的问题在于可能的跨浏览器问题或其他基于SABA SW限制的问题, 但是我在内联网上的图像,例如,可以克服跨浏览器方面。

  3. 您可以向我推荐哪种解决方案以及为什么?

1 个答案:

答案 0 :(得分:0)

经过一段时间,没有任何帮助,我自己解决了这个问题。所以我希望与大家分享所使用的方法。

在Remy Blom插件(参考:http://plugins.jquery.com/soap/)时使用jQuery从客户端使用Web服务 可以被认为是一个有效的替代品,足够有效,以便尽可能简单地为您完成工作。 此插件必须再次改进,但它非常易于使用。当然,它基于ajax回调。 那么你怎么想象,如果没有可能管理服务器端配置以允许&#34; Access-Control-Allow-Origin&#34;主要是 如果我们需要从互联网连接到内部网webservice服务器,我们需要扩大我们的视野。

根据我的经验,解决这种情况的最佳和最简单的方法可能是:

  1. 编写服务器端Web服务以代理请求并返回结果
  2. 编写服务器端代理页
  3. 我喜欢编写一个简单且最小的服务器端网页,只是为了使用Web服务并将响应返回给调用。 参数必须通过post / get调用传递给这样的页面,结果页面必须包含一个包含结果的相应字段。

    为什么我喜欢这样做? 因为,在服务器端使用最少的代码行,我还可以向客户提供测试对WS的调用是否正确运行的可能性 一些参数由客户即时决定,并在浏览器上查看html页面以获得结果。

    对我来说,在服务器端创建代理,在客户端使用它并让客户自己测试它是正确的妥协。

    安全问题?不好了。它们完全取决于您添加代理页面的Web服务器的安全性。

    此解决方案也足够灵活,可用于:java,c#,nodejs,php,perl,......

    所以我拥有哪种网络服务器绝对不重要:有时候Saba唯一的一个词会令人困惑。

    让我们描述解决方案。

    在服务器端,我创建了一个简单的Saba网页,主要包含以下服务器代码,以便从请求中获取输入参数, 构建Web服务调用并使用它。结果,输出字段得以实现。 Java代码(使用轴1)是:

        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: 添加一个按钮以动态验证最终用户输入的两个值是否通过调用Web服务进行更正。 因为我不能拥有大量的知识,因为我需要加快我喜欢使用的良好而灵活的解决方案 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;');
        }
    });
    

    ...... 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和promise技术克服了服务器端缺乏知识: 如果最终用户单击验证按钮,则通过代理页面调用ws,否则会发生相同的操作,如果ws回答正常,则可以正常执行其余流程 对萨巴没有任何了解。

    所有人