We recently upgraded to FogBugz 6, which sports a new REST styled API.  I decided to play with it by writing a simple .NET client using VS 2008, and take LINQ-to-XML for a spin.  The center piece of LINQ-to-XML is the new XDocument class, which is yet another way to work with XML data in .NET:
return XDocument.Load(urlForXmlData);
What makes this differ from XmlDocument, XmlReader, etc., is that a LINQ provider has been written around it:
var cases = from c in doc.Elements("cases").Elements("cases")
            where c.Element("sTitle").Value.StartsWith(searchText)
            select c;
Beyond that, it’s plain easier to use, in my opinion:
if (responseElement.Element("error").Attribute("code").Value == "2")
With that, it’s fairly easy to come up with a method to send commands and read XML: 
private XDocument SendCommand(string commandFormatString, params object[] parameterValues)
{            
    var commandUri = this.FogBugzApiUrl.ToString();
    commandUri += String.Format(commandFormatString, parameterValues);
    return XDocument.Load(commandUri);
}
This method can then be used to work against the REST API:
public bool LogOn(string email, string password)
{
    var responseElement = SendCommand("cmd=logon&email={0}&password={1}", email, password).Element("response");
    if (responseElement.Element("error") == null)
    {
        this._token = responseElement.Element("token").Value;
        return true;
    }
    else
    {
        return false;               
    }
}
Where it gets interesting, though, is using LINQ and inline initialization to new up strongly-typed wrappers around the responses:
public IEnumerable<Case> GetCases(string search)
{
    var response = SendCommand("cmd=search&q={0}&cols=ixBug,sTitle", search);
    var cases = from c in response.Elements("cases").Elements("case")
                select new Case() { Id = int.Parse(c.Element("ixBug").Value), Title = c.Element("sTitle").Value };
    return cases;
}
Hopefully, you can see how powerful LINQ and these other new features in .NET 3.5 are.  In a few lines of code, we can query a REST API and return strongly-typed wrappers around the content.
 
No comments:
Post a Comment