Вступление
В предыдущей части ( часть 2: запросы API ) я упоминал, что третья часть покажет вам, как выполнять различные операции с папками, такие как создание, удаление и перемещение папок.
Ну вот прошел месяц, так что давай к этому. Перейдите на страницу загрузки и загрузите исходный код части 2 (статья № 63). Разархивируйте и откройте решение в Visual Studio. Убедитесь, что вы изменили ключ API и секретный ключ, расположенный в консольном приложении (файл кода Program.cs). Замените значения ключом и секретом своего приложения.
Готовы? Установлен? Хорошо, начнем с создания папок …
Содержание
Создать папку
API Dropbox REST утверждает, что для создания папки необходимо указать как минимум два параметра, а именно:
- root : корень, относительно которого указан путь. Допустимые значения: песочница и дропбокс.
- путь : путь к новой папке для создания относительно корня
После создания папки 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, а именно:
- корень : корень. Допустимые значения: песочница или Dropbox.
- fromPath : файл или папка, из которой необходимо скопировать данные относительно корня.
- 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
Вы можете скачать исходный код, сопровождающий эту статью, со страницы загрузки. Если у вас есть какие-либо вопросы или предложения, напишите мне по электронной почте или оставьте комментарий.