启封管理咨询

修身,齐家,治国,平天下
热 线 电 话 400-618-3060

Javascript在X3中可扩展性示例

本文介绍了如何将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 <Tag1 atb1="a1" atb2="a2"> <Tag2>t2</Tag2> <Tag3>t3</Tag3> </Tag1>


解析为:

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


请注意,此模块不执行任何标记或类型映射。XML标记like <soap:Envelope ...>映射到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 在哪里,和postBodypostContentType您要发布的正文(字符串)及其内容类型。

 

如果请求是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:Envelopesoap:BodyConversionRateResponse和)来提取结果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
本原创文章未经允许不得转载 | 当前页面:启封管理咨询 » Javascript在X3中可扩展性示例

评论