Imagine que você é um desenvolvedor em uma empresa de Software de Gerenciamento de Aprendizagem chamada Bellows College que cria cursos de treinamento e materiais para empresas. Você usa a experiência colaborativa dos grupos do Microsoft 365 para fornecer conteúdo do curso e exercícios de registro entre os participantes para cursos online e cursos ministrados por instrutores. Você deseja tornar os grupos do Microsoft 365 usados para cursos de treinamento facilmente identificáveis como cursos de treinamento, o que permite que outros desenvolvedores descubram seus grupos e criem experiências avançadas em cima de seus cursos de aprendizagem.
Para este cenário, este artigo mostra como:
Descubra as definições de extensão de esquema disponíveis que você poderia usar.
Registrar uma definição de extensão de esquema direcionada a grupos de cursos de treinamento.
Crie um novo grupo com dados personalizados com base na definição de extensão de esquema que você registrou.
Adicionar, atualizar ou remover dados personalizados em um grupo existente com base em uma definição de extensão de esquema.
Leia um grupo e os dados de extensão.
Exclua a definição de extensão de esquema e os dados de extensão.
Observação
Além dos grupos, as extensões de esquema também têm suporte e podem ser gerenciadas para outros tipos de recursos.
Pré-requisitos
Para reproduzir as etapas deste artigo, você precisa dos seguintes privilégios:
Conceda ao aplicativo as permissões Group.ReadWrite.All e Application.ReadWrite.All delegadas para o usuário conectado.
Seja o proprietário de um aplicativo que você atribui a propriedade da definição de extensão de esquema neste tutorial. Neste tutorial, o aplicativo é chamado de extensions-application e tem appIdd1e6f196-fca3-48ad-8cd3-1a98e3bd46d2.
Etapa 1. Exibir extensões de esquema disponíveis
Primeiro, como desenvolvedor, talvez você queira que o aplicativo reutilize todas as definições de extensão de esquema existentes se elas estiverem adequadas para a finalidade. No exemplo a seguir, você consulta extensões de esquema nomeadas (pela id) bellowscollege_courses. Suponha que a resposta mostre que não há extensões de esquema nomeadas bellowscollege_courses em seu locatário.
GET https://graph.microsoft.com/v1.0/schemaExtensions?$filter=id eq 'bellowscollege_courses'
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.SchemaExtensions.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Filter = "id eq 'bellowscollege_courses'";
});
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
SchemaExtensionCollectionResponse result = graphClient.schemaExtensions().get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "id eq 'bellowscollege_courses'";
});
HTTP/1.1 200 OK
Content-Type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#schemaExtensions",
"@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET schemaExtensions?$select=description,owner",
"value": []
}
Você também pode consultar pela id como um parâmetro de caminho da seguinte maneira: GET https://graph.microsoft.com/v1.0/schemaExtensions/bellowscollege_courses. Se não houver extensões de esquema que correspondam à ID, a resposta será 404 Not Found.
Etapa 2. Registrar uma definição de extensão de esquema
Você deseja criar e registrar uma nova definição de extensão para cursos de treinamento no recurso de grupo . Especifique as seguintes propriedades:
id: forneça uma cadeia de caracteres para esta propriedade seguindo uma das duas maneiras:
Opção 1: concatene um nome de domínio de vaidade verificado para seu locatário com um nome para a extensão de esquema. Por exemplo, se o domínio for bellowscollege.com, e o nome da extensão de esquema for courses, você poderá usar a idbellowscollege_courses.
Opção 2: uma maneira alternativa é fornecer apenas um nome de esquema, como courses, e permitir que o Microsoft Graph gere automaticamente a ID para você prefixando o nome fornecido com uma cadeia de caracteres alfanumérica aleatória.
Essa id se torna o nome da propriedade de extensão de esquema em um grupo.
description
targetTypes: especifique os tipos de recurso aos quais a extensão de esquema pode ser aplicada. Neste exemplo, o tipo de recurso é Group. Você pode adicionar mais tipos de recurso atualizando a definição de extensão de esquema posteriormente.
propriedades: especifique as propriedades personalizadas que compõem o esquema. Neste exemplo, especifique as courseIdpropriedades , courseName e courseType personalizadas e seus tipos. Somente alterações aditivas são permitidas depois que você cria a definição de extensão de esquema.
proprietário: especifique o aplicativo que possui a definição de extensão de esquema. Se você estiver executando este exemplo de um aplicativo que não está atribuído como proprietário, especifique o appId do aplicativo atribuído na propriedade proprietário .
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new SchemaExtension
{
Id = "bellowscollege_courses",
Description = "Bellows College training courses extensions",
TargetTypes = new List<string>
{
"Group",
},
Owner = "d1e6f196-fca3-48ad-8cd3-1a98e3bd46d2",
Properties = new List<ExtensionSchemaProperty>
{
new ExtensionSchemaProperty
{
Name = "courseId",
Type = "Integer",
},
new ExtensionSchemaProperty
{
Name = "courseName",
Type = "String",
},
new ExtensionSchemaProperty
{
Name = "courseType",
Type = "String",
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.SchemaExtensions.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
SchemaExtension schemaExtension = new SchemaExtension();
schemaExtension.setId("bellowscollege_courses");
schemaExtension.setDescription("Bellows College training courses extensions");
LinkedList<String> targetTypes = new LinkedList<String>();
targetTypes.add("Group");
schemaExtension.setTargetTypes(targetTypes);
schemaExtension.setOwner("d1e6f196-fca3-48ad-8cd3-1a98e3bd46d2");
LinkedList<ExtensionSchemaProperty> properties = new LinkedList<ExtensionSchemaProperty>();
ExtensionSchemaProperty extensionSchemaProperty = new ExtensionSchemaProperty();
extensionSchemaProperty.setName("courseId");
extensionSchemaProperty.setType("Integer");
properties.add(extensionSchemaProperty);
ExtensionSchemaProperty extensionSchemaProperty1 = new ExtensionSchemaProperty();
extensionSchemaProperty1.setName("courseName");
extensionSchemaProperty1.setType("String");
properties.add(extensionSchemaProperty1);
ExtensionSchemaProperty extensionSchemaProperty2 = new ExtensionSchemaProperty();
extensionSchemaProperty2.setName("courseType");
extensionSchemaProperty2.setType("String");
properties.add(extensionSchemaProperty2);
schemaExtension.setProperties(properties);
SchemaExtension result = graphClient.schemaExtensions().post(schemaExtension);
Na resposta, o status inicial padrão da extensão de esquema é InDevelopment. Enquanto estiver desenvolvendo a extensão, você pode mantê-la neste status, durante a qual apenas o aplicativo que a criou pode atualizá-la com alterações aditivas ou excluí-la. Quando estiver pronto para compartilhar a extensão para uso por outros aplicativos, defina status como Disponível.
Etapa 3. Estender um grupo com dados personalizados
Você pode estender um grupo com dados personalizados durante a criação do grupo ou atualizando um grupo existente.
Opção 1: criar um novo grupo com dados estendidos
A solicitação a seguir cria um novo grupo e usa a extensão de bellowscollege_courses esquema para estender o grupo com dados personalizados. Se você tiver um grupo existente, também poderá estendê-lo com dados personalizados atualizando o grupo com os dados de extensão.
A resposta não espelho nenhuma extensão de dados. Você precisa explicitamente $select a extensão pelo nome usando uma GET /group/{id} operação.
POST https://graph.microsoft.com/v1.0/groups
Content-type: application/json
{
"displayName": "New Managers March 2024",
"description": "New Managers training course for March 2024",
"groupTypes": [
"Unified"
],
"mailEnabled": true,
"mailNickname": "newMan202403",
"securityEnabled": false,
"bellowscollege_courses": {
"courseId": "123",
"courseName": "New Managers",
"courseType": "Online"
}
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Group
{
DisplayName = "New Managers March 2024",
Description = "New Managers training course for March 2024",
GroupTypes = new List<string>
{
"Unified",
},
MailEnabled = true,
MailNickname = "newMan202403",
SecurityEnabled = false,
AdditionalData = new Dictionary<string, object>
{
{
"bellowscollege_courses" , new
{
CourseId = "123",
CourseName = "New Managers",
CourseType = "Online",
}
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Groups.PostAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc groups create --body '{\
"displayName": "New Managers March 2024",\
"description": "New Managers training course for March 2024",\
"groupTypes": [\
"Unified"\
],\
"mailEnabled": true,\
"mailNickname": "newMan202403",\
"securityEnabled": false,\
"bellowscollege_courses": {\
"courseId": "123",\
"courseName": "New Managers",\
"courseType": "Online"\
}\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Group group = new Group();
group.setDisplayName("New Managers March 2024");
group.setDescription("New Managers training course for March 2024");
LinkedList<String> groupTypes = new LinkedList<String>();
groupTypes.add("Unified");
group.setGroupTypes(groupTypes);
group.setMailEnabled(true);
group.setMailNickname("newMan202403");
group.setSecurityEnabled(false);
HashMap<String, Object> additionalData = new HashMap<String, Object>();
bellowscollegeCourses = new ();
bellowscollegeCourses.setCourseId("123");
bellowscollegeCourses.setCourseName("New Managers");
bellowscollegeCourses.setCourseType("Online");
additionalData.put("bellowscollege_courses", bellowscollegeCourses);
group.setAdditionalData(additionalData);
Group result = graphClient.groups().post(group);
O exemplo a seguir mostra a resposta. A resposta não inclui a nova extensão. Você precisa explicitamente $select a extensão pelo nome usando uma GET /group/{id} operação.
Observação: o objeto de resposta mostrado aqui pode ser encurtado para legibilidade.
HTTP/1.1 201 Created
Content-Type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#groups/$entity",
"id": "8fb45944-4085-449f-b95d-f7dd74a1b081",
"createdDateTime": "2024-01-24T09:09:03Z",
"description": "New Managers training course for March 2024",
"displayName": "New Managers March 2024",
"groupTypes": [
"Unified"
],
"mail": "newMan202403@bellowscollege.com",
"mailEnabled": true,
"mailNickname": "newMan202403"
}
Opção 2: atualizar um grupo existente com dados estendidos
Se você tiver um grupo existente, também poderá estendê-lo com dados personalizados da seguinte maneira. A solicitação retorna uma 204 No Content resposta.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Group
{
AdditionalData = new Dictionary<string, object>
{
{
"bellowscollege_courses" , new
{
CourseId = "123",
CourseName = "New Managers",
CourseType = "Online",
}
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Groups["{group-id}"].PatchAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc groups patch --group-id {group-id} --body '{\
"bellowscollege_courses": {\
"courseId": "123",\
"courseName": "New Managers",\
"courseType": "Online"\
}\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Group group = new Group();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
bellowscollegeCourses = new ();
bellowscollegeCourses.setCourseId("123");
bellowscollegeCourses.setCourseName("New Managers");
bellowscollegeCourses.setCourseType("Online");
additionalData.put("bellowscollege_courses", bellowscollegeCourses);
group.setAdditionalData(additionalData);
Group result = graphClient.groups().byGroupId("{group-id}").patch(group);
Etapa 4. Atualizar dados personalizados em um grupo
A solicitação a seguir atualiza a propriedade courseType na bellowscollege_courses extensão do grupo para Hybrid. Embora você queira atualizar apenas a propriedade courseType , você deve incluir as outras propriedades e seus valores existentes no corpo da solicitação também. Caso contrário, o Microsoft Graph os define como null e remove seus dados.
A solicitação a seguir retorna uma 204 No Content resposta.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Group
{
AdditionalData = new Dictionary<string, object>
{
{
"bellowscollege_courses" , new
{
CourseId = "123",
CourseName = "New Managers",
CourseType = "Hybrid",
}
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Groups["{group-id}"].PatchAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc groups patch --group-id {group-id} --body '{\
"bellowscollege_courses": {\
"courseId": "123",\
"courseName": "New Managers",\
"courseType": "Hybrid"\
}\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Group group = new Group();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
bellowscollegeCourses = new ();
bellowscollegeCourses.setCourseId("123");
bellowscollegeCourses.setCourseName("New Managers");
bellowscollegeCourses.setCourseType("Hybrid");
additionalData.put("bellowscollege_courses", bellowscollegeCourses);
group.setAdditionalData(additionalData);
Group result = graphClient.groups().byGroupId("{group-id}").patch(group);
Para obter os dados personalizados em um grupo, use $select para incluir a extensão pelo nome.
Além da filtragem pela id da extensão de esquema, você também pode filtrar pelos valores da propriedade de extensão. O exemplo a seguir procura o grupo que tem a bellowscollege_courses extensão com um courseId valor de propriedade correspondente 123e obtém os dados de extensão e as propriedades displayName, id e description do grupo.
GET https://graph.microsoft.com/v1.0/groups?$filter=bellowscollege_courses/courseId eq '123'&$select=displayName,id,description,bellowscollege_courses
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Groups.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Filter = "bellowscollege_courses/courseId eq '123'";
requestConfiguration.QueryParameters.Select = new string []{ "displayName","id","description","bellowscollege_courses" };
});
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc groups list --filter "bellowscollege_courses/courseId eq '123'" --select "displayName,id,description,bellowscollege_courses"
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
GroupCollectionResponse result = graphClient.groups().get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "bellowscollege_courses/courseId eq '123'";
requestConfiguration.queryParameters.select = new String []{"displayName", "id", "description", "bellowscollege_courses"};
});
HTTP/1.1 200 OK
Content-Type: application/json
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#groups(displayName,id,description,bellowscollege_courses)",
"value": [
{
"displayName": "New Managers March 2024",
"id": "8fb45944-4085-449f-b95d-f7dd74a1b081",
"description": "New Managers training course for March 2024",
"bellowscollege_courses": {
"@odata.type": "#microsoft.graph.ComplexExtensionValue",
"courseType": "Hybrid",
"courseName": "New Managers",
"courseId": 123
}
}
]
}
Etapa 6: excluir dados de extensão e definição de extensão de esquema
Você pode excluir uma definição de extensão de esquema se não precisar mais dela. Se as instâncias de recurso tiverem a propriedade de extensão aplicada, excluir a definição de extensão de esquema não excluirá os dados de extensão nas instâncias de recurso. Em vez disso, os dados de extensão estão disponíveis, mas não estão mais acessíveis. Você pode recriar a definição de extensão de esquema com a mesma configuração - se você usou o domínio verificado para a id de extensão de esquema - para poder excluir os dados de extensão.
A solicitação a seguir exclui a bellowscollege_courses propriedade de extensão de esquema e seus dados associados do grupo. A solicitação retorna uma 204 No Content resposta.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Group
{
AdditionalData = new Dictionary<string, object>
{
{
"bellowscollege_courses" , null
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Groups["{group-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Group group = new Group();
HashMap<String, Object> additionalData = new HashMap<String, Object>();
additionalData.put("bellowscollege_courses", null);
group.setAdditionalData(additionalData);
Group result = graphClient.groups().byGroupId("{group-id}").patch(group);
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
await graphClient.SchemaExtensions["{schemaExtension-id}"].DeleteAsync();
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
graphClient.schemaExtensions().bySchemaExtensionId("{schemaExtension-id}").delete();
<?php
use Microsoft\Graph\GraphServiceClient;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$graphServiceClient->schemaExtensions()->bySchemaExtensionId('schemaExtension-id')->delete()->wait();
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulte https://aka.ms/ContentUserFeedback.