You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:58:14