Trabalhando com Dados do SharePoint Online com o Web Service Lists.ASMX

Trabalhar com objetos do SharePoint Online possuem um item diferente do SharePoint OnPremise, como já tratado no post Trabalhando com Dados do SharePoint Online com o .NET Client Object Model, que é a autenticação.

Neste post vou mostrar como acessar os dados do SharePont Online através do web service Lists.asmx.

Para trabalhar com dados do SharePoint Online o desenvolvedor deve prestar atençãoa  dois pontos:

  1. A classe ClaimClientContext retorna um ClientContext ao invés de Lists, como seria experado ao se trabalhar com o Lists.asmx;
  2. A referência ao serviço https://sites/_vti_bin/Lists.asmx deve ser feita na opção avançada da inclusão da referência ao serviço, lá em adicionar referência web. Se for adicionada como serviço não irá funcionar da forma descrita neste post.

O código completo deste projeto está no GitHub SharePoint-Demos e contém diversos outros exemplo. O nome do projeto é ListASMXDemo.

Algumas alterações foram necessárias na classe ClaimClientContext, como alterar o retorno do método GetAuthenticatedContext para retornar Lists, conforme a listagem 01, e alterar a regra do método GetAuthenticatedContext (listagem 02) para trabalhar Lists ao invés de ClientContext.

Neste post vou mostrar apenas a implementação da classe RepositorioTarefas, para ver as demais acesse os fontes do projeto.

public static SharePointLists.Lists GetAuthenticatedContext(string targetSiteUrl)
{
    return (GetAuthenticatedContext(targetSiteUrl, 0, 0));
}

Listagem 01: Método GetAuthenticatedContext alterado

 

/// <summary>
/// This method will return a ClientContext object with the authentication cookie set.
/// The ClientContext should be disposed of as any other IDisposable
/// </summary>
/// <param name=”targetSiteUrl”></param>
/// <returns></returns>
public static SharePointLists.Lists GetAuthenticatedContext(string targetSiteUrl, int popUpWidth, int popUpHeight)
{
    CookieCollection cookies = null;
    cookies = ClaimClientContext.GetAuthenticatedCookies(targetSiteUrl, popUpWidth, popUpHeight);
    if (cookies == null) return null;

    SharePointLists.Lists contexto = new SharePointLists.Lists();

    try
    {
        contexto.CookieContainer = new CookieContainer();
        foreach (Cookie cookie in cookies)
        {
            contexto.CookieContainer.Add(cookie);
        }
    }
    catch
    {
        if (contexto != null) contexto.Dispose();
        throw;
    }

    return contexto;
}

Listagem 02: Método GetAuthenticatedContext alterado

 

Com a classe ClaimClientContext devidamente alterada, agora vamos implementar a classe de repositório de tarefas. A listagem 03 mostra as referências, classe e construtor padrão da classe.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceModel;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using ListsASMXDemo.Entidades;
using ListsASMXDemo.Helpers;

namespace ListsASMXDemo
{
    public class RepositorioTarefas
    {
        private SharePointLists.Lists Contexto;

        public RepositorioTarefas()
        {
            Contexto = ClaimClientContext.GetAuthenticatedContext(Constants.ENDRECO_SITE);
            Contexto.Url = Constants.ENDRECO_SITE + “/_vti_bin/Lists.asmx”;
        }

Listagem 03: Campos e construtor da classe RepositorioTarefas

 

O método ObterTodos retorna todas as tarefas cadastradas no SharePoint, veja como os parâmetros são montados para buscar os dados. No exemplo da listagem 04 todos os campos são retornado, mas poderam ser apenas algunas campos como id e título, por exemplo. Como o retorno do método é um XmlNode, quanto menos informação inútil eu retornar, melhor será.

public List<Tarefa> ObterTodos()
{
     XmlDocument xmlDoc = new System.Xml.XmlDocument();

     XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, “Query”, “”);
     XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, “ViewFields”, “”);
    
     XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, “QueryOptions”, “”);
     ndQueryOptions.InnerXml = “<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>”;

     XmlNode ndListItems = Contexto.GetListItems(“Tarefas”, null, ndQuery, ndViewFields, null, ndQueryOptions, null);

     return TarefaConverterHelper.ItensParaTarefas(ndListItems);
}

Listagem 04: Método ObterTodos

 

O método ObterPorID retorna apenas a tarefa conforme o id passado por parâmetro. Usa CAML para fazer o filtro, conforme listagem  05.

