Accediendo a los datos de SharePoint OnLine a través de CSOM


Hola a todos,

Hoy quiero seguir avanzando en el conocimiento de las distintas APIs que tenemos disponibles para acceder a SharePoint. Hasta ahora, en entradas anteriores, había hablado sobre el uso de la API Javascript y sobre todo de la API REST.

Introducción a la API REST de SharePoint 2013

Creando una app para SharePoint OnLine

Con estas APIs se pueden desarrollar SharePoint Hosted Apps, alojadas en SharePoint, que se desarrollan con HTML5 + CSS3 y Javascript principalmente. Pero además, podemos crear otro tipo de aplicaciones, que no están alojadas en SharePoint como las anteriores y que están alojadas en un sitio externo a éste, como puede ser un sitio de Azure. Las SharePoint Provider Apps pueden ser proyectos ASP.NET como WebForms o MVC. Para acceder a SharePoint desde este tipo de aplicaciones tenemos disponible la API CSOM (Client Side Object Model). Esta API es C#, lo que a priori, para los que hemos desarrollado habitualmente en el modelo de servidor puede suponer una ventaja.

El objetivo de esta entrada es hacer una pequeña introducción de cómo tenemos que proceder para realizar algunas de las operaciones básicas que pueden sernos útiles a la hora de trabajar con SharePoint.

Estos ejemplos se han basado en la creación de una Provider Hosted App con una aplicación MVC. Dicha aplicación, tiene permisos para manejar la colección de sitios, concedidos a través del AppManifest.xml.

Accediendo a listas

El código que vamos a usar para acceder a una lista por medio de la API CSOM es el siguiente:

public class NewsModel
{
    public string Title { get; set; }
    public string Cuerpo { get; set; }
    public string ID { get; set; }
    public DateTime Created { get; set; }
}
public void SeeList(string listname)
{
      var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

      using (var clientContext = spContext.CreateUserClientContextForSPHost())
      {
           if (clientContext != null)
           {
                List news = clientContext.Web.Lists.GetByTitle(listname);

                CamlQuery query = new CamlQuery();
                query.ViewXml = "<View><Query><OrderBy><FieldRef Name='ID' Ascending='False' /></OrderBy></Query><ViewFields><FieldRef Name='Title' /></ViewFields><QueryOptions /><RowLimit>2</RowLimit></View>";
                    
                ListItemCollection items = news.GetItems(query);

                clientContext.Load(items);
                clientContext.ExecuteQuery();

                List<NewsModel> list = new List<NewsModel>();

                foreach(ListItem item in items)
                {
                    NewsModel newNews = new NewsModel
                    {
                         Title = item["Title"].ToString(),
                         ID = item.Id.ToString()
                    };

                    list.Add(newNews);
                 }

            }
        }
}

A la hora de hacer una consulta hay algunos aspectos que se debe de tener en cuenta:

  • Al ser una llamada desde el cliente, es importante intentar que las consultas sean lo más óptimas posibles, no olvidando establecer el RowLimit y las columnas que se quieren leer en la consulta, evitando leer información innecesaria.
  • Se pueden hacer todas las llamadas a métodos de la API que se quieran antes de llamar a la función clientContext.Load() y clientContext.ExecuteQuery(). Pero si lo que queremos es acceder a las propiedades de un elemento, es obligatorio previamente, hacer las llamadas a estos dos métodos del contexto para que se ejecute la consulta y la información esté ya cargada. En caso contrario, obtendremos una excepción de tipo NullReference.

Añadiendo elementos a una lista

Vamos a ver ahora cómo podríamos añadir un elemento en una lista por medio de CSOM. Para ello, se supone la existencia de una lista que tiene los campos Título,Body y Gist.

public void AddElementToList(string listname, string title, string body, string gist)
{
    var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

    using (var clientContext = spContext.CreateUserClientContextForSPHost())
    {
          if (clientContext != null)
          {
                List examples = clientContext.Web.Lists.GetByTitle(listname);

                ListItemCreationInformation creationInformation = new ListItemCreationInformation();

                ListItem newItem = examples.AddItem(creationInformation);
                newItem["Title"] = title;
                newItem["Body"] = body;
                newItem["Gist"] = gist;

                newItem.Update();

                clientContext.ExecuteQuery();
           }
     }
}

Creando una lista

Vamos a ver por último, como crear una lista usando este modelo de objetos.La última función, creará una lista de tipo genérico y añadirá algunos campos a la misma.

public void CreateList(string ListName)
{
      var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

      using (var clientContext = spContext.CreateUserClientContextForSPHost())
      {
          if (clientContext != null)
          {
              ListCreationInformation informationToList = new ListCreationInformation
              {
                   Title = ListName,
                   TemplateType = (int)ListTemplateType.GenericList,
                   Description = "This is a Client Created List"
              };

              List newList = clientContext.Web.Lists.Add(informationToList);

              newList.Fields.AddFieldAsXml("<Field DisplayName='Body' Type='Note' Required='True' />", true, AddFieldOptions.DefaultValue);
              newList.Fields.AddFieldAsXml("<Field DisplayName='Gist' Type='Text' Required='True' />", true, AddFieldOptions.DefaultValue);

              newList.Update();

              clientContext.ExecuteQuery();

           }
      }
}

Con estos ejemplos, espero que quede una ligera idea de, qué y cómo se puede trabajar con SharePoint y C# desde el modelo de objetos de cliente en SharePoint Provider Apps.

Este modelo de objetos tiene mucha relevancia dentro del modelo de provisionamiento remoto que está promoviendo Microsoft para sustituir al tradicional modelo de desarrollo basado en el Feature Framework por el nuevo modelo de desarrollo basado en apps. Aunque de este tema os hablaré más adelante.

Y nada más por hoy, espero que como siempre os sea de utilidad.

Anuncios

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