使用HTTP连接器调用Salesforce后,无法提取access_token值该如何解决?
调用Salesforce的HTTP接口后,返回内容的Content-Type为application/x-www-form-urlencoded,但实际内容是一个JSON字符串,示例如下:
{"access_token":"00D5j0008yLhA!ARwAQBufl2Y6S1Tu3AU5zUWBCb442Nj2JqwWFOkm3AFL16CQZleLO.mnZwlDFttOMEnldbt_WqJBzhLrh1mgI1XEIvAN8sAM","instance_url":"https://cloudceitude-13a-dev-ed.my.salesforce.com","id":"https://login.salesforce.com/id/00D5j00000LhAEAU/0055j000004TZbAAAW","token_type":"Bearer","issued_at":"1668188564383","signature":"LQbWIODP8pqE+wD1yjgbVUBxMDI6YV1HjENZUeK/eoY="}
尝试通过payload.access_token提取access_token值时失败;使用Transform连接器执行简单的DataWeave转换(仅输出payload)后问题依旧。调试发现map函数无法作用于当前payload,调用MapObject返回URL编码后的表单内容,示例:
key=%7B%22access_token%22%3A%2200D5j000008yLhA%21ARwAQIN5UGZWtk8Ucu8MUNgbnHAKleeqAk2M73Afy9iRKNEKRppu4C7Drfi0hg8q5t8C.PYX7RsMMXQPsjxmpVB1Ev_pU.2p%22%2C%22instance_url%22%3A%22https%3A%2F%2Fcloudcertitude-13a-dev-ed.my.salesforce.com%22%2C%22id%22%3A%22https%3A%2F%2Flogin.salesforce.com%2Fid%2F00D5j000008yLhAEAU%2F0055j000004TZbAAAW%22%2C%22token_type%22%3A%22Bearer%22%2C%22issued_at%22%3A%221668330168420%22%2C%22signature%22%3A%22kkDnnUe9pZfiqiuEjRi02az0lwpAlmwmv3cMRmF9nRU
核心原因是:Salesforce返回的application/x-www-form-urlencoded数据中,整个JSON字符串被封装成了一个名为key的表单参数值。直接处理payload会将其视为表单数据,而非JSON对象,因此需要分两步处理:
解析URL编码的表单数据
使用DataWeave的readUrlEncoded函数解析表单,提取出包含JSON的key字段值:%dw 2.0 output application/json --- readUrlEncoded(payload).key将字符串解析为JSON并提取字段
把第一步得到的字符串用read函数转换为JSON对象,之后即可正常访问access_token:%dw 2.0 output application/json --- read(readUrlEncoded(payload).key, "application/json").access_token
也可以合并为一行代码直接提取:
%dw 2.0 output application/json --- (read(readUrlEncoded(payload).key, "application/json")).access_token
备选方案:
如果HTTP连接器允许,可尝试将连接器的Response Content Type强制设置为application/json,让Mule自动处理解析。但如果返回的Content-Type头确实是application/x-www-form-urlencoded,优先使用上述DataWeave处理方式更可靠。
内容的提问来源于stack exchange,提问作者nischal vasisth

