Archivo de la etiqueta: REST

Crear items con servicios REST de diferentes tipos de contenido

Otra duda que se nos ha planteado es la creación de items en una lista o biblioteca de diferentes tipos de contenido utilizando servicios REST en  SharePoint 2010.

Previamente ya habíamos visto como Listar, añadir, modificar y borrar información con REST en SharePoint 2010, pero partíamos que la lista o biblioteca solo tenia un tipo de contenido por defecto. Ahora se nos plantea un complicación mas, que es crear un ítem de un tipo de contenido concreto.

Suponemos que tenemos la lista “DemoList” a la cual tiene el tipo de contenido por defecto “Elemento” y le hemos añadido un segundo tipo de contenido llamado “Anuncio”.

Ahora queremos añadir un nuevo item de tipo “Anuncio”… lo que deberíamos hacer es definir ese nuevo item y especificar su tipo de contenido:

static void CreateDataContentType()
{
	//recupera la informacion del servicio 
	DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/"));
	dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
	//crea y define un nuevo item en la lista DemoList (definimos el Content Type)
	DemoListItem demoListItem = new DemoListItem()
	{
		ContentType = "Announcement",
		Title = "Registro de tipo contenido Anuncio",
		Cuerpo = "Cuerpo del anuncio"
	};
	//añade el item a la lista
	dataContext.AddToDemoList(demoListItem);
	dataContext.SaveChanges();
	Console.WriteLine("Registro creado correctamente");
}

En el caso de no especificar el campo ContentType, SharePoint asume que el nuevo item, es del tipo de contenido predeterminado.

En la siguiente imagen se puede apreciar, como el nuevo registro añadido con esta función, es de tipo “Anuncio”:

 Es importante saber que has de conocer los posibles tipos de contenido de la lista en cuestión, ya que no hay forma de saber (ni siquiera con los metadatos: http://servidor/_vti_bin/listdata.svc/$metadata) de los posibles valores del campo: <Property Name=”TipoDeContenido” Type=”Edm.String” Nullable=”true” />.

 

Como subir documentos con el servicio REST en SharePoint 2010

Otra de las funcionalidades clave, con respecto a uso de servicios REST en SharePoint 2010, y siguiendo con el post: Listar, añadir, modificar y borrar información con REST en SharePoint 2010, es la posibilidad de subir un documento, a una biblioteca de documentos.

Esta funcionalidad, debe realizarse desde un cliente (en este caso voy a hacerlo desde una aplicación de consola). Parto de la anterior aplicación que montamos en mi anterior post,  lo único que vamos a realizar es añadirle un método más, parar poder subir documentos.

Este seria el método:

static void UploadDocument()
{
	using (FileStream file = File.Open(@"C:\TEMP\Documento.txt", FileMode.Open))
	{
		//recupera la informacion del servicio 
		DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/"));
		dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
		//declara las caracteristicas del el documento
		string path = "/Documents/Documento.txt";
		string Name = "Documento";
		string contentType = "plain/text";
		string Title = "Documento";
		//crea el documento
		DocumentsItem documentItem = new DocumentsItem()
		{
			ContentType = contentType,
			Name = Name,
			Path = path,
			Title = Title
		};
		//sube el documento al la biblioteca
		dataContext.AddToDocuments(documentItem);
		dataContext.SetSaveStream(documentItem, file, false, contentType, path);
		dataContext.SaveChanges();
		Console.WriteLine("Documento subido correctamente");
	} 
}

Para su correcto funcionamiento, hay que crear un archivo de texto plano en C:\TEMP\ llamado Documento.txt.

Se puede añadir para un correcto funcionamiento de la aplicación, control de excepciones…   ya que si existe algún problema, se produzca una excepción de tipo System.Data.Services.Client.DataServiceRequestException.

Nota: El método DataServiceContext.SetSaveStream únicamente está accesible desde el Framework 4.0.

Listar, añadir, modificar y borrar información con REST en SharePoint 2010

Una de las ventajas que tiene SharePoint, es el uso de servicios con protocolos estándares para poder consumir información desde cualquier plataforma… Este es el caso de REpresentational State Transfer (REST),  que técnicamente no es un protocolo, pero puede definirse como un modelo de diseño de Servicio Web basado en XML sobre HTTP.

¿Como podemos usar servicios REST en SharePoint 2010? Si tenemos un sitio de SharePoint, podemos acceder a su contenido, a través de  ADO.NET Data Services, lo único que debemos hacer es poner en el navegador la siguiente url: http://<servidor>/_vti_bin/listdata.svc/ para ver el listado de todas las entidades con las que podemos interactuar.

En caso de que tengáis problemas para recuperar esta información, podéis consultar este post: No se puede cargar IDataServiceUpdateProvider usando REST en SharePoint 2010.

Es posible navegar entre las entidades, incluyendo en la url el nombre de la entidad, como por ejemplo, del listado de objetos que tenemos en este sitio:

Podríamos visualizar los items de la lista DemoList accediendo a la url:

  • http://<servidor>/_vti_bin/listdata.svc/DemoList

Es necesario conocer los metadatos de la entidad, para realizar consultas mas complejas…

  • http://<servidor>/_vti_bin/listdata.svc/$metadata

Si queremos recuperar la información del primer item de esta lista, podemos obtenerlo de la siguiente forma: 

  • http://<servidor> /_vti_bin/listdata.svc/DemoList(1)

Si queremos únicamente devolver el titulo del item, solo tienes que especificar el nombre del campo:

  • http://<servidor>/_vti_bin/listdata.svc/DemoList(1)/Título

También podemos hacer filtros, como por ejemplo, con el titulo del item:

  • http://<servidor>/_vti_bin/listdata.svc/DemoList?$filter=Título eq ‘Otro nuevo registro’ 
Incluso podemos ordenar la información:
  • http://<servidor>/_vti_bin/listdata.svc/DemoList?$orderby=Título

 

Si preferimos consumir este servicio desde una aplicación .NET es tan sencillo como:

1) Desde Visual Studio, creas un nuevo proyecto de tipo “Console Application”

