本文介绍了如何将Sage X3与外部SOAP(XML)Web服务集成。

您可以实现一个捆绑包,该捆绑包允许4GL代码调用外部Web服务以返回货币兑换率。

其他文章介绍了如何创建基本的4GL扩展包以及如何在包中使用异步API。本文假定您熟悉基础知识,并说明了调用外部SOAP Web服务的机制。

XML助手
本示例使用一个名为的小型JavaScript帮助器jsxml。此帮助程序使您可以在XML和JavaScript对象之间来回转换。该API的灵感来自JavaScript的标准JSON API:

CODECODE CODE javascript var JSXML = require('jsxml'); var xml = JSXML.stringify(obj); // converts a JavaScript object tree to XML var obj = JSXML.parse(xml); // parses an XML string and returns it as a JavaScript object.

该助手使用一种特殊的技巧来区分XML属性和元素:这些属性收集在$其包含对象内的特殊键下。例如:

CODECODE CODE xml t2 t3

解析为:

CODECODE CODEjson { "Tag1": { "$": { "atb1": "a1", "atb2": "a2" }, "Tag2": "t2", "Tag3": "t3" } }

请注意,此模块不执行任何标记或类型映射。XML标记like 映射到JSON密钥,并且JSON结果中"soap:Envelope"的数字值like 作为字符串150.20返回为"150.20"。基本原理是使解析器和格式化程序尽可能简单,因为JavaScript使对解析器的结果进行后处理变得非常容易。

HTTP助手
本示例使用了名为的第二个帮助器httpclient。此帮助程序使您可以轻松调用外部HTTP URL。

典型的呼叫如下所示:

CODECODE CODE javascript var response = httpClient.httpRequest(, { url: postUrl, method: 'POST', headers: { 'content-type': postContentType, 'content-length': postBody.length, // more headers if necessary } }).write(, postBody, 'utf8').end().response(_);

postUrl您要发布到的URL 在哪里,和postBody/ postContentType是您要发布的正文(字符串)及其内容类型。

如果请求是a GET而不是a POST,则该请求将简化为:

CODECODE CODE javascript var response = httpClient.httpRequest(, { url: getUrl, method: 'GET', headers: { // headers, if necessary } }).end().response();

请注意,write呼叫已消失,但end()呼叫仍然存在。这很重要,因为end()呼叫会发送请求。

上面的示例使用“ streamline.js”编写调用。您还可以使用常规回调编写它,也可以使用备用的“ node.js”库,但是您将失去该httpclient库为您提供的一些好处。主要的是httpclient帮助程序使用您通过Sage X3管理界面配置的代理。如果使用其他库,则必须自己处理代理。

调用外部SOAP Web服务
您可以通过http://www.webservicex.net/CurrencyConvertor.asmx?op=ConversionRate调用测试服务。请注意,此服务仅是测试Web服务。在实际的应用程序中,您应该使用专门用于生产的Web服务,并且可能必须与该服务的提供者签订合同。

使用这两个助手,该捆绑包可以实现为:

CODECODE CODE javascript "use strict"; var httpClient = require('syracuse-httpclient'); var jsxml = require('jsxml'); function requestXml(fromCurrency, toCurrency) { return jsxml.stringify({ "soap:Envelope": { $: { "xmlns:soap": "http://www.w3.org/2003/05/soap-envelope", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", "xmlns": "http://www.webserviceX.NET/", }, "soap:Body": { ConversionRate: { FromCurrency: fromCurrency, ToCurrency: toCurrency, } } } }); } exports.conversionRate = function(, fromCurrency, toCurrency) { var reqXml = requestXml(fromCurrency, toCurrency); var response = httpClient.httpRequest(, { url: 'http://www.webservicex.net/CurrencyConvertor.asmx', method: 'POST', headers: { 'content-type': 'application/soap+xml; charset=utf-8', 'content-length': reqXml.length, } }).write(, reqXml, 'utf8').end().response(); if (response.statusCode !== 200) throw new Error("service request failed, statusCode=" + response.statusCode); var resp = jsxml.parse(response.readAll(_)); var body = resp['soap:Envelope']['soap:Body']; return body.ConversionRateResponse.ConversionRateResult; }

该代码非常简单:

  • requestXml生成要发布的XML字符串。
    *用conversionRate调用Web服务httpClient.httpRequest。然后,它检查状态码并使用解析回复jsxml.parse。然后,通过走动4个键soap:Envelope(soap:Body,ConversionRateResponse和)来提取结果ConversionRateResult。

请注意,JavaScript键区分大小写。结果中使用的键必须与SOAP响应的标签完全匹配。通过console.error(JSON.stringify(resp));在分配的行之后添加一条语句,可以轻松地跟踪响应resp。

从4GL调用异步JavaScript函数
现在,您可以编写一个小的4GL API来调用此Web服务:

Funprog CONVERSION_RATE(FROM_CRY, TO_CRY) Local Integer STATUSCODE Local Clbfile RESHEAD Local Clbfile RESBODY STATUSCODE = func ASYRWEBSER.EXEC_JS( "xa1-currency-converter/lib/currency-converter", # MODULE "conversionRate", # FUNCTION "wait", # MODE: asynchronous, wait for result '"' + FROM_CRY + '", "' + TO_CRY + '"', # ARGUMENTS "0", # ENCODINGS: input is not encoded 0, # CALLBACK: at the beginning of argument list "", # RETURNS: empty "0", # RETURNS_ENC: result is not encoded RESHEAD, # RESHEAD: unused RESBODY) # RESBODY: the result If STATUSCODE<>200 : End "" : Endif # RESBODY is our result, as a string. Return it as a decimal End val(RESBODY)
现在,您可以使用此4GL API获取货币兑换率:

Subprog TEST_CRY() Local Decimal RATE RATE = func CONVERSION_RATE("EUR", "USD") INFBOX(RATE) End

电话:400-618-3060
上海启封企业管理咨询有限公司
上海总部: 上海市黄浦区延安东路45号上海工商联大厦507室
联系电话: 021-31200832
杭州分公司:浙江杭州市下城区新天地世嘉君座4幢1105-1107室
联系电话:0571-88121121
有意了解完整方案,敬请关注:
http://www.sageas.cn
Javascript在X3中可扩展性示例_第1张图片