Не удается создать новую папку OneDrive под root с помощью Microsoft.Graph REST API

#c# #onedrive

#c# #onedrive

Вопрос:

Я могу создавать папки в существующих папках, но не в корневом каталоге. Я пробовал URL-адреса с идентификатором root и с несколькими вариантами синтаксиса пути, например, «root:/./:», но ни один из них не создает папку.

Я хотел бы увидеть пример создания папки под root в документе Microsoft.Graph REST API. Это может сэкономить много времени.

Спасибо за любой ответ!

Вот мой код:

 public static async Task<GameStorageItem> CreateFolderAsync(string parentId, string parentPath, 
                                                                string name)
    {
        var obj = new JObject
        {
            { "name", name },
            { "folder", new JObject() },
            { "@microsoft.graph.conflictBehavior", "fail" }
        };
        dynamic json;
        string content;
        if (parentId == "root")
        {
            content = await MicrosoftAccount.PerformHttpRequestAsync(HttpMethod.Get,
                                             $"me/drive", obj);
            json = JValue.Parse(content);
            parentId = json.id;

            //parentId = "root:./:";
        }
        content = await MicrosoftAccount.PerformHttpRequestAsync(HttpMethod.Post, $"me/drive/items/{parentId}/children", obj);
        json = JValue.Parse(content);
        DateTimeOffset created = json.createdDateTime;
        string id = json.id;
        var folder = new GameStorageFolder(name, $"{parentPath}/{name}", id, created, false);
        return folder;
    }
public static async Task<string> PerformHttpRequestAsync(HttpMethod method, string request, 
                                                             JObject json = null)
    {
        if (__authResult == null || await ValidateTokenAsync(5) == false)
        {
            try
            {
                await SignInAsync();
                __authResult = await __client.AcquireTokenSilent(scopes,
                                     __account).ExecuteAsync();
            }
            catch (MsalUiRequiredException)
            {
                //A MsalUiRequiredException happened on AcquireTokenSilentAsync. 
                //This indicates you need to call AcquireTokenAsync to acquire a token
                try
                {
                    //User must consent
                    __authResult = await __client.AcquireTokenInteractive(scopes)
                                         .ExecuteAsync();
                }
                catch (MsalException ex)
                {
                    //Error acquiring token
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                //Error acquiring token silently
                throw ex;
            }
        }
        var builder = new UriBuilder(__graphUrl   request);
        return await PerformHttpRequestWithTokenAsync(method, builder.Uri, 
                                                      __authResult.AccessToken, json);
    }
private static async Task<string> PerformHttpRequestWithTokenAsync(HttpMethod method, 
                                      Uri uri, string token, JObject json = null)
    {
        HttpResponseMessage response;
        var httpClient = new HttpClient();

        var request = new HttpRequestMessage(method, uri);
        if (json != null)
        {
            request.Content = new StringContent(json.ToString(), Encoding.UTF8, 
                                                "application/json");
        }
        //Add the token in Authorization header
        request.Headers.Authorization = 
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);

        response = await httpClient.SendAsync(request);
        return await response.Content.ReadAsStringAsync();
    }
  

Ответ №1:

У вас есть три разных варианта — я просто покажу их как запрос и позволю вам перевести его в код:

Вариант 1 — ОПУБЛИКОВАТЬ дочерним элементам

 POST ../me/drive/root/children
{
  "name": "foo",
  "folder": {}
}
  

Вариант 2 — ПОМЕСТИТЬ в дочерний

 PUT ../me/drive/root/children/foo
{
  "folder": {}
}
  

Вариант 3 — УКАЗАТЬ путь

 PUT ../me/drive/root:/foo
{
  "folder": {}
}
  

Обратите внимание, что все эти URL-адреса ссылаются на root, а затем используют разные механизмы для создания папки под ним.

Ответ №2:

Корневые ресурсы OneDrive

При обращении к корневому ресурсу Microsoft Graph ваше приложение может обращаться к ресурсам OneDrive, используя следующие пути:

  1. /drives — Список ресурсов диска, доступных прошедшему проверку подлинности пользователю.
  2. /drives/{drive-id} — Доступ к определенному диску по его идентификатору.
  3. /drives/{drive-id}/root/children — Список элементов в корне определенного диска.
  4. /drive/items/{item-id} — Доступ к элементу привода по его идентификатору.
  5. /drive/special/{special-id} — Доступ к известной папке по ее известному имени.
  6. /shares/{share-id} — Доступ к элементу диска по его ShareID или URL-адресу общего доступа

Адресация на основе пути внутри диска

К элементу диска можно обращаться либо по уникальному идентификатору, либо по тому, где этот элемент существует в иерархии диска (т. Е. по пути пользователя). В запросе API двоеточие может использоваться для переключения между пространством пути API и пользовательским пространством пути. Этот синтаксис действителен для любого элемента диска, адресованного через пространство API.

Вы также можете вернуться к пространству пути API, используя двоеточие в конце пространства пути файловой системы. Убедитесь, что пользовательские данные в URL соответствуют требованиям к адресации и кодировке пути.

  1. /drive/root:/path/to/file — Доступ к элементу диска по пути из корня.
  2. /drive/items/{item-id}:/path/to/file — Доступ к элементу диска по его пути относительно другого элемента.
  3. /drive/root:/path/to/folder:/children — Список дочерних элементов при доступе по пути относительно корня диска.
  4. /drive/items/{item-id}:/path/to/folder:/children — Список дочерних элементов при доступе по пути относительно другого элемента.

https://learn.microsoft.com/en-us/onedrive/developer/rest-api/?view=odsp-graph-online .

Комментарии:

1. Спасибо за ваш ответ. Я уже прочитал все это в документе. Но это не помогает создать папку непосредственно под root. Я уже успешно создал папки в существующих папках. Пожалуйста, попробуйте создать папку непосредственно под root и покажите мне URI для этого.