Я создал класс-оболочку, чтобы упростить мою работу с REST API SkyDrive. Я предполагаю, что вы будете использовать веб-приложение в этой статье.
Первым шагом является создание приложения на dev.live.com . После создания приложения вы получите домен ClientID , Client Secret и Redirect . Мы будем использовать ClientID и домен перенаправления . Помните, что значение домена Redirect не может иметь localhost . Вы должны предоставить правильное доменное имя, так как после успешной аутентификации вы будете перенаправлены на домен вместе с токеном доступа.
В ответ вы получите токен доступа, который будет вам доступен в течение следующих 3600 секунд. Маркер доступа будет находиться в ответном URL вашего домена. В моем случае это http://midnightprogrammer.net/#access_token=EwBIA…. Затем я получу токен доступа и передам его моей обертке, которая сделает всю работу за меня.
Время посмотреть и немного понять код. Я много использую SkyDrive для резервного копирования и обмена файлами, а также доступ к SkyDrive из созданного мной веб-приложения. Но код довольно грязный и нуждается в пересмотре. Поэтому я создал обертку вокруг API.
Сначала мне нужно аутентифицировать пользователя с его / ее действительными учетными данными с правильными областями. Если области действия неверны, вы не сможете выполнять действия с SkyDrive. Чтобы узнать больше о сферах, читайте здесь . Поскольку я работаю со SkyDrive, я использую две области: wl.signin и wl.skydrive_update . wl.skydrive_update необходим, если вы хотите иметь доступ для записи в SkyDrive. У класса-оболочки SkyDriveAPI есть метод Authenticate, который перенаправит вас на экран аутентификации действующего сервиса. После ввода учетных данных вы будете перенаправлены на домен (домен, который вы указали при создании приложения) вместе с токеном доступа. Вот пример кода:
public void Authenticate() { string authorizeUri = AuthUri; authorizeUri = authorizeUri + String.Format("?client_id={0}&", _ClientId); authorizeUri = authorizeUri + String.Format("scope={0}&", "wl.signin,wl.skydrive_update"); authorizeUri = authorizeUri + String.Format("response_type={0}&", "token"); authorizeUri = authorizeUri + String.Format("redirect_uri={0}", HttpUtility.UrlEncode(_SiteURL)); this.AuthURI = authorizeUri; }
Это понимание класса оболочки. В реальном сценарии вы никогда не будете использовать его таким образом:
SkyDrive drive = new SkyDrive(ClientID, Site URL); drive.Authenticate(); Response.Redirect(drive.AuthURI);
В конструкторе класса SkyDrive первым параметром будет ваш ClientID, а вторым будет URL-адрес сайта или домен перенаправления. После этого диск объекта класса SkyDrive (независимо от того, какое имя вы дадите) вызовет метод Authenticate для создания URL-адреса со всеми необходимыми параметрами и сохранит URL-адрес в общедоступной переменной AuthURI , которую я использовал, чтобы перенаправить пользователя для аутентификации, используя его полномочия.
Теперь, когда пользователь аутентифицирован, вам будет предоставлен токен доступа в URL. Это зависит от вас, как вы собираетесь получить его. Получив токен доступа, вы должны сохранить его в безопасности. Чтобы убедиться, что токен доступа остается с вашими вызовами API, сохраните его следующим образом:
drive.AccessToken = "EwBIA.....";
Получив токен доступа, вы можете сделать первый звонок в SkyDrive. Для простоты я делаю запрос, чтобы позвонить и получить основную информацию о пользователе.
User usr = drive.GetUserInfo();
Более того, вы также можете перечислить все папки в вашем SkyDriver с помощью этого простого вызова.
Folder driveFolders = new Folder(); foreach (var folder in driveFolders) { Response.Write(folder.Value + " " + folder.Key +"<br/>"); }
Приведенный выше код возвращает словарь, который содержит название папки и идентификатор папки. Вам понадобится идентификатор папки, чтобы перечислить все файлы в папке. Чтобы вывести список всех файлов в папке, используйте приведенный ниже код.
FolderContent content = drive.ListFolderContent("folder.77e33dba68367a16.77E33GBA68467A16!2189"); for (int i = 0; i < content.Files.Count; i++) { Response.Write(content.Files[i].name); }
Это не просто имя файлов, которые вы получаете, но вы получаете полные свойства файла. Таким образом, вы можете поиграть с этим тоже.
Наиболее популярная особенность REST API SkyDriver заключается в том, как загрузить файл с помощью REST API. В MSDN говорится, что вы можете загружать файлы в SkyDriver, отправляя запросы HTTP POST или HTTP PUT. Вот как я это делаю внутри своего класса-обёртки.
public bool UploadFile(string FolderID, string FilePath) { bool Uploaded = false; try { byte[] fileBytes = System.IO.File.ReadAllBytes(FilePath); string UploadURI = BaseURI + FolderID + "/files/" + Path.GetFileName(FilePath) + "?access_token=" + AccessToken; var request = (HttpWebRequest)HttpWebRequest.Create(UploadURI); request.Method = "PUT"; request.ContentLength = fileBytes.Length; using (var dataStream = request.GetRequestStream()) { dataStream.Write(fileBytes, 0, fileBytes.Length); } string status = (((HttpWebResponse)request.GetResponse()).StatusDescription); if (status.ToLower() == "created") { Uploaded = true; } return Uploaded; } catch (Exception) { return false; } }
Я использую метод PUT для загрузки файлов в SkyDrive. На данный момент я не реализовал метод POST. Но в ближайшее время буду. Если вы используете мой класс-обертку, просто используйте одну строку кода для загрузки файла в определенную папку.
bool uploaded = drive.UploadFile("folder.77e33dba68367a16.77E33DUA68567A16!104", "D:\\walls\\flowers_442.jpg");
Вызов метода UploadFile загрузит файл в папку. Первый параметр в вышеуказанном методе — это идентификатор папки, куда вы хотите загрузить папку, а второй — путь к локальному файлу .
В настоящее время я работаю и пытаюсь понять API REST и его функции. Я буду включать другие функции, так как все больше и больше узнаю о них.
SkyDrive API Wrapper размещается на GitHub . Разветвите, измените его, настройте по своему усмотрению. И если вы нашли или нашли что-то хорошее, пожалуйста, дайте мне знать.
Я хочу поблагодарить Кристофа Гирса за его пост, который дает мне представление об API.