Groovy脚本中请求头传递JWT访问BMC Atrium CMDB失败排查
解决BMC Atrium CMDB API Groovy脚本授权错误问题
我看到你遇到的问题了——已经成功获取到JWT token,但调用CI数据API时总是返回{"messageType":"ERROR","messageText":"A user name must be supplied in the control record","messageNumber":149}错误,哪怕已经给token加上了AR-JWT 前缀对吧?问题出在Groovy脚本里设置请求头的方式上。
问题根源
你在GET请求的闭包中使用了httpRequester.setHeaders(headerMap)来设置请求头,但这个方法是给整个HTTPBuilder实例设置全局默认请求头,而不是针对当前这一次请求。在request闭包的执行上下文里,当前请求的构建已经开始,此时调用全局设置不会把Authorization头正确附加到当前请求中,导致API无法识别你的授权信息,进而提示需要用户名。
修复方案
直接在request闭包中操作req对象来设置请求头,确保Authorization头被正确添加到当前GET请求里。修改后的代码片段如下:
//Get call to fetch the CI Data httpRequester = new groovyx.net.http.HTTPBuilder("http://<localhost>:<port>/api/arsys/v1/entry/AST:ComputerSystem") def finalToken = "AR-JWT " + token ; httpRequester.request(groovyx.net.http.Method.GET) { req -> println "Inside request" // 直接通过req对象设置当前请求的Authorization头 req.headers.'Authorization' = finalToken // GET请求无请求体,无需设置Content-Type为URLENC,可移除该头 // req.headers.'Content-Type' = 'application/x-www-form-urlencoded' response.success = { resp, json -> println "response success" httpResponse = resp jsonResponse = json } response.failure = { resp, json -> println "response failure" httpResponse = resp jsonResponse = json } }
额外说明
- 移除不必要的Content-Type头:GET请求通常没有请求体,
application/x-www-form-urlencoded是用于POST表单提交的Content-Type,保留它可能会对API解析造成干扰,建议移除。 - 无需额外授权参数:既然已经使用JWT token授权,就不需要再传递用户名密码组合或其他Authentication相关头,只需要确保Authorization头的格式正确(
AR-JWT <你的token>)即可。
修改后重新运行脚本,应该就能正确传递授权信息,解决"必须提供用户名"的错误了。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

