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

Groovy实现Client Credentials型OAuth2.0 Access Token自动获取及报错解决

解决ReadyAPI Groovy脚本中java.lang.NoClassDefFoundError: org/apache/ivy/util/MessageLogger问题

问题原因

你遇到的错误是因为ReadyAPI(SoapUI Pro)的Groovy运行环境不支持@Grab注解——这个注解依赖Ivy工具自动下载第三方库,但ReadyAPI默认未包含Ivy相关依赖包,同时其类加载机制与标准Groovy环境不同,导致无法解析Ivy的类。

解决方案

方案1:手动添加HTTPBuilder依赖包

放弃使用@Grab,直接将HTTPBuilder及其所需依赖包放到ReadyAPI的lib目录中:

  • 下载以下匹配http-builder-0.7.1版本要求的依赖包:
    • http-builder-0.7.1.jar
    • groovy-xml-2.4.15.jar(需与ReadyAPI内置Groovy版本一致,可通过Help > About查看)
    • httpclient-4.5.13.jar
    • httpcore-4.4.14.jar
    • commons-codec-1.15.jar
    • commons-logging-1.2.jar
    • json-lib-2.4-jdk15.jar
  • 将所有下载的jar包复制到ReadyAPI安装目录下的bin\ext文件夹(Windows)或/Applications/ReadyAPI-[version]/Contents/Resources/app/bin/ext(Mac)。
  • 重启ReadyAPI,移除脚本开头的@Grab注解后重新运行。

方案2:改用ReadyAPI自带的HTTP客户端(推荐)

直接使用ReadyAPI内置的HTTP工具类,无需额外依赖,代码示例如下:

def clientId = '*************-ac6efba39e6a'
def clientSecret = '**********_icH6Nr6.7'
def tokenUrl = 'https://login.microsoftonline.com/*******/oauth2/v2.0/token'

// 获取Access Token
def tokenHttpClient = com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.getHttpClient()
def tokenPost = new org.apache.http.client.methods.HttpPost(tokenUrl)

// 构造请求体
def params = new ArrayList<org.apache.http.NameValuePair>()
params.add(new org.apache.http.message.BasicNameValuePair("grant_type", "client_credentials"))
params.add(new org.apache.http.message.BasicNameValuePair("client_id", clientId))
params.add(new org.apache.http.message.BasicNameValuePair("client_secret", clientSecret))
tokenPost.setEntity(new org.apache.http.client.entity.UrlEncodedFormEntity(params, "UTF-8"))

// 发送请求并解析响应
def tokenResponse = tokenHttpClient.execute(tokenPost)
def tokenEntity = tokenResponse.getEntity()
def tokenJson = new groovy.json.JsonSlurper().parse(tokenEntity.getContent())
def accessToken = tokenJson.access_token

// 使用Access Token调用API
makeApiRequest(accessToken)

def makeApiRequest(accessToken) {
    def apiHttpClient = com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.getHttpClient()
    def apiGet = new org.apache.http.client.methods.HttpGet('https://***-npd.az****.ca')
    apiGet.addHeader("Authorization", "Bearer $accessToken")
    
    def apiResponse = apiHttpClient.execute(apiGet)
    def apiEntity = apiResponse.getEntity()
    def apiJson = new groovy.json.JsonSlurper().parse(apiEntity.getContent())
    println apiJson
}

该方案利用ReadyAPI自带的Apache HttpClient和Groovy内置的JsonSlurper,无需额外添加依赖,稳定性更高,适配无GUI命令行运行场景。

内容的提问来源于stack exchange,提问作者Jamil Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:29