【案例】Kettle通过Httppost请求webservice接⼝以及结果解析处理
kettle中有两种⽅式请求webservice服务,⼀个是Web服务查询,但是这个有缺陷,⽆法处理复杂的需求,遇到这种情况就需要⽤Http post来处理了。
⽹上也有很多关于Http post请求webservice服务的,但是⽆⼀例外的都对请求响应后的结果没有做出处理的教程,调⽤结果最终⽬的是为了拿到数据,有时候返回的是⼀个xml 格式的集合,就需要⽤【XML⽂件输⼊】来解析每⼀个节点。⽽SOAP标准的响应结果不能直接⽤【XML⽂件输⼊】进⾏解析,下⾯就针对这种情况该如何处理做个简单的介绍。
调用webservice服务转换脚本预览:
主要包括获取变量、设置参数(SOAP请求⼊参)、发起请求(Http post)、获取body(过滤soap响应结果)、解析xml等;
第⼀步:获取变量
这⾥定义⼊参的值,模拟作业情况下上⼀步骤传过来的参数,这⾥直接设置默认值,在下⼀个步骤中使⽤。
我这⾥定义了三个参数,分别为orgCode、deptCode、staffName。
第⼆步:设置参数
这⾥主要是安装SOAP接⼝参数格式定义⼊参,他有⼀定标准的格式,其中蓝⾊框是接⼝的真正⼊参,动态变化的是红⾊框,也就是上⼀步传进来的参数,通过占位符的⽅式赋值。
这⾥⽤到了E4X,E4X 是添加了对 XML ⽀持的 JavaScript 正式标准,通过 E4X,可以通过声明变量的⽅法来声明 XML 对象变量;
第三步:发起请求
需要填⼊接⼝地址,选择字符编码为UTF-8,上⼀步骤传过来的⼊参,及响应结果变量名称,另外根据接⼝情况可能还需要设置头部信息之类的,在Fields页⾯设置,我的接⼝不需要,这⾥就不做展⽰。
第四步:获取body
下⾯是我的webService接⼝通过SoapUI⼯具测试的响应的结果⽰例:
<soap:Envelope xmlns:soap="/soap/envelope/">
<soap:Body>
<ns2:getDataResponse xmlns:ns2="webservice.ks">
<ns2:return>
<result>
<staff>
<identityNo>⾝份证号码0</identityNo>
<employeNo>⼯牌号0</employeNo>
<spellCode>拼⾳码0</spellCode>
<deptName>所属部门名称0</deptName>
<sexCode>性别代码0</sexCode>
<staffNo>员⼯内部号0</staffNo>
<sexName>性别名称0</sexName>
<staffName>员⼯姓名0</staffName>
<account>账户0</account>
<staffBirthdate>出⽣⽇期0</staffBirthdate>
<deptCode>所属部门代码0</deptCode>
</staff>
<!-- 以下忽略部分staff-->
</result>
<code>100</code>
<success>true</success>
<message>查询成功</message>
</ns2:return>
</ns2:getDataResponse>
</soap:Body>
</soap:Envelope>
我的⽬的是获取到节点result下的所有staff节点的内容,所以需要⽤到【XML⽂件输⼊】来解析这些节点。但是如果直接把响应结果进⾏解析,不管选择那个节点,执⾏时会报错:Can not apply XPath!
所以需要通过JavaScript脚本解析响应结果,只获取Body下的返回值内容:
其中转义符转换可以忽略,因为我的webservice接⼝通过http post请求返回的结果将<>符号进⾏转义,所以需要转成符号才可以进⾏下⼀步。
kettle中JavaScript脚本没有replaceAll()函数,所以如果要替换所有就需要⽤到正则表达式去到要替换的内容。
⾸先是将Http post请求响应的字符串结果创建⼀个出XML对象,然后获取soap的命名空间及响应结果的命名空间,根据这些信息拿到响应结果的body部分,最后转成格式化的字符串输出。
最终responseXML为:
<ns2:getDataResponse xmlns:ns2="webservice.ks">
<ns2:return>
<result>
<staff>
<identityNo>⾝份证号码0</identityNo>
<employeNo>⼯牌号0</employeNo>
<spellCode>拼⾳码0</spellCode>
<deptName>所属部门名称0</deptName>
<sexCode>性别代码0</sexCode>
<staffNo>员⼯内部号0</staffNo>
<sexName>性别名称0</sexName>
<staffName>员⼯姓名0</staffName>
<account>账户0</account>
<staffBirthdate>出⽣⽇期0</staffBirthdate>
<deptCode>所属部门代码0</deptCode>
</staff>
<!-- 以下忽略部分staff-->
</result>
<code>100</code>
<success>true</success>
<message>查询成功</message>
</ns2:return>
</ns2:getDataResponse>
再⽤【XML⽂件输⼊】来解析responseXML就成功了
后来,我惊讶的发现,获取body这个步骤这么复杂,⽬的不就是只取getDataResponse吗,那我是不是可以通过replace()函数把前后部分去掉呢?于是我的获取body步骤变成了:
然后打印输出到excel也是可以的:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。