O SharePoint 2010 trouxe várias formas de acessar seus dados remotamente, ou seja, a partir de programas que não estão executando no mesmo servidor. Esses recursos estão disponíveis na verão local (OnPremise) e no Office 365 (SharePoint Online).
Neste post vou mostrar como trabalhar com esses dados do SharePoint Online, para isso vou utilizar uma lista de tarefas padrão do SharePoint e a API para acesso remoto através do .NET.
Para fazer a COM (Client Object Model) acessar o SharePoint Online temos um desafio bem grande: a autenticação. Se utilizar a mesma rotina que é utilizada no SharePoint local, não é possível conectar no SharePoint Onlin, dá erro de 403 Forbidden. Todo material que eu achei para resolver isso segue o mesmo padrão, criar uma classe, como por exemplo a implementação disponível na Code Gallery ClaimClientContext, que consiste na chamada da tela de login para o usuário informar as credenciais e depois pegar o cookie gerado para autenticar. Se o usuário salvar a senha não irá solicitar as credenciais novamente.
Com esse problema resolvido, o restante do código é igual para as soluções de SharePoint Online ou SharePoint OnPremise, o código completo deste projeto está no GitHub SharePoint-Demos e contém diversos outros exemplo.
Neste post vou mostrar apenas a implementação da classe RepositorioTarefas, para ver as demais acesse os fontes do projeto.
A listagem 01 mostra a classe repositórios que abstrai a camada de SharePoint, para fazer isso criei uma classe chamada Tarefa e cada interação com o repositório ela é transformada de tarefa para item de lista ou item de lista para tarefa, conforme a necessidade. Esse código está na classe de helper chamada TarefaConverterHelper.
O método ClaimClientContext.GetAuthenticatedContext retorna um objeto do tipo ClientContext, se o objetivo for utilizar o SharePoint OnPremise este método deve ser substituído pela criação do ClientContext padrão.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Client;
using ClientObjectModelDemo.Entidades;
using System.Net;
using ClientObjectModelDemo.Helpers;
namespace ClientObjectModelDemo
{
public class RepositorioTarefas
{
private ClientContext Contexto;
private Web Web;
private List ListaTarefas;
public RepositorioTarefas()
{
this.Contexto = ClaimClientContext.GetAuthenticatedContext(Constants.ENDRECO_SITE);
this.Web = Contexto.Web;
this.ListaTarefas = this.Web.Lists.GetByTitle(“Tarefas”);
}
Listagem 01: campos e construtor da classe RepositorioTarefas
A listagem 02 mostra o método ObterTodos, que retorna todas as tarefas cadastradas na lista do SharePoint, após fazer isso converte os objetos itens de lista em objetos tarefas.
public List<Tarefa> ObterTodos()
{
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = “<View/>”;
ListItemCollection itens = ListaTarefas.GetItems(camlQuery);
Contexto.Load(itens);
Contexto.ExecuteQuery();
return TarefaConverterHelper.ItensParaTarefas(itens);
}
Listagem 02: Método ObterTodos
A listagem 03 mostra a obtenção das tarefas passando como filtro um pedaço do título da tarefa. O filtro é feito utilizando CAML.
public List<Tarefa> ObterPorFiltro(string titulo)
{
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = “<View><Query><Where> ” +
“<Contains> ” +
“<FieldRef Name=’Title’ /> ” +
“<Value Type=’Text’>” + titulo + “</Value> ” +
“</Contains> ” +
“</Where></Query></View> “;
ListItemCollection itens = ListaTarefas.GetItems(camlQuery);
Contexto.Load(itens);
Contexto.ExecuteQuery();
return TarefaConverterHelper.ItensParaTarefas(itens);
}
Método 03: Método ObterPorFiltro
Para obter apenas um item pelo id foi criado o método ObterPorID, que recebe o id da tarefa e retorna o objeto tarefa.
public Tarefa ObterPorID(int id)
{
ListItem item = ListaTarefas.GetItemById(id);
Contexto.Load(item);
Contexto.ExecuteQuery();
return TarefaConverterHelper.ItemParaTarefa(item);
}
Método 04: ObterPorID
O método Salvar salva a tarefa recebida por parâmetro no SharePoint, se for uma tarefa sem id quer dizer que é uma tarefa nova, sendo assim cria um novo item, atribui os campos e insere o novo registro. Se já tiver id só atualiza os dados e salva.
public Tarefa Salvar(Tarefa tarefa)
{
ListItem itemTarefa;
if (tarefa.ID == (default(int)))
{
ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();
itemTarefa = ListaTarefas.AddItem(itemCreateInfo);
}
else
{
itemTarefa = ListaTarefas.GetItemById(tarefa.ID);
Contexto.Load(itemTarefa);
Contexto.ExecuteQuery();
}
itemTarefa = TarefaConverterHelper.TarefaParaItem(tarefa, itemTarefa);
itemTarefa.Update();
Contexto.ExecuteQuery();
return ObterPorID(itemTarefa.Id);
}
Método 05: Método Salvar
O método excluir, conforme a listagem 06, recebe o id da tarefa e exclui no SharePoint.
public void Excluir(int id)
{
ListItem tarefa = ListaTarefas.GetItemById(id);
tarefa.DeleteObject();
Contexto.ExecuteQuery();
}
Método 06: 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.
18/04/2012 às 15:02
[...] Fabian André Gehrke SharePoint no dia-a-dia InícioOutras PublicaçõesWP7Sobre Twitter Facebook RSS ← Trabalhando com Dados do SharePoint Online com o .NET Client Object Model [...]
11/07/2012 às 15:40
[...] as APIs de cliente do SharePoint em .NET, Silverlight, JavaScript ou a API de [...]