Статьи

Использование SkyDrive REST API

Скай ДрайвЯ создал класс-оболочку, чтобы упростить мою работу с 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.