Статьи

Создавайте, удаляйте и перемещайте папки с помощью API Dropbox REST

Вступление

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

Ну вот прошел месяц, так что давай к этому. Перейдите на страницу загрузки и загрузите исходный код части 2 (статья № 63). Разархивируйте и откройте решение в Visual Studio. Убедитесь, что вы изменили ключ API и секретный ключ, расположенный в консольном приложении (файл кода Program.cs). Замените значения ключом и секретом своего приложения.

Готовы? Установлен? Хорошо, начнем с создания папок …

Содержание

Создать папку

API Dropbox REST утверждает, что для создания папки необходимо указать как минимум два параметра, а именно:

  1. root : корень, относительно которого указан путь. Допустимые значения: песочница и дропбокс.
  2. путь : путь к новой папке для создания относительно корня

После создания папки Dropbox возвращает некоторые метаданные об этом. Как обычно, эти данные в формате JSON. Давайте создадим простой класс, украшенный атрибутами из библиотеки Json.NET, чтобы мы могли легко десериализовать эти данные.

[JsonObject(MemberSerialization.OptIn)]
public class FileSystemInfo
{
    [JsonProperty(PropertyName = "rev")]
    public string Revision { get; internal set; }

    [JsonProperty(PropertyName = "bytes")]
    public long Bytes { get; internal set; }

    [JsonProperty(PropertyName = "modified")]
    public DateTime Modified { get; internal set; }

    [JsonProperty(PropertyName = "path")]
    public string Path { get; internal set; }

    [JsonProperty(PropertyName = "root")]
    public string Root { get; internal set; }

    //...
}

Тип FileSystemInfo очень похож на тип File, показанный во второй части этой серии. Я сократил код здесь для удобства чтения. Загрузите исходный код и проверьте его, если хотите увидеть весь класс. Этот тип также будет использоваться в качестве возвращаемого типа методов Move (…) и Delete (…), которые мы реализуем позже.

Давайте расширим тип DropboxApi, чтобы мы могли создать папку следующим образом:

var folder = api.CreateFolder("dropbox", "/test");

Сначала нужно указать рут. Допустимые значения: песочница или Dropbox (производство). Затем вам нужно указать папку относительно корня. Подкаталоги разрешены.

var folder = api.CreateFolder("dropbox", "/test/subdir");

Реализация метода CreateFolder (…) похожа на запросы API, которые мы обрабатывали во второй части.

public FileSystemInfo CreateFolder(string root, string path)
{
    var uri = new Uri(new Uri(DropboxRestApi.BaseUri),
        String.Format("fileops/create_folder?root={0}&path={1}",
        root, UpperCaseUrlEncode(path)));
    var json = GetResponse(uri);
    return ParseJson<FileSystemInfo>(json);
}

Сначала мы составляем URL для вызова, например:

https://api.dropbox.com/1/fileops/create_folder?root=dropbox&path=%2Ftest

Затем мы получаем ответ (JSON), вызывая метод GetResponse (…) (см. Часть 2), который подписывает запрос, используя OAuth, и десериализуем его в объект Folder, используя библиотеку Json.NET.

Вы можете просмотреть метаданные папки впоследствии:

var folder = api.CreateFolder("dropbox", "/test");
Console.WriteLine("Folder created.");
Console.WriteLine(String.Format("Root: {0}", folder.Root));
Console.WriteLine(String.Format("Path: {0}", folder.Path));
Console.WriteLine(String.Format("Modified: {0}", folder.Modified));     

Какие выводы:

Создать папку

Верх страницы

Кодировка URL

Вы заметили, что в URL-адресе закодирован параметр пути в методе CreateFolder (…)? Это необходимо для того, чтобы отправить запрос. Однако есть небольшая проблема, которую мы должны решить.

Допустим, мы используем метод HttpUtility.UrlEncode (…) для URL-кодирования пути.

var path = HttpUtility.UrlEncode(path);

Это преобразует путь / тестовую информацию% 2ftest. Косая черта (/) переводится в% 2f. Однако если вы используете это значение с API Dropbox, вы получите сообщение об ошибке, сообщающее, что подпись недействительна.

Очевидно, API Dropbox не любит экранированные пути в нижнем регистре. Вместо% 2f ожидается% 2F (оповестите верхний регистр!). К счастью, StackOverflow дал ответ на эту проблему:

http://stackoverflow.com/questions/918019/net-urlencode-lowercase-problem

Вот почему я включил (приватный) метод UpperCaseUrlEncode (…) в тип DropboxApi. Этот метод кодирует путь и проверяет правильность расположения экранированных частей.

private static string UpperCaseUrlEncode(string s)
{
    char[] temp = HttpUtility.UrlEncode(s).ToCharArray();
    for (int i = 0; i < temp.Length - 2; i++)
    {
        if (temp[i] == '%')
        {
            temp[i + 1] = char.ToUpper(temp[i + 1]);
            temp[i + 2] = char.ToUpper(temp[i + 2]);
        }
    }
    return new string(temp);
}

Переместить папку

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

folder = api.Move("dropbox", "/test", "/temp");

Помимо URL-адреса реализация аналогична методу CreateFolder (…).

public FileSystemInfo Move(string root, string fromPath, string toPath)
{
    var uri = new Uri(new Uri(DropboxRestApi.BaseUri),
        String.Format("fileops/move?root={0}&from_path={1}&to_path={2}",
        root, UpperCaseUrlEncode(fromPath), UpperCaseUrlEncode(toPath)));
    var json = GetResponse(uri);
    return ParseJson<FileSystemInfo>(json);
}

Параметры метода Move (…) 3, а именно:

  1. корень : корень. Допустимые значения: песочница или Dropbox.
  2. fromPath : файл или папка, из которой необходимо скопировать данные относительно корня.
  3. toPath : Путь назначения, включая новое имя файла или папки, относительно root.

Удалить папку

Давайте почистим за собой и удалим созданную папку (и). Сначала мы создали папку с именем «test», а затем переместили ее в «temp». Итак, давайте удалим это.

folder = api.Delete("dropbox", "/temp");

Снова реализация метода Delete (…) очень похожа на методы CreateFolder (…) и Move (…).

public FileSystemInfo Delete(string root, string path)
{
    var uri = new Uri(new Uri(DropboxRestApi.BaseUri),
        String.Format("fileops/delete?root={0}&path={1}",
        root, UpperCaseUrlEncode(path)));
    var json = GetResponse(uri);
    return ParseJson<FileSystemInfo>(json);
}      

И это все, что нужно сделать! Помимо проблем с использованием кодировки URL создание, перемещение и удаление папок довольно просты с Dropbox REST API. Обратите внимание, что вы также можете использовать методы Move (…) и Delete (…) с файлами, а не только с папками.

Для полноты, вот весь поток клиентского приложения.

// Create a folder
var folder = api.CreateFolder("dropbox", "/test");
Console.WriteLine("Folder created.");
Console.WriteLine(String.Format("Root: {0}", folder.Root));
Console.WriteLine(String.Format("Path: {0}", folder.Path));
Console.WriteLine(String.Format("Modified: {0}", folder.Modified));                                    

// Move a folder
folder = api.Move("dropbox", "/test", "/temp");

// Delete a folder
folder = api.Delete("dropbox", "/temp");

Ознакомьтесь с документацией Dropbox REST API, если вы хотите изучить ее подробнее.

https://www.dropbox.com/developers/reference/api

Вы можете скачать исходный код, сопровождающий эту статью, со страницы загрузки. Если у вас есть какие-либо вопросы или предложения, напишите мне по электронной почте или оставьте комментарий.