Как получить содержимое (текст) из искомого файла с помощью API Microsoft Graph?

Во-первых, я использую версию SDK 4.x.

Я хочу создать функцию поиска из onedrive с графическим API.

В случае с функцией поиска Teams (приложение), когда я использую функцию поиска, приложения возвращают информацию с содержимым файла и показывают ключевое слово поиска стресса.

Я хочу показать содержимое этого файла (не полный текст, только включая ключевое слово поиска)

Но ответ поиска не включает контент.

Итак, как я могу заменить эту функцию? Или я неправильно использую этот API?

Это код моего поискового запроса.

 var searchResults = await graphServiceClient
     .Drives[driveId2]
     .Root
     .Search(searchQuery)
     .Request()
     .GetAsync();

В случае графического обозревателя (Http-запрос)

https://graph.microsoft.com/v1.0/me/drives/{drive-id}/root/search(q='')

А также случай запроса контента для ответа, включая ReadTimeout и WriteTimeout.


var searchResults = await graphServiceClient
        .Drives[driveId]
        .Items[fileId]
        .Content
        .Request()                   
        .GetAsync();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, у нас есть API поиска прямо сейчас, чтобы удовлетворить ваши требования. Вы можете просмотреть ссылку, чтобы увидеть содержимое запроса и ответ. Тогда текущий документ показывает нам только образец с SDK v5. Не забудьте добавить необходимое разрешение File.Read.All Sites.Read.All или Files.ReadWrite.All Sites.ReadWrite.All, если необходимо. Вот коды.

using Microsoft.Graph.Search.Query;
using Microsoft.Graph.Models;

var requestBody = new QueryPostRequestBody
{
    Requests = new List<SearchRequest>
    {
        new SearchRequest
        {
            EntityTypes = new List<EntityType?>
            {
                EntityType.ExternalItem,
            },
            ContentSources = new List<string>
            {
                "/external/connections/connectionfriendlyname",
            },
            Region = "US",
            Query = new SearchQuery
            {
                QueryString = "contoso product",
            },
            From = 0,
            Size = 25,
            Fields = new List<string>
            {
                "title",
                "description",
            },
        },
    },
};

var result = await graphClient.Search.Query.PostAsQueryPostResponseAsync(requestBody);

Но поскольку вы пытаетесь использовать SDK V4, хотя я не нашел официального образца или других образцов для SDK V4, я думаю, что мы могли бы найти обходной путь, который отправляет HTTP-запрос напрямую вместо использования SDK. Поскольку вы уже использовали GraphClient в своем коде, я надеюсь, что у вас также есть коды, аналогичные приведенным ниже, которые содержат EnableTokenAcquisitionToCallDownstreamApi.

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)        .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

Затем мы можем внедрить ITokenAcquisition в контроллер, чтобы сгенерировать токен доступа и использовать его для вызова API запроса.

public class HomeController : Controller
{
    private readonly ITokenAcquisition _tokenAcquisition;
    public HomeController(ITokenAcquisition tokenAcquisition)
    {
        _tokenAcquisition = tokenAcquisition;
    }
    
    public async Task IndexAsync(){
        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "File.Read.All", "Sites.Read.All" });
        var request  = "{{\"requests\": [{{\"entityTypes\": [\"driveItem\", \"listItem\", \"list\"],\"query\": {{\"queryString\": \"contoso\"}]}}";
        var content = new StringContent(request, Encoding.UTF8, "application/json");
        var httpReqMesg = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/search/query")
        {
            Headers =
            {
                { HeaderNames.Authorization, "Bearer "+ accessToken}
            },
            Content = content
        };
        var httpClient = _httpClientFactory.CreateClient();
        var response = await httpClient.SendAsync(httpReqMesg);
        var res = "";
        if (response.StatusCode == HttpStatusCode.OK)
        {
            res = await response.Content.ReadAsStringAsync();
        }
    }

}

Кстати, если вы используете поток учетных данных клиента, у которого нет ITokenAcquisition. Мы можем использовать код ниже для создания токена доступа.

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenantId";
var clientId = "clientId";
var clientSecret = "clientSecret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var token = clientSecretCredential.GetTokenAsync(tokenRequestContext).Result.Token;

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