使用 Kiota 生成Microsoft Graph 客户端库
Microsoft发布随时可用的 SDK,用于使用许多常用编程语言访问Microsoft Graph API。 这些 SDK 是访问 Microsoft Graph 的便捷方式,只需使用适当的包管理器安装 SDK,然后开始编码。 但是,由于Microsoft图形 REST API 的大小和范围,这些库相当大。 对于整体安装大小是一个问题的应用程序,这种大大小引起了人们的关注,尤其是当应用程序仅使用Microsoft Graph 的子集时。 在这种情况下,使用 Kiota 生成自定义 API 客户端,该客户端仅面向应用程序使用的 Microsoft Graph 部分,可以减少应用的整体安装大小。
使用生成的客户端与Microsoft SDK 的注意事项
与使用 Microsoft 发布的 SDK 相比较,使用 Kiota 生成的客户端有一些优点和缺点。
优点
- Kiota 生成的客户端使用与Microsoft发布的 SDK 相同的约定和模式。 如果已经熟悉使用 Microsoft SDK,则使用生成的库可提供类似的体验。
- 生成的客户端与Microsoft发布的 SDK 的 Microsoft Graph 核心库部分兼容,因此,如果需要使用 页面迭代器、 批处理请求或 大型文件上传等功能,可以将依赖项添加到核心库。
缺点
- 使用 Kiota 生成客户端的最终结果是源文件,必须将其添加到项目中。 这会增加基本代码的整体大小。 但是,与完整 Microsoft Graph SDK 的总体大小相比,这可能最小。
- 如果应用程序将来需要调用其他Microsoft Graph API,则必须重新生成客户端以添加所需的模型和请求生成器。
生成客户端
若要使用 Kiota 生成 Microsoft Graph 客户端,必须提供 Microsoft Graph 的 OpenAPI 说明。 可在此处找到 Microsoft Graph 的 OpenAPI 说明:
- v1.0 API:
https://aka.ms/graph/v1.0/openapi.yaml
- beta API:
https://aka.ms/graph/beta/openapi.yaml
为了减小生成的客户端的整体大小,需要标识应用使用的 Microsoft Graph API,并使用 --include-path
Kiota generate 命令的 或 --exclude-path
参数来仅生成这些 API 的模型和请求生成器。
例如,假设有一个应用程序使用 “To Do API ”来管理用户的“To Do”任务和任务列表。 所有必需的 API(如 列出任务列表 和 创建任务)都通过请求 URL 下的 /me/todo
URL 进行访问。
- 列出任务列表:
GET /me/todo/lists
- 创建任务:
POST /me/todo/lists/{listId}/tasks
在这种情况下,可以使用 --include-path
参数仅生成模型,并在路径下 /me/todo
请求 API 的生成器:
kiota generate --openapi https://aka.ms/graph/v1.0/openapi.yaml --include-path /me/todo/** ...
示例
让我们探讨一个示例,为 C# 生成客户端来调用待办 API。 使用 Microsoft Graph .NET 客户端库,应用可以使用以下代码获取已登录用户的任务列表。
using Azure.Identity;
using Microsoft.Graph;
var credential = new DeviceCodeCredential();
var graphClient = new GraphServiceClient(credential);
var taskLists = await graphClient.Me.Todo.Lists.GetAsync();
或者,应用可以使用 Kiota 生成的库来调用同一 API。 对于使用以下命令生成的客户端:
kiota generate --openapi https://aka.ms/graph/v1.0/openapi.yaml --include-path /me/todo/** --language CSharp --class-name TaskClient --namespace-name MyTaskApp.Client --output ./src/MyTaskApp/Client
等效代码如下所示:
using Azure.Identity;
using Microsoft.Kiota.Authentication.Azure;
using Microsoft.Kiota.Http.HttpClientLibrary;
using MyTaskApp.Client;
// The auth provider will only authorize requests to
// the allowed hosts, in this case Microsoft Graph
var allowedHosts = new [] { "graph.microsoft.com" };
var graphScopes = new [] { "User.Read" };
var credential = new DeviceCodeCredential();
var authProvider = new AzureIdentityAuthenticationProvider(credential, allowedHosts, scopes: graphScopes);
var adapter = new HttpClientRequestAdapter(authProvider);
var taskClient = new TaskClient(adapter);
var taskLists = await tasksClient.Me.Todo.Lists.GetAsync();
使用核心库中的功能
获取用户的任务列表可能会返回 分页响应。 Microsoft Graph 核心库提供了一个 页面迭代器 类,开发人员可以使用它来分页浏览任务列表的集合。
例如,在 C# 中,将依赖项添加到 Microsoft.Graph.Core (dotnet add package Microsoft.Graph.Core
) ,然后使用 PageIterator
类分页浏览集合。
using MyTaskApp.Client;
using MyTaskApp.Client.Models;
using Microsoft.Graph;
// Using adapter and taskLists from previous example
var pageIterator = PageIterator<TodoTaskList, TodoTaskListCollectionResponse>
.CreatePageIterator(
adapter,
taskLists,
(taskList) =>
{
Console.WriteLine(taskList.DisplayName);
return true;
});
await pageIterator.IterateAsync();