17

Apparently HttpClient is the new recommended way of making HTTP requests, so I'm trying to use it to make a request to the Delicious API, which returns back an XML response. Here's what I've got:

internal class Program
{
    private static void Main(string[] args)
    {
        var credentials = new NetworkCredential("username", "password");
        var handler = new HttpClientHandler { Credentials = credentials};
        var client = new HttpClient(handler);

        var suggest = new Uri("https://api.del.icio.us/v1/posts/suggest");

        var suggestions =
            client.GetAsync(suggest.AddQueryParams("url", "https://yahoo.com"))
                .ContinueWith(t => t.Result.Content.ReadAsAsync<DeliciousSuggest>())
                .Unwrap()
                .Result;



        Console.ReadLine();
    }
}

public class DeliciousSuggest
{
    public string[] Popular { get; set; }
    public string[] Recommended { get; set; }
    public string[] Network { get; set; }
}

However, it throws an exception on the ReadAsAsync bit,

Additional information: Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.

Perhaps I'm missing some assembly, but that strikes me as off. The return type is XML, not JSON, but I'm still not quite sure how this ReadAsAsync method works, or how I would even specify that.

A sample response looks like this:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<suggest>
<popular>yahoo!</popular>
<popular>yahoo</popular>
<popular>web</popular>
<popular>tools</popular>
<popular>searchengines</popular>
<recommended>yahoo!</recommended>
<recommended>yahoo</recommended>
<recommended>web</recommended>
<network>for:Bernard</network>
<network>for:britta</network>
<network>for:deusx</network>
</suggest>

How can I parse that into some usable format?

mpen
  • 272,448
  • 266
  • 850
  • 1,236
  • You could just set your header to request xml like in the following http://stackoverflow.com/questions/10679214/how-do-you-set-the-content-type-header-for-an-httpclient-request. – jcwrequests Nov 13 '13 at 00:07

1 Answers1

20

"How can I parse that into some usable format?"

    [XmlRoot("suggest")]
public class DeliciousSuggest {
    [XmlElement("popular")]
    public string[] Popular { get; set; }

    [XmlElement("recommended")]
    public string[] Recommended { get; set; }

    [XmlElement("network")]
    public string[] Network { get; set; }
}

and use XmlSerializer to deserialize.


You should read the response back from del.icio.us as a string, and then you can deserialize it as follows:

var s = "this is the response from del"; 
var buffer = Encoding.UTF8.GetBytes(s); 
using (var stream = new MemoryStream(buffer)) { 
    var serializer = new XmlSerializer(typeof(DeliciousSuggest)); 
    var deliciousSuggest = (DeliciousSuggest)serializer.Deserialize(stream); 
    //then do whatever you want
}
mpen
  • 272,448
  • 266
  • 850
  • 1,236
Yang You
  • 2,618
  • 1
  • 25
  • 32
  • 2
    Well, that's part of an answer. Are you saying I should read the response as a string and parse it using `XmlSerializer` as a separate step? – mpen Nov 13 '13 at 06:20
  • 1
    var s = "this is the response from del"; var buffer = Encoding.UTF8.GetBytes(s); using (var stream = new MemoryStream(buffer)) { var serializer = new XmlSerializer(typeof(DeliciousSuggest)); var deliciousSuggest = (DeliciousSuggest)serializer.Deserialize(stream); //then do whatever you want} – Yang You Nov 13 '13 at 22:36
  • 1
    I'll take that as a 'yes'. I've edited your answer with the code you provided to make it more legible. Thanks for your help! – mpen Nov 14 '13 at 00:13