Las Interfaces de Programación de Aplicaciones o API en SharePoint tienen su historia y por ello hay una variedad de opciones disponibles hoy en día ningún API se aplica a todos los casos y en necesario conocer su historia para conocer su aplicación.
.NET Server Type o Modelo de Objetos de Servidor para SharePoint
Empecemos con .NET Server Type o el Modelo de Objetos de Servidor para SharePoint. Esta API nació con la versión SharePoint 2007, la cual emergía de a poco, en Visual Studio 2005 no se tenía ningún plug-in al principio para soportar el desarrollo de soluciones para Extender SharePoint y había que definir manualmente archivos XML que definían las FEATURES que activarían las funcionalidades en los sitios de SharePoint. Los Elementos web recuerdo eran y son en realidad controles de Usuario de ASP.NET que se enmascaraban a través de un archivo de XML para convertirlo en un elemento Web que reconociera SharePoint.
Recomiendo el siguiente enlace:Mejores Prácticas: Problemas comunes cuando utiliza el modelo de objetos de servidor
A continuación segmento de código del Modelo de Objeto de Servidor para SharePoint 2007-2010 y 2013 soluciones de granja (WSP)
sing (SPSite siteCollection = new SPSite("http://intranet.adicodes.com"))
{
using (SPWeb site = siteCollection.OpenWeb())
{
try
{
SPList taskList = site.GetList("/Lists/MyTasks");
Console.WriteLine("Success!");
//Create a new item
SPListItem newItem = list.Items.Add;
newItem["Title"] = "Created Item " + DateTime.Now.ToLongDateString;
newItem.Update; //NOTE: Update must be called
//Read items by binding to grid
SPListItemCollection items = list.Items; //NOTE: This loads all items, folders, and fields!
itemGrid.DataSource = items; // Binding to grid to display items, just for scenario
itemGrid.DataBind;
//Delete the first item
list.Items[0].Delete;
//Update the first item
//Note the use of a temporary SPListItem
SPListItem updateItem = list.Items[0];
updateItem["Title"] = "Updated Item " + DateTime.Now.ToLongDateString;
updateItem.Update;
}
catch(FileNotFoundException)
{
Console.WriteLine("List does not exist");
}
}
}
CSOM o Client SharePoint Object Model
Este modelo de objetos para SharePoint que se ejecuta de lado del cliente surgió en la versión SharePoint 2010 que introdujo las SandBox Solution que pretendía apoyar la adopción de Silverlight, el cual era un “motor” tipo Java que ejecutaría el código en cualquier dispositivo y sistema operativo, bueno esa era la intención Microsoft desistió al ver nuevas tendencias en el mercado como la nube y saco a Silverlight y como consecuencia el modelo sandbox también marcándolo como obsoleto en las próximas versiones. El nombre Sandbox solution se le debe a que se ejecuta en una caja cerrada es decir ya no se tiene acceso al servidor sino solamente a la colección de sitios donde se cargue la solución.
Una de las interioridades de este tipo de solución es que el empacado era el mismo que las soluciones de granja de solución wsp, pero con el alcance limitado a colección de sitios y que no podía ejecutar código que instanciara el Modelo de Objetos de Servidor de las soluciones de granja del modelo anterior. En SharePoint 2010, entonces hay dos posibilidades desarrollar soluciones de granja y soluciones Sandbox una consume el modelo de objetos de Servidor y la otra el modelo de objetos cliente. No todo el modelo de objetos de Servidor se dispone en la versión CSOM ya que el alcance es mucho mas limitado en las soluciones Sandbox y fundamentalmente se tiene acceso al contenido dentro de los sitios de SharePoint, bibliotecas, listas, grupos y usuarios.
// Create ClientContext object
ClientContext ctxObj =
new
ClientContext(
"http://mysitecllection/mysite/"
);
// Get Site Collection object
Site siteObj = ctxObj.Site;
ctxObj.Load(siteObj);
// Get web object
Web webObj = siteObj.RootWeb;
ctxObj.Load(webObj);
// Build query to the list "EmployeeList"
List empListObj = webObj.Lists.GetByTitle(
"EmployeeList"
);
ctxObj.Load(empListObj);
// Execute the query against ClientContext
ctxObj.ExecuteQuery();
// Get the Title
Console.WriteLine(empListObj.Title);
// Build a query for all items in the list
CamlQuery query =
new
CamlQuery();
query.ViewXml =
"<View/>"
;
ListItemCollection allEmploys = empListObj.GetItems(query);
ctxObj.Load(allEmploys);
// Execute the query against ClientContext
ctxObj.ExecuteQuery();
// Get all the results
foreach
(ListItem listItem
in
allEmploys) {
Console.WriteLine(
"Id: {0} - Firstname: {1} - LastName: {2} - Department: {3}"
,
listItem[
"ID"
],
listItem[
"FirstName"
],
listItem[
"LastName"
],
listItem[
"Department"
]
);
}
REST endpoint
También en la versión SharePoint 2010 vino una implementación de Rest para el contenido de SharePoint, también limitado al contenido de SharePoint como su contraparte CSOM. Pero no fue sino hasta la versión 2013 que ya vino incluido desde su edición original. La intención de Microsoft es proveer un protocolo de comunicación standard para que el contenido de SharePoint fuese consumido por cualquier tipo de aplicación.
PartsDataContext context = new PartsDataContext(
new Uri("http://localhost/sites/sharepointlist/_vti_bin/listdata.svc"));
var partsQuery = (DataServiceQuery<PartsItem>)
context.Parts.Where(p => p.SKU.StartsWith(SearchSku))
.Select(p => new PartsItem { Title = p.Title,
SKU = p.SKU,
Id = p.Id,
Description = p.Description
});
// Execute query.
query.BeginExecute(DisplayParts, query);
JSOM object
Con el advenimiento de la versión SharePoint 2013 trabajo consigo un nuevo modelo de desarrollo llamado App Model o Modelo de Aplicación, esto para apoyar la estrategia de Microsoft en la nube y proveer un modelo de extensibilidad de SharePoint en la nube a través de Office 365. Para la versión SharePoint 2013 en premisas persiste el modelo de solución de granja que tiene acceso total a los recursos del servidor y el modelo Apps. Pero para la versión en la nube solo esta disponible el modelo de Aplicación.
Fundamentalmente solo se pueden desarrollas dos tipos de aplicaciones bajo este nuevo modelo SharePoint Hosted y Provider Hosted. La primera básicamente consume el contenido de SharePoint por medio de javascript y este modelo provee un conjunto de librerías de Json para consumir el contenido de SharePoint el cual devuelve los resultados en formato Json. Si elegimos el Modelo Provider Hosted podemos utilizar cualquiera de las API Cliente (Csom, Jsom o Rest) pero el código debe de hospedarse fuera de SharePoint.
Ejemplo:
function createListItem(siteUrl,listName, itemProperties, success, failure) {
var itemType = getItemTypeForListName(listName);
itemProperties["__metadata"] = { "type": itemType };
$.ajax({
url: siteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",
type: "POST",
contentType: "application/json;odata=verbose",
data: JSON.stringify(itemProperties),
headers: {
"Accept": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val()
},
success: function (data) {
success(data.d);
},
error: function (data) {
failure(data);
}
});
}
// Get List Item Type metadata
function getItemTypeForListName(name) {
return "SP.Data." + name.charAt(0).toUpperCase() + name.split(" ").join("").slice(1) + "ListItem";
}
//specify item properties
var itemProperties = {'Title':'Order task','Description': 'New task'};
//create item
createListItem(_spPageContextInfo.webAbsoluteUrl,'Tasks',itemProperties,
function(entity){
console.log('New task ' + entity.Title + ' has been created');
},
function(error){
console.log(JSON.stringify(error));
}
);
API disponibles en SharePoint para el desarrollo de Aplicaciones.
https://msdn.microsoft.com/EN-US/library/office/dn268594.aspx
Espero les sea de utilidad para elegir las diferentes API según lo escenarios con que estan desarrollando soluciones para las diferentes versiones de SharePoint.
Hasta la Proxima!,
Juan Manuel Herrera Ocheita