目的:用Talend实现用Restful形式发布webservice
实现:该示例实现了三个功能:通过查询获取数据;通过调用存储过程获取数据;新增数据。
总体图:
各个组件的主要配置如下:
tRESTRequest_1是Job的主入口,我们这里实现了三个方法,使用不同形式传输。
另外注意的是,因为我们是打算部署到karaf container中,所以REST的Endpoint相同的不能部署在一起,会有冲突,所以我们一般建议在port后面追加模块或系统的标示一起做endpoint,这样就不用耗费很多port来部署了!
下面分三个方法来列出Sample,
getUser:使用GET的传输方法,只传输一个id,URI Pattern:"/{id}/",调用示例就是http://localhost:8088/user/1/
获取参数并映射
使用tMSSqlRow组件来实现传参查询
通过tParseRecordSet组件将结果集转换为Set集合
如果有记录,将记录打包成要输出的XML
然后通过组件返回结果!
另外,如果查询没有结果的话,加入判断,并包装返回的xml返回!
注意:在这个Job中,因为我有两个判断,虽然是从不同节点if的,但可能是由于组流程在一个main job中,所以如果只用(Integer)globalMap.get("tParseRecordSet_2_NB_LINE") == 0一个条件判断的话,在运行是,另外一个if也会执行,所以在此加上了URI的一些判断!
这样getUser基本完成!
其他两个操作基本类似,在此就不累述!不过在此对调用存储过程的稍加截图说明一下!
使用tMSSqlSp组件,Parameters,一个是输入参数,一个是输出记录集RECORD SET
在tParseRecordSet时选择输出记录集RECORD SET的users,并添加需要输出的栏位!
注意事项:
以前没留意,近期发现一个问题,就是tRESTRequest的REST Endpoint好像不能使用变量,例如不能使用context.endpointurl,而只能直接输入字符串"http://localhost:8088/user"之类的,具体为什么会这样,没具体查找原因!
但是如果用了类似变量context.endpointurl的话,在designer里面测试是没问题的,但是部署到container中后就有问题,虽然状态显示是Active,但是访问不了,可能会出现如下提示: