HuddleClient.Net

Pues sí, ya tengo una primera versión de HuddleClient.NET. La podéis encontrar en CodePlex.

Como comenté en mi anterior post, se trataba de hacer un cliente para Huddle workspaces usando la API que ofrecen. Esta API es de tipo REST y de momento sólo devuelve JSON.

Así que me puse manos a la obra para ver si era capaz de hacer un aplicativo en .NET que se entendiera con la API.

1a. opción

La primera prueba que hice no usaba Windows Comunication Fundation (WCF) simplemente usé la clase System.Net.HttpRequest.

[...]
 
HttpWebRequest request = WebRequest.Create("https://api.huddle.net/v1/json/workspaces") as HttpWebRequest;
request.Credentials = new NetworkCredential(textBox1.Text, textBox2.Text);
 
// Get response
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    // Get the response stream
    StreamReader reader = new StreamReader(response.GetResponseStream());
 
    // Console application output
    strJasonResponse = reader.ReadToEnd();
 
 
[...]

Debo decir que me lié un poco y no tenía muy claro cómo una vez obtenida la respuesta (strJasonResponse) iba a tratarla. Así que busqué en el todo poderoso Google algo como “JSON.NET” y encontré la librería de James Newton-King.

[...]
 
Newtonsoft.Json.Linq.JObject re = Newtonsoft.Json.Linq.JObject.Parse(strJasonResponse);
 
foreach (Newtonsoft.Json.Linq.JToken ws in re["Data"])
{
    WorkSpaces.Items.Add(ws["WorkspaceId"].ToString().Replace("\"", ""), ws["WorkspaceName"].ToString().Replace("\"", ""), 0);
}
 
[...]

Gracias a esta librería podía acceder a la respuesta (response) del método de la API de forma estructurada. Aunque tenía que quitarle las comillas a los campos, supongo que no encontré la manera correcta de acceder a los atributos de la respuesta.

Llegados a este punto me pareció que sería buena idea investigar cómo hacer esto con WCF.

2a. opción

Esta opción es la que he publicado en Codeplex. Se trata del mismo cliente para Huddle pero usando WCF en vez de usar HttpRequest.

Las primeras investigaciones que hice se centraron en cómo configurar el fichero de configuración. Estas son las ayudas que encontré:

Con esto el endpoint quedó configurado de la siguiente forma:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttps">
          <security mode="Transport">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="huddle">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="https://api.huddle.net/v1/json/" behaviorConfiguration="huddle"
          binding="webHttpBinding" bindingConfiguration="webHttps" contract="HuddleCli.IHuddleApi"
          name="HuddleREST" />
    </client>
  </system.serviceModel>
</configuration>

Los métodos de la API implementados se declaran así:

[...]
 
[ServiceContract]
 public interface IHuddleApi
 {
     [OperationContract]
     [WebGet(
         BodyStyle = WebMessageBodyStyle.Bare,
         ResponseFormat = WebMessageFormat.Json,
         UriTemplate = "workspaces")]
     WorkspacesResponse getWorkspacesForUser();
 
     [OperationContract]
     [WebGet(
         BodyStyle = WebMessageBodyStyle.Bare,
         ResponseFormat = WebMessageFormat.Json,
         UriTemplate = "workspaces/{idWorkspace}/items")]
     WorkspaceItem getFilesAndFoldersForWorkspace(string idWorkspace);
 
[...]

Ahora ya sólo falta ver cómo serializar la respuesta JSON en una clase. El siguiente link me aclaró las cosas: http://www.west-wind.com/weblog/posts/218001.aspx. No hacía falta que usara librerías de terceros, podía utilizar DataContractJsonSerializer para convertir la respuesta de la api en la clase correspondiente.

Es más, de hecho .NET 3.5 lo hace todo por nosotros, es muy sencillo. Si nos fijamos en el código anterior hemos declarado la llamada al método getWorkspacesForUser que devuelve una clase de tipo WorkspacesResponse. La clase la definimos de la siguiente forma:

[Serializable]
 public class WorkspacesResponse
 {
     public List<WorkspaceDetail> Data;
     public string Error;
     public bool Success;
 }
 
 [Serializable]
 public class WorkspaceDetail
 {
     public string DisplayName;
     public Int32 Id;
     public DateTime LastAction;
     public string LastActionText;
     public string StatusDisplay;
     public Int32 StatusId;
     public string StatusValue;
     public Int32 TeamId;
     public string TeamName;
     public string Title;
     public Int32 UserId;
     public string UserPath;
     public string Username;
     public Int32 WorkspaceId;
     public string WorkspaceName;
     public string WorkspacePath;
 }

De esta forma .NET 3.5 utilizará DataContractJsonSerializer para serializar la respuesta en la clase WorkspacesResponse.

Con todo esto la llamada al método queda de la siguiente forma:

if (svcHuddle.ClientCredentials.UserName.UserName == null && textBox1.Text.Length > 0)
{
    svcHuddle = new HuddleClient();
    svcHuddle.ClientCredentials.UserName.UserName = textBox1.Text;
    svcHuddle.ClientCredentials.UserName.Password = textBox2.Text;
}
 
HuddleCli.WorkspacesResponse wsResponse = svcHuddle.getWorkspacesForUser();
 
foreach (WorkspaceDetail ws in wsResponse.Data)
{
    WorkSpaces.Items.Add(ws.WorkspaceId.ToString(), ws.WorkspaceName, 0);
}

Pues esto todo! espero que os sirva. Recordar que podeis descargar el resultado de todo esto desde CodePlex.

Saludos,

Anuncios

Acerca de vcarazo

PMP, IT Project Manager
Esta entrada fue publicada en .NET, Huddle, WCF. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s