Groovy调用MS Graph API获取用户ID失败,提示无value属性
问题描述
我们用于通过MS Graph API收集AD用户信息的Groovy脚本突然失效。直接用POSTMAN调用该API能正常返回包含用户ID的响应,但Groovy脚本中访问json.value时提示No such property: value for class: java.lang.Object,且json.toString()返回的结构里value是空数组。
POSTMAN返回的正常响应
{"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users", "value": [ { "businessPhones": [], "displayName": "Rhea Sam", "givenName": null, "jobTitle": null, "mail": "user@mydoamin.com", "mobilePhone": null, "officeLocation": null, "preferredLanguage": null, "surname": null, "userPrincipalName": "user@mydoamin.com#EXT#@rlxcom.onmicrosoft.com", "id": "05906321-ed38-4bfd-9c9e-02bfb7d32405" } ] }
问题Groovy代码
public String getGuestUserId(String AuthToken,String userEmail){ String _userId def http = new HTTPBuilder("https://graph.microsoft.com/v1.0/users/?") http.request(GET) { requestContentType = ContentType.JSON //uri.query = [ $filter:"mail eq '$userEmail'"].toString() uri.query=[$filter:"mail eq '$userEmail'"] headers.'Authorization' = "Bearer " + AuthToken response.success = { resp, json -> if (json.value){ _userId=json.value[0].id } else _userId=-1 // user does not exist } // user ID not found : error 404 response.'404' = { resp -> _userId = 'Not Found' } } _userId }
排查分析
- 查询参数解析错误:Groovy中
$是变量插值符号,直接写$filter会被当成变量解析,导致传递给Graph API的过滤条件无效,返回空的value数组。POSTMAN中参数构造正确,所以能拿到结果。 - JSON解析类型异常:当API返回空
value时,HTTPBuilder可能将响应解析为普通Object而非可访问属性的JSON对象,导致访问json.value时报错。
解决方案
修复后的Groovy代码
public String getGuestUserId(String AuthToken, String userEmail) { String _userId def http = new HTTPBuilder("https://graph.microsoft.com/v1.0/users/") http.request(GET, ContentType.JSON) { // 转义$符号,确保filter参数正确传递 uri.query = [ "\$filter": "mail eq '${userEmail}'" ] headers.'Authorization' = "Bearer " + AuthToken // 明确指定接收JSON格式响应 headers.Accept = ContentType.JSON.toString() response.success = { resp, json -> // 增加类型与非空判断,避免空指针 if (json instanceof Map && json.value != null && !json.value.isEmpty()) { _userId = json.value[0].id } else { _userId = "-1" // 用户不存在标记 } } response.'404' = { resp -> _userId = 'Not Found' } // 处理其他异常响应 response.failure = { resp -> _userId = "Error: ${resp.statusLine}" } } return _userId }
关键修复点
- 转义
$filter中的$符号:用\$filter避免Groovy变量插值干扰参数传递。 - 指定响应解析类型:在
request方法中加入ContentType.JSON,强制HTTPBuilder将响应解析为可访问属性的JSON对象。 - 增加安全判断:先验证
json类型与value非空,避免空指针或类型错误。
内容的提问来源于stack exchange,提问作者SCW
相关产品推荐
相关产品推荐