public Tarefa ObterPorID(int id)
{
     XmlDocument xmlDoc = new System.Xml.XmlDocument();

     XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, “Query”, “”);
     XmlNode ndViewFields =  xmlDoc.CreateNode(XmlNodeType.Element, “ViewFields”, “”);
     XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, “QueryOptions”, “”);

     ndQueryOptions.InnerXml = “<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>”;

     ndQuery.InnerXml = “<Where><Eq><FieldRef Name=’ID’/>” +
                        “<Value Type=’Number’>” + id.ToString() + “</Value></Eq></Where>”;

     XmlNode ndListItems = Contexto.GetListItems(“Tarefas”, null, ndQuery, ndViewFields, null, ndQueryOptions, null);

     return TarefaConverterHelper.ItensParaTarefas(ndListItems)[0];
}

Listagem 05: Método ObterPorID

 

O método para buscar pelo título da tarefa é muito parecido com o de obter pelo id, a única coisa que muda é a query CAML que é passada para o método GetListItems, conforme a listagem 06.

 public List<Tarefa> ObterPorFiltro(string titulo)
{
     XmlDocument xmlDoc = new System.Xml.XmlDocument();

     XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, “Query”, “”);
     XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, “ViewFields”, “”);
     XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, “QueryOptions”, “”);

     ndQueryOptions.InnerXml = “<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>”;

     ndQuery.InnerXml = “<Where><Contains><FieldRef Name=’Title’/>” +
                        “<Value Type=’Text’>” + titulo + “</Value></Contains></Where>”;

     XmlNode ndListItems = Contexto.GetListItems(“Tarefas”, null, ndQuery, ndViewFields, null, ndQueryOptions, null);

     return TarefaConverterHelper.ItensParaTarefas(ndListItems);
}

Listagem 06: Método ObterPorFiltros

 

Os métodos Salvar e Excluir, nas listagems 07 e 08 respectivamente, são idênticos, neles um parâmetro Method com o cmd adequado são passados para o método UpdateListItems. Esse método pode receber inclusão, edição ou exclusão de diversmos itens ao mesmo tempo. Para isso é necessário montar o XML e informar todos os dados.

 public Tarefa Salvar(Tarefa tarefa)
{
     ///*Get Name attribute values (GUIDs) for list and view. */
     System.Xml.XmlNode ndListView = Contexto.GetListAndView(“Tarefas”, “”);
     string strListID = ndListView.ChildNodes[0].Attributes[“Name”].Value;
     string strViewID = ndListView.ChildNodes[1].Attributes[“Name”].Value;

     /*Create an XmlDocument object and construct a Batch element and its
     attributes. Note that an empty ViewName parameter causes the method to use the default view. */
     System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
     System.Xml.XmlElement batchElement = doc.CreateElement(“Batch”);
     batchElement.SetAttribute(“OnError”, “Continue”);
     batchElement.SetAttribute(“ListVersion”, “1”);
     batchElement.SetAttribute(“ViewName”, strViewID);

     batchElement.InnerXml = TarefaConverterHelper.TarefaParaXML(tarefa);

     Contexto.UpdateListItems(strListID, batchElement);

     return tarefa;
}

Listagem 07: Método Salvar

 

public void Excluir(int id)
{
     /*Get Name attribute values (GUIDs) for list and view. */
     System.Xml.XmlNode ndListView = Contexto.GetListAndView(“Tarefas”, “”);
     string strListID = ndListView.ChildNodes[0].Attributes[“Name”].Value;
     string strViewID = ndListView.ChildNodes[1].Attributes[“Name”].Value;

     /*Create an XmlDocument object and construct a Batch element and its
     attributes. Note that an empty ViewName parameter causes the method to use the default view. */
     System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
     System.Xml.XmlElement batchElement = doc.CreateElement(“Batch”);
     batchElement.SetAttribute(“OnError”, “Continue”);
     batchElement.SetAttribute(“ListVersion”, “1”);
     batchElement.SetAttribute(“ViewName”, strViewID);

     batchElement.InnerXml = “<Method ID=’0′ Cmd=’Delete’><Field Name=’ID’>” + id.ToString() + “</Field></Method>”;

     Contexto.UpdateListItems(strListID, batchElement);
}

Listagem 08: Método Excluir

 

Para testar a solução, sem precisar implementar a camada de apresentação ou o restante das regras de negócio implementei testes unitários, facilitando assim bastante o desenvolvimento.

Anúncios

Uma resposta to “Trabalhando com Dados do SharePoint Online com o Web Service Lists.ASMX”

  1. Entendendo o Modelo de Dados do SharePoint « Fabian André Gehrke Says:

    […] os serviços que o SharePoint publica com o Lists.asmx, […]


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: