为什么Soffid JSON REST Web Services连接器无法更新目标系统对象
Soffid 3对接自定义Web应用Schrift时REST连接器更新数据失败问题
问题描述
我正在尝试将Soffid 3服务器对接我们名为Schrift的自定义Web应用,为此使用了JSON REST Web Services Connector。我先添加了REST Web服务插件,随后配置了类型为JSON/XML/SOAP Rest webservice的代理。
对象拉取功能运行正常,REST连接器可成功连接Web服务并获取账户数据。
问题出在更新数据的场景:比如我尝试锁定某一账户时没有任何响应,我也不清楚正常流程下该触发什么动作。REST连接器应该在何时、以何种方式向托管系统发送更新数据?我没有找到任何REST连接器尝试向托管系统更新对象的日志条目,可能是我操作有误或遗漏了某些配置。
更新1(收到首个答复后排查结果)
- 核对了代理设置:Read only和Manual account creation均设置为no
- 该账户原本为非托管类型,我已成功将其类型改为shared后再改为single,全程无报错,当前类型为single
- 任务队列为空。
另外我也确认了更新方法已配置,更新属性设置正确,updateParams未设置(意味着所有属性都应发送给托管系统)。
但我将账户状态从启用改为禁用时,仍然没有任何响应。
控制台日志中仅能看到如下条目:14-Sep-2021 13:26:29.708 INFO [BPM-Scheduler:192.168.7.121:1] com.soffid.iam.bpm.job.JobExecutorThread.run No job to execute
我手动运行“Analize impact for changes on Schrift”任务时,执行日志显示:
Changes detected for accounts ============================= NO CHANGE DETECTED Changes detected for roles ============================= NO CHANGE DETECTED
更新2
经过多次尝试我取得了一些进展,现在我修改账户信息后,会生成名为UpdateAccount baklykov@irf.com.ua@Schrift的任务,但任务运行报错。
最开始是415 Unsupported Media Type错误,现在报错信息有变化:
Throws exception updating object : Extensible object [type = account] EmployeeEmail: baklykov@irf.com.ua IsLockedOut: true (log truncated) ... caused by Unexpected response, Content-Type: null
更新3
我定位到Soffid的对象更新请求格式有误:所有参数都放在了html请求中,没有写入JSON body。
调研后我找到了方法的Encoding属性,将其设置为application/json。
现在参数会按需求写入JSON body,但新的问题是Soffid会把所有参数都放入JSON body,包括用于定位待更新对象的键参数,我猜测这是目标系统对象仍未更新的原因。
也就是说我的应用期望的请求格式如下:
https://myapp.mysite.com/api/v1/Soffid/Employees?EmployeeEmail=baklykov%40irf.com.ua : {"EmployeeLastName":"Baklykov","EmployeeFirstName":"Ivan"}
但Soffid实际发送的请求是:
https://myapp.mysite.com/api/v1/Soffid/Employees: {"EmployeeLastName":"Baklykov","EmployeeFirstName":"Ivan","EmployeeEmail":"baklykov@irf.com.ua"}
解决方案
按以下步骤调整配置即可解决当前问题:
- 进入Schrift代理的Update方法配置页,找到
Filter parameters配置项,将EmployeeEmail添加到该列表中,Soffid会自动把列表内的参数作为URL查询参数拼接,不会写入请求Body。 - 如需控制Body内的返回字段,可配置
updateParams参数,仅填写需要更新的字段名称(比如EmployeeLastName、EmployeeFirstName、IsLockedOut等),不需要的字段无需填写,即可实现Body与查询参数的拆分。 - 针对之前的
Content-Type: null报错,确认Schrift接口的响应是否携带了合法的Content-Type响应头,哪怕是200空响应也建议补充Content-Type: application/json响应头,避免Soffid识别异常。 - 配置调整完成后重新触发账户更新操作,即可生成符合预期格式的请求。
内容的提问来源于stack exchange,提问作者Ivan Baklykov
相关产品推荐
相关产品推荐