2) Añades una referencia al servicio REST, es decir con el botón derecho sobre el proyecto pulsas “Add Service Reference…” y añades la url del servicio:

3) Dependiendo de la acción que queramos realizar, podemos usar cualquiera de los siguientes métodos, que gracias a LYNQ podemos trabajar con la información:

Listado de items de una lista:

static void GetData()
{
	//recupera la informacion del servicio 
	DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/"));
	dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
	//recupera el listado de items de la lista DemoList
	var result = from items in dataContext.DemoList select new { Title = items.Title, };
	foreach (var item in result)
	Console.WriteLine(item);
}

Creación de un nuevo item en una lista:

static void CreateData()
{
	//recupera la informacion del servicio 
	DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/"));
        dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
	//crea un nuevo item en la lista DemoList
	DemoListItem demoListItem = new DemoListItem();
	demoListItem.Title = "Registro REST";
	dataContext.AddToDemoList(demoListItem);
	dataContext.SaveChanges();
	Console.WriteLine("Registro creado correctamente");
}

Actualización de un item existente en una lista:

static void UpdateData()
{
	//recupera la informacion del servicio 
	DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/")); 
        dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
	//modifica un item existente en la lista DemoList
	DemoListItem demoListItem = dataContext.DemoList.Where(i => i.Title == "Registro REST").FirstOrDefault();
	demoListItem.Title = "Registro REST - modificado";
	dataContext.UpdateObject(demoListItem);
	dataContext.SaveChanges();
	Console.WriteLine("Registro modificado correctamente");
}

Eliminacion de un item de una lista:

static void DeleteData()
{
	//recupera la informacion del servicio 
	DevPortalHomeDataContext dataContext = new DevPortalHomeDataContext(new Uri("http://servidor/_vti_bin/listdata.svc/")); 
        dataContext.Credentials = CredentialCache.DefaultNetworkCredentials; 
	//borra el item existente en la lista DemoList
	DemoListItem demoListItem = dataContext.DemoList.Where(i => i.Title == "Registro REST - modificado").FirstOrDefault();
	dataContext.DeleteObject(demoListItem);
	dataContext.SaveChanges();
	Console.WriteLine("Registro borrado correctamente");
}

 

Aquí tenéis el resultado de la ejecución de estos métodos:

Para mas información sobre el servicio REST en SharePoint 2010 podéis consultar la pagina de MSDN: Interfaz de REST de SharePoint Foundation.

 

No se puede cargar IDataServiceUpdateProvider usando REST en SharePoint 2010

Al intentar utilizar los servicios REpresentational State Transfer (REST) en SharePoint 2010, nos encontramos con el siguiente error, como se muestra en la siguiente imagen:

Could not load type ‘System.Data.Services.Providers.IDataServiceUpdateProvider’ from assembly ‘System.Data.Services, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′.

Lo primero que hice al ver este error, es ver si en la GAC había una entrada del ensamblado: System.Data.Service… y ahí estaba, con la versión: 3.5.30729.1.

Después de buscar un rato por la Red, vi que había un par de parches que solucionaba este problema, concretamente el KB976127 y el KB976126, los cuales actualizan el ADO.NET Data Services para poder consumir servicios REST en el .NET Framework 3.5, el primero para los sistemas operativos: Windows 7 y Windows Server 2008 R2 y el segundo para: Windows 2000, Windows Server 2003, Windows XP, Windows Vista and Windows Server 2008.

Tras la instalación del parche adecuado, verificamos que los servicios, vuelven a funcionar correctamente, accediendo por ejemplo a http://<servidor>/_vti_bin/listdata.svc/:

Puedes descargar los parches (dependiendo del sistema operativo que estés usando):