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

如何解析Graph URL以动态调用GraphServiceClient的Users/Places接口?

解析Graph API路径以动态调用Users/Places端点

原始代码

public async Task<IGraphServiceUsersCollectionPage> GetResponseAsync(string s)
{            
    var queryOptions = new List<QueryOption>()
    {
        new QueryOption("$count", "true"),
        new QueryOption("$search", "")
    };

    return await graphServiceClient
                        .Users // or .Places
                        .Request(queryOptions)
                        .Header("ConsistencyLevel", "eventual")
                        .Filter("")
                        .Select("")
                        .OrderBy("")                        
                        .GetAsync();
}

需求说明

给定以下路径示例:

  • "https://graph.microsoft.com/v1.0/users"
  • "https://graph.microsoft.com/v1.0/places/microsoft.graph.room"

需要解析字符串提取users或places标识,从而动态调用graphServiceClient.Users或graphServiceClient.Places端点。


解决方案

方法1:利用Uri类解析路径段

通过Uri的Segments属性拆分路径,精准定位资源类型:

public async Task<object> GetResponseAsync(string s)
{            
    var queryOptions = new List<QueryOption>()
    {
        new QueryOption("$count", "true"),
        new QueryOption("$search", "")
    };

    var uri = new Uri(s);
    // 路径段索引2对应users/places(索引0为"/",索引1为"v1.0/")
    var resourceType = uri.Segments[2].TrimEnd('/');

    if (resourceType.Equals("users", StringComparison.OrdinalIgnoreCase))
    {
        return await graphServiceClient
            .Users
            .Request(queryOptions)
            .Header("ConsistencyLevel", "eventual")
            .Filter("")
            .Select("")
            .OrderBy("")                        
            .GetAsync();
    }
    else if (resourceType.Equals("places", StringComparison.OrdinalIgnoreCase))
    {
        return await graphServiceClient
            .Places
            .Request(queryOptions)
            .Header("ConsistencyLevel", "eventual")
            .Filter("")
            .Select("")
            .OrderBy("")                        
            .GetAsync();
    }
    else
    {
        throw new ArgumentException("不支持的资源类型", nameof(s));
    }
}

方法2:字符串分割法

直接按/分割路径字符串,定位目标段:

public async Task<object> GetResponseAsync(string s)
{            
    var queryOptions = new List<QueryOption>()
    {
        new QueryOption("$count", "true"),
        new QueryOption("$search", "")
    };

    var pathParts = s.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
    // 拆分后索引3对应users/places(示例路径拆分后为["https:","graph.microsoft.com","v1.0","users",...])
    var resourceType = pathParts[3].ToLower();

    switch (resourceType)
    {
        case "users":
            return await graphServiceClient
                .Users
                .Request(queryOptions)
                .Header("ConsistencyLevel", "eventual")
                .Filter("")
                .Select("")
                .OrderBy("")                        
                .GetAsync();
        case "places":
            return await graphServiceClient
                .Places
                .Request(queryOptions)
                .Header("ConsistencyLevel", "eventual")
                .Filter("")
                .Select("")
                .OrderBy("")                        
                .GetAsync();
        default:
            throw new ArgumentException("不支持的资源路径", nameof(s));
    }
}

注意事项

  1. 返回类型兼容:由于Users和Places端点返回的集合类型不同(IGraphServiceUsersCollectionPage和IGraphServicePlacesCollectionPage),示例中用object作为统一返回类型,可根据业务需求改用泛型、重载方法或后续类型转换处理。
  2. 大小写兼容:通过忽略大小写的匹配逻辑,避免路径大小写差异导致的匹配失败。
  3. 异常处理:添加了非法路径的异常抛出逻辑,增强代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:05:18