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.jargroovy-xml-2.4.15.jar(需与ReadyAPI内置Groovy版本一致,可通过Help > About查看)httpclient-4.5.13.jarhttpcore-4.4.14.jarcommons-codec-1.15.jarcommons-logging-1.2.jarjson-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
相关产品推荐
相关产品推荐

