Kettle通过Http post请求webservice接口以及结果解析处理
kettle中有两种方式请求webservice服务,一个是Web服务查询,但是这个有缺陷,无法处理复杂的需求,遇到这种情况就需要用Http post来处理了。
网上也有很多关于Http post请求webservice服务的,但是无一例外的都对请求响应后的结果没有做出处理的教程,调用结果最终目的是为了拿到数据,有时候返回的是一个xml格式的集合,就需要用【XML文件输入】来解析每一个节点。而SOAP标准的响应结果不能直接用【XML文件输入】进行解析,下面就针对这种情况该如何处理做个简单的介绍。
转换脚本预览:
主要包括获取变量、设置参数(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="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getDataResponse xmlns:ns2="http://webservice.ks.com">
<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="http://webservice.ks.com">
<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也是可以的:
Kettle通过Http post请求webservice接口以及结果解析处理的更多相关文章
- 请求webservice接口的某方法数据
NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxxxWS?wsdl"]; NSString *soapMs ...
- java使用POST发送soap报文请求webservice返回500错误解析
本文使用JAX-WS2.2编译webservice,并使用HttpUrlConnection的POST方式对wsdl发送soap报文进行请求返回数据, 对错误Server returned HTTP ...
- C++webservice接口调用
一.WebService例子 1.准备要调用的webservice接口的wsdl地址,比如网上的查询天气接口:http://ws.webxml.com.cn/WebServices/WeatherWS ...
- ajax跨域请求调用webservice接口
1.WebService 接口编写 步骤:新建web项目=>添加web service=>编写方法接口=>然后发布(本地测试可以直接把这个web service运行起来). 关键如何 ...
- 通过jmeter发送webservice接口请求
1.webservice接口地址:http://ip:port/...?wsdl 2.接口数据类型:<cuxGmiChukuRmaTrxV><salesrepId xmlns:xsi ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- python通过http请求发送soap报文进行webservice接口调用
最近学习Python调用webservice 接口,开始的时候主要采用suds 的方式生产client调用,后来发现公司的短信接口采用的是soap报文来调用的,然后开始了谷歌,最后采用httplib ...
- 从xfire谈WebService接口化编程
前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...
- ab post 测试 http 和 webservice 接口方法及用例
1.ab测试简单http请求 ab -n30000 -c1000 "http://10.1.1.21:8080/" 2.ab 测试 http 接口 (POST) ab -n400 ...
随机推荐
- Win64 驱动内核编程-27.强制读写受保护的内存
强制读写受保护的内存 某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的). 方案1(R3):直接修改别人内存 最基本的也最简单的 ...
- 插入排序——Python实现
插入排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 20:47 # @Author : yuzhou_1shu # @Email : y ...
- 40 图 |我用 Mac M1 玩转 Spring Cloud
我的开源 Spring Cloud 项目 PassJava 一直可以在 Windows 上正常运行,最近不是换 Mac M1 了么,想把这个项目在 M1 上跑起来,毕竟我的那台 Windows 用起来 ...
- 【小技巧】Eclipse 中创建Maven项目后没有WEB-INF文件夹以及web.xml文件
懒得截图了,一张图配下面步骤搞定. 1.右键项目,选择propertities后选择图中①(被遮住了): 2.先不②勾选去掉,点击Apply:然后在把②处勾选上.此时④位置会出现东东,点击蓝色超链接. ...
- .NET平台系列目录
本系列主要讲解微软.NET平台发展历程以及.NET框架技术.包含.NET Framework..NET Core.Xamarin..NET Standrad等技术与应用. 1..NET平台系列 .NE ...
- 5分钟让你理解K8S必备架构概念,以及网络模型(中)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- tar cf XXX.tar /tmp /var 日志保存
tar cf XXX.tar /tmp /var 检测tar tf XXX.tar /tmp /var
- CentOS 7.3 安装指南 作者: Matei Cezar 译者: LCTT geekpi
CentOS 7.3 安装指南 作者: Matei Cezar 译者: LCTT geekpi | 2016-12-20 09:12 评论: 11 收藏: 4 分享: 1 基于 Red Hat 企 ...
- jmeter while控制器踩坑
在使用jmeter测试一个复杂流程,需要用到while控制器,对于里面的contition,使用jexl3方式,怎么看都没有问题,可是死活跳不出流程,各种莫名其妙的报错,甚至用单个写死的变量(已设置为 ...
- IT菜鸟之总结(Du teacher)
初次接触云计算,从以前对计算机的一窍不通,经过这三周的学习,起码是通了一窍了:哈哈,至少是对计算机的组成及系统的安装都有了认识,也初次学习了Linux系统,对其的发展和使用有了认识,也学到了一些基础的 ...