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

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
        
    } 
排查分析
  1. 查询参数解析错误:Groovy中$是变量插值符号,直接写$filter会被当成变量解析,导致传递给Graph API的过滤条件无效,返回空的value数组。POSTMAN中参数构造正确,所以能拿到结果。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:11:15