Post

How to integrate the feedback forum of uservoice into your Windows Phone app

As I described in my first blog post about uservoice, uservoice has a feedback forum where users are able to submit and vote for ideas.

This post is about how to get those ideas into your app. On the API side, the ideas are called suggestions. Now that we know how to authenticate our users for the API, we are able to get a list of suggestions into our app:

1
2
3
4
5
6
7
8
9
10
11
12
string suggestionsPath = "api/v1/forums/<yourforumid>/suggestions.json";
public void GetSuggestions()
{
    var client = new RestClient(BaseUrl)
    {
        Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret)
    };

    var request = new RestRequest(suggestionsPath, Method.GET);
    var response = client.ExecuteAsync(request, HandleGetSuggestionResponse);
}

This is pretty straight forward. We are using the oAuth1Authenticator with our saved tokens as parameter to call the suggestions endpoint of the uservoice API. The result is a JSON string that holds all suggestions as a list.

In our response handler, we are able to deserialize our List of suggestions (best with JSON.net):

1
2
3
4
5
6
7
 private void HandleGetSuggestionResponse(IRestResponse restResponse)
{
    var response = restResponse;

    var suggestionslist = JsonConvert.DeserializeObject<SuggestionsDataClass.SuggestionsData>(response.Content);
    suggestionsListBox.ItemsSource = suggestionslist.suggestions;
}

To get the SuggestionsDataClass items, just go to json2csharp.com and pass in the json string we received with response.Content ~~or download it from here: ~~ .

Now let’s have a look on how to submit a new idea on behalf of our user. To submit an idea, we are using the POST method after we authenticated our user again with the uservoice API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public void PostSuggestion()
{
    string suggestionsPath = "api/v1/forums/<yourforumid>/suggestions.json";
    var client = new RestClient(BaseUrl)
    {
        Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret)
    };

    var request = new RestRequest(suggestionsPath, Method.POST);
    request.AddHeader("Accept", "application/json");
    request.Parameters.Clear();
    request.RequestFormat = DataFormat.Json;

    var newSuggestion = new SuggestionsDataClass.Suggestion();
    newSuggestion.title = "test suggestion number 2 from app development";
    newSuggestion.text = "please ignore this suggestion as we are testing integration of ideas into our apps";
    newSuggestion.vote_count = 3;

    request.AddParameter("suggestion[title]", newSuggestion.title);
    request.AddParameter("suggestion[text]", newSuggestion.text);
    request.AddParameter("suggestion[votes]", newSuggestion.vote_count);
    request.AddParameter("suggestion[referrer]", "uservoice test app");            

    var response = client.ExecuteAsync(request, HandlePostSuggestionResponse);

}

This call is a bit different from the previous one. We need to pass the idea data to as parameters to our request. The parameter “suggestion[title]” is the main one and always required. As you can see, “suggestion[text]” and “suggestion[votes]” are additional parameters that make the idea complete. All other date is generated by the uservoice server (like posted at, connect to the user who posted that, etc..). The parameter “suggestion[referrer]” is only visible in our admin console and can help you to track from where the suggestion was submitted.

In our response handler, we are receiving a complete set of suggestion data as a JSON string that we can use display to our users and enable sharing of this idea for example:

1
2
3
4
5
6
private void HandlePostSuggestionResponse(IRestResponse restResponse)
{
    var response = restResponse;

     //tbd: do something with the result (e.g. checking response.StatusCode)
}

Screenshot (305)

The last important point I want to show you is how to let a user vote for an idea.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public void VoteOnSuggestion()
{
    string postUserVotesPath = "/api/v1/forums/<yourforumid>/suggestions/{0}/votes.json";
    string suggestionId = "<yoursuggestionid>";
    var client = new RestClient(BaseUrl)
    {
        Authenticator = OAuth1Authenticator.ForProtectedResource(ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret)
    };

    var request = new RestRequest(string.Format(postUserVotesPath, suggestionId), Method.POST);
    request.AddHeader("Accept", "application/json");
    request.Parameters.Clear();
    request.RequestFormat = DataFormat.Json;

    request.AddParameter("to", 3);

    var response = client.ExecuteAsync(request, HandleVotingResponse);

}

Of course we need to authenticate our user again. We need to pass the suggestion id to the request path (which is part of the Suggestion class). This call accepts only one parameter (“to”). The value can be between 1 and 3 (tip: only offer this three options from your code already to avoid erroneous responses).

The response handler returns the suggestion’s JSON string the user voted on again:

1
2
3
4
5
6
private void HandleVotingResponse(IRestResponse restResponse)
{
    var response = restResponse;

    //tbd: do something with the result (e.g. checking response.StatusCode)
}

This was all about how to integrate the feedback forum of your uservoice account into your app. As always, I hope this will be useful for some of you.

If you want to explore which additional endpoints uservoice has, you are just a click away: https://developer.uservoice.com/docs/api/reference/

Happy coding, everyone!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.