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接口以及结果解析处理的更多相关文章

  1. 请求webservice接口的某方法数据

    NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxxxWS?wsdl"]; NSString *soapMs ...

  2. java使用POST发送soap报文请求webservice返回500错误解析

    本文使用JAX-WS2.2编译webservice,并使用HttpUrlConnection的POST方式对wsdl发送soap报文进行请求返回数据, 对错误Server returned HTTP ...

  3. C++webservice接口调用

    一.WebService例子 1.准备要调用的webservice接口的wsdl地址,比如网上的查询天气接口:http://ws.webxml.com.cn/WebServices/WeatherWS ...

  4. ajax跨域请求调用webservice接口

    1.WebService 接口编写 步骤:新建web项目=>添加web service=>编写方法接口=>然后发布(本地测试可以直接把这个web service运行起来). 关键如何 ...

  5. 通过jmeter发送webservice接口请求

    1.webservice接口地址:http://ip:port/...?wsdl 2.接口数据类型:<cuxGmiChukuRmaTrxV><salesrepId xmlns:xsi ...

  6. Node.js 使用 soap 模块请求 WebService 服务接口

    项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...

  7. python通过http请求发送soap报文进行webservice接口调用

    最近学习Python调用webservice 接口,开始的时候主要采用suds 的方式生产client调用,后来发现公司的短信接口采用的是soap报文来调用的,然后开始了谷歌,最后采用httplib ...

  8. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  9. ab post 测试 http 和 webservice 接口方法及用例

    1.ab测试简单http请求 ab -n30000 -c1000 "http://10.1.1.21:8080/" 2.ab 测试 http 接口 (POST) ab -n400 ...

随机推荐

  1. Python第四章-字典

    第四章 字典-当索引不好用时 4.0     字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping).   字典是Python中唯一内建的映射类型,字典中的值并 ...

  2. Windows PE资源表编程(枚举资源树)

    资源枚举 写一个例子,枚举一个PE文件的资源表.首先说下资源相关的作为铺垫. 1.资源类型也是PE可选头中数据目录的一种.位于第三个类型. 2.资源目录分为三层.第四层是描述文件相关的.这些结构是按照 ...

  3. PhotoShop 第一课 功能认识

    功能认识 1.基本界面 可以对各工具栏进行编辑,对工具/栏目进行勾选添加和整合并搭建自己的专属操作页面. 2.画布设置 拍照或者画画都需要一个东西来呈现这个东西叫做画布(可以通过导航栏-文件-新建画布 ...

  4. spring泛型注入

    泛型依赖注入 Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持. 泛型依赖注入允许我们在使用spring进行依赖注入的同时,利用泛型的优点对代码进 ...

  5. 【技巧】使用xshell和xftp连接centos连接配置

    说明:xshell用来执行指令,xftp用来上传和下载文件. ① 这是xshell连接属性: ②.这是xftp连接属性 附件:这里给个xshelll和xftp的免安装的破解版本地址.侵删. 度娘链接: ...

  6. python爬虫——抖音数据

    最近挺火的抖音短视频,不仅带火了一众主播,连不少做电商的也进驻其中,于是今天我来扒一扒这火的不要不要的抖音数据: 一.抓包工具获取用户ID 对于手机app数据,抓包是最直接也是最常见的手段,常用的抓包 ...

  7. easy-flows源码研习

    一.项目概述 1.原项目github地址:https://github.com/j-easy/easy-flows.git 2.easy-flows可以用非常简易的api创建常用的可组合的工作流.涵盖 ...

  8. Redis内存——内存消耗(内存都去哪了?)

    最新:Redis内存--三个重要的缓冲区 最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... ...

  9. Spring Cloud Gateway 之获取请求体(Request Body)的几种方式

    Spring Cloud Gateway 获取请求体 一.直接在全局拦截器中获取,伪代码如下 private String resolveBodyFromRequest(ServerHttpReque ...

  10. 8.Linux的目录管理

    3 Linux目录管理 3.1 Linux 文件与目录管理 3.1.1 目录常用命令 ls: 列出目录 cd: 切换目录 pwd: 显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空 ...