Получение контактов из всех папок контактов Outlook Microsoft Graph

Я использую Microsoft Graph для получения папок контактов, используя следующий код:

GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(
    (requestMessage) => {
        requestMessage.Headers.Authorization = 
          new AuthenticationHeaderValue("Bearer", accessToken);
        return Task.FromResult(0);
    }));

var contactsData = await client
    .Me
    .Contacts
    .Request()
    .Top(1000)
    .GetAsync();

Этот код выше возвращает контакты, но возвращает только контакты из папки по умолчанию. Я хочу получить контакты из всех папок пользователя.

Я пробовал сначала получить папки, а затем их контакты, но он возвращает Null Reference Exception, поскольку контакты - это null.

var Folders = client
    .Me
    .ContactFolders
    .Request()
    .Top(1000)
    .GetAsync();

Folders.Wait();
var contacts = Folders.Result.SelectMany(a => a.Contacts).ToList();

@downvoter, почему голосование против? Если у вас есть конкретная проблема с вопросом, сообщите мне в комментариях, чтобы я мог соответствующим образом изменить вопрос

Ahmad 09.08.2018 08:33

Получение ContactFolders возвращает только папки, но не контакты в них. Вам необходимо сделать отдельный запрос к .Contacts для каждой папки, чтобы получить фактические контакты.

Marc LaFleur 09.08.2018 16:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
850
2

Ответы 2

У меня сейчас нет среды для тестирования на этом компьютере, но, насколько я понимаю, вы можете использовать параметр запроса опции для фильтрации контактов во вложенных папках.

  1. вам нужно узнать все подпапки

    GET / users / {id | userPrincipalName} / contactFolders

  2. Соберите все идентификаторы вложенных папок
  3. найти контакты в каждой подпапке

    ПОЛУЧИТЬ / меня / contactFolder / {id} / childFolders / {id} / contacts

Для получения дополнительных папок контактов и контактной информации. Пожалуйста, прочтите эти документы. https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contactfoldershttps://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contacts

Прежде всего, этот пример кода создается в ядре .net, вы должны настроить GraphScopes в конфигурации с помощью следующего кода:

"GraphScopes": "User.Read User.ReadBasic.All Mail.Send MailBoxSettings.ReadWrite Contacts.ReadWrite"

Также обратите внимание, что ContactFolders будет возвращать результаты только при наличии нескольких папок. Папка контактов по умолчанию никогда не возвращается. Если у пользователя нет дополнительных папок, это вернет пустой результат. Если вы хотите получить основную папку и дополнительные папки, которые вам нужно получить соответственно, объедините результат.

// Get the defaultContacts
var defaultContacts = await graphClient
    .Me
    .Contacts
    .Request()
    .GetAsync();

// Get the contactFolders
var contactFolders = await graphClient
    .Me
    .ContactFolders
    .Request()
    .GetAsync();

// Use this to store the contact from all contact folder.
List<Contact> contactFolderContacts = new List<Contact>();

if (contactFolders.Count > 0) {
    for (int i = 0; i < contactFolders.Count; i++) {
        var folderContacts = await graphClient
            .Me
            .ContactFolders[contactFolders[i].Id]
            .Contacts
            .Request()
            .GetAsync();

        contactFolderContacts.AddRange(folderContacts.AsEnumerable());
    }

    // This will combine the contact from main folder and the additional folders.
    contactFolderContacts.AddRange(defaultContacts.AsEnumerable());
} else {
    // This user only has the default contacts folder
    contactFolderContacts.AddRange(defaultContacts.AsEnumerable());
}

// Use this to test the result.
foreach (var item in contactFolderContacts) {
    Debug.WriteLine("first:" + item.EmailAddresses);
}

Ваш код выглядит правильным, но я действительно не согласен с вашей причиной, по которой предлагаю эту область. Во-первых, я не уверен, куда они пойдут (какой «проект»?), Но, что более важно, область действия Только, необходимая для этого, - это Contacts.Read (которая не включена в предлагаемые вами области).

Marc LaFleur 09.08.2018 16:10

@MarcLaFleur наверняка, что этот graphScope - это конфигурация основного проекта .net.

Miao 09.08.2018 16:38

@MarcLaFleur Это чистый основной проект. Я использую Contacts.ReadWrite вместо Contacts.Read. Конечный пользователь может изменить GraphScope по своему желанию.

Seiya Su 09.08.2018 17:18

Я протестирую это и дам вам знать. Я решил проблему, выполнив вызов api для получения папок, а затем передав идентификатор папки для получения контактов с другим вызовом api. Я также опубликую свое решение, протестирую ваше и помечу как ответ, если это тоже сработало.

Ahmad 13.08.2018 11:24

«Я решил проблему, выполнив вызов API для получения папок, а затем передав идентификатор папки для получения контактов с помощью другого вызова API». Ваша идея похожа на код, который я предоставил, но я добавляю дополнительный код для расширений.

Seiya Su 13.08.2018 13:53

Другие вопросы по теме