Статьи

Как интегрировать билеты из UserVoice в приложение Windows Phone

На этот раз мы рассмотрим, как интегрировать билеты из uservoice в ваше приложение для Windows Phone.

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

Однако, если вы хотите получить список всех билетов от конкретного пользователя, нам нужно немного изменить наш запрос. Нам нужно войти в систему как владелец учетной записи, чтобы иметь возможность искать все билеты.

Давайте посмотрим, как войти в систему как владелец:

private void LoginAsOwner()
        {
            string loginAsOwnerPath = "/api/v1/users/login_as_owner";
            var client = new RestClient(BaseUrl)
            {
                Authenticator = OAuth1Authenticator.ForRequestToken(ConsumerKey, ConsumerSecret, oAuthCallBackUri)
            };

            //works only with POST!
            var request = new RestRequest(loginAsOwnerPath, Method.POST);
            request.AddHeader("Accept", "application/json");

            var response = client.ExecuteAsync(request, HandleLoginAsOwnerResponse);
        }

        private void HandleLoginAsOwnerResponse(IRestResponse restResponse)
        {
            var response = restResponse;
            var ownerTokens = JsonConvert.DeserializeObject<UserViaMailClass.Token>(response.Content);

            OwnerAccesToken = ownerTokens.oauth_token;
            OwnerAccesTokenSecret = ownerTokens.oauth_token_secret;

        }

Запрос авторизации очень похож на запрос аутентификации пользователя. Однако, если мы войдем как владелец, мы получим еще один AccessToken и еще один AccessTokenSecret. Вот почему мы используем метод ForRequestToken с нашим RestClient.

Важно знать, что сам запрос работает только с HTTP-методом «POST», в противном случае вход в систему будет отклонен.

Мы возвращаем строку JSON нашей учетной записи владельца, которую можно десериализовать с помощью  JSON.net,  чтобы получить наши AccessToken и AccessTokenSecret. Я прикрепил свой ‘ UserViaMailClass ‘ для легкой десериализации (да, он похож на класс пользователя  из моего поста аутентификации , но в нем есть некоторые различия).

Теперь, когда у нас есть OwnerAccesToken и OwnerAccessTokenSecret, мы можем искать все билеты от определенного пользователя:

public void GetAllTicketsFromUser()
        {
            string mailaddress = "<usersmailaddress>";
            string getSearchTicketsPath = "/api/v1/tickets/search.json";
            var client = new RestClient(BaseUrl)
            {
                Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, OwnerAccesToken, OwnerAccesTokenSecret)
            };

            var request = new RestRequest(getSearchTicketsPath, Method.GET);

            request.AddParameter("query", mailaddress);

            var response = client.ExecuteAsync(request, HandleGetAllTicketsFromUserResponse);
        }

        private void HandleGetAllTicketsFromUserResponse(IRestResponse restResponse)
        {
            var response = restResponse;

            var tickets = JsonConvert.DeserializeObject<TicketDataClass.TicketData>(response.Content);
        }

Этот запрос снова очень похож на то, что мы сделали, чтобы получить список всех предложений. Пожалуйста, найдите прикрепленный мой « TicketDataClass » для легкой десериализации.

Конечно, пользователи хотят иметь возможность отправлять новые билеты / запросы поддержки из нашего приложения. Я покажу вам, как это сделать:

public void CreateNewTicketAsUser()
        {
            string ticketsPath = "/api/v1/tickets.json";
            var client = new RestClient(BaseUrl)
            {
                Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret)
            };

            var request = new RestRequest(ticketsPath, Method.POST);
            request.AddParameter("ticket[subject]", "testing the uservoice API");
            request.AddParameter("ticket[message]", "hi there, \n\nwe are just testing the creation of a new uservoice ticket.");

            var response = client.ExecuteAsync(request, HandleCreateNewTicketAsUserResponse);
        }

        private void HandleCreateNewTicketAsUserResponse(IRestResponse restResponse)
        {
            var response = restResponse;
        }

Чтобы отправить новый тикет, мы используем AccessToken и AccessTokenSecret пользователя. Таким образом, билет автоматически присваивается билету. Затем нам нужно передать параметры ‘ticket [subject]’ и ‘ticket [message]’ в запрос, чтобы он был принят API uservoice.

Ответ представляет собой строку json, содержащую идентификатор заявки, которую можно использовать для получения отправленных данных заявки. Альтернативой является повторный вызов метода поиска, который мы создали ранее, чтобы получить обновленный список.

Отвечать на уже существующие заявки как пользователь, кажется, невозможно с текущим API. Обычно, если пользователь отвечает на ответное письмо, которым мы отвечаем на его запрос в службу поддержки, он будет назначен существующему запросу. Если мы создадим новый тикет с той же темой, это будет новый тикет, который создаст новый поток. Я уже обратился к uservoice, если есть способ сделать то же самое из API. Как только у меня будет ответ, который позволит мне это сделать, я обновлю этот пост.

Теперь, когда у нас есть все важные функции для нашей новой системы поддержки, я начинаю создавать небольшую вспомогательную библиотеку для ваших приложений Windows Phone 8. Я надеюсь закончить это к этим выходным, и, конечно, буду писать здесь.

Как всегда, я надеюсь, что этот пост будет полезен для некоторых из вас. До следующего поста,

Удачного кодирования всем!