Professional Documents
Culture Documents
ODATA
Introducción al nuevo estándar de intercambio de datos
José Miguel Torres trabaja como Responsable de I+D+i en MRW. Cuenta con más
de 11 años de experiencia. Es autor habitual desde el año 2001 en revistas
especializadas del sector, habiendo publicado una gran variedad de artículos sobre
tecnología Microsoft. Es también autor de dos libros sobre SQL Server Compact.
Twitter: @alegrebandolero.
COMENZANDO CON ODATA
INTRODUCCIÓN AL NUEVO ESTÁNDAR DE INTERCAMBIO DE DATOS
Krasis Consulting, S. L.
www.Krasis.com
Contenido
v
¿Te interesa este libro?
Compra el libro electrónico en nuestra tienda: http://shop.campusmvp.com
- En formato PDF
- Sin DRM
- Imprimible
- Busca en el contenido
Introducción a OData
En este manual vamos a estudiar qué es Open Data Protocol -también conocido como
OData-, la teoría en la que se basa, el porqué de su necesidad y también como
podemos generar y consumir orígenes de datos bajo dicho estándar en la práctica. El
objetivo es que puedas usar este documento como herramienta de aprendizaje, pero
también como elemento de consulta cuando necesites ver algún detalle más teórico.
Algunas partes del mismo son bastante áridas, pese a que hemos tratado de sintetizar de
la forma más comprensible posible las especificaciones del protocolo pero entendemos
que son necesarias para conseguir para entender el funcionamiento y peculiaridades de
OData. No te desanimes y al final tendrás una buena visión tanto conceptual como
práctica de este emergente estándar de intercambio de datos entre aplicaciones.
Para entender la utilidad real que ofrece OData tratemos de imaginar un escenario
en el que tengamos el requisito de compartir un origen de datos a través de tecnología
Internet. Escenarios como en el que en muchas ocasiones nos hemos encontrado como
desarrolladores, y en el que nos han solicitado tener acceso a determinada información
de la base de datos de producción para la creación de Informes, por ejemplo datos de
ventas para el informes del Departamento Financiero. En estos escenarios podemos
exponer los datos utilizando los mecanismos de replicación y sincronización de la
mayoría de bases de datos empresariales. Sin embargo, cuando tenemos que compartir
los datos fuera de la Internet corporativa a través de Internet, o incluso a través de la
propia Intranet de la compañía (por ejemplo si el Departamento Financiero puede estar
ubicado en Madrid y los datos están en Barcelona), entonces los mecanismos de
sincronización y replicación no siempre son válidos. Además, los sistemas de
replicación y sincronización tienen un coste elevado y más si el objetivo del “futuro”
cliente no es únicamente consultar sino además modificar.
1
2 Comenzando con OData
Existen muchos de servicios de este estilo que están operativos, pero sin embargo
únicamente exponen el nivel de detalle que el desarrollador ha creído oportuno
4 Comenzando con OData
Ello implica la modificación del contrato del servicio (del WSDL en definitiva) y
puede tener un elevado impacto sobre las aplicaciones existentes. Como podemos
observar, este tipo de soluciones tienen algunas limitaciones. Veamos cuáles son.
filtrado en el lado cliente para obtener los 10 clientes que más han facturado tal y como
se debería hacer actualmente.
En definitiva Open Data Protocol es la respuesta a este nuevo escenario que ya
no es imaginario, es real y este manual pretende presentar las características aún más
trascendentes que hace indispensable conocer al menos, las bondades de esta
tecnología.
2
CAPÍTULO
Fundamentos de OData
7
8 Comenzando con OData
Tanto si el servicio es complejo como no, OData expone los feeds de más alto nivel
a través de AtomPub en forma de Documento. En realidad expone dos tipos de
documentos con diferentes niveles de detalle. Mientras que el Service Document
expone, como se mencionó antes, los elementos de más alto nivel, el Service Metadata
Document expone toda la descripción del Entity Data Model (EDM en adelante)
mediante la opción $metadata.
xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
m:DataServiceVersion="2.0">
<Schema Namespace="ODataDemo"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" Nullable="true"
m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text"
m:FC_KeepInContent="false" />
<Property Name="Description" Type="Edm.String" Nullable="true"
m:FC_TargetPath="SyndicationSummary" m:FC_ContentKind="text"
m:FC_KeepInContent="false" />
<Property Name="ReleaseDate" Type="Edm.DateTime" Nullable="false"
/>
<Property Name="DiscontinuedDate" Type="Edm.DateTime"
Nullable="true" />
<Property Name="Rating" Type="Edm.Int32" Nullable="false" />
<Property Name="Price" Type="Edm.Decimal" Nullable="false" />
<NavigationProperty Name="Category"
Relationship="ODataDemo.Product_Category_Category_Products"
FromRole="Product_Category" ToRole="Category_Products" />
<NavigationProperty Name="Supplier"
Relationship="ODataDemo.Product_Supplier_Supplier_Products"
FromRole="Product_Supplier" ToRole="Supplier_Products" />
</EntityType>
<EntityType Name="Category">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" Nullable="true"
m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text"
m:FC_KeepInContent="true" />
<NavigationProperty Name="Products"
Relationship="ODataDemo.Product_Category_Category_Products"
FromRole="Category_Products" ToRole="Product_Category" />
</EntityType>
<EntityType Name="Supplier">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false" />
<Property Name="Name" Type="Edm.String" Nullable="true"
m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text"
m:FC_KeepInContent="true" />
<Property Name="Address" Type="ODataDemo.Address" Nullable="false"
/>
<Property Name="Concurrency" Type="Edm.Int32" Nullable="false"
ConcurrencyMode="Fixed" />
<NavigationProperty Name="Products"
Relationship="ODataDemo.Product_Supplier_Supplier_Products"
FromRole="Supplier_Products" ToRole="Product_Supplier" />
10 Comenzando con OData
</EntityType>
<ComplexType Name="Address">
<Property Name="Street" Type="Edm.String" Nullable="true" />
<Property Name="City" Type="Edm.String" Nullable="true" />
<Property Name="State" Type="Edm.String" Nullable="true" />
<Property Name="ZipCode" Type="Edm.String" Nullable="true" />
<Property Name="Country" Type="Edm.String" Nullable="true" />
</ComplexType>
<Association Name="Product_Category_Category_Products">
<End Role="Product_Category" Type="ODataDemo.Product"
Multiplicity="*" />
<End Role="Category_Products" Type="ODataDemo.Category"
Multiplicity="0..1" />
</Association>
<Association Name="Product_Supplier_Supplier_Products">
<End Role="Product_Supplier" Type="ODataDemo.Product"
Multiplicity="*" />
<End Role="Supplier_Products" Type="ODataDemo.Supplier"
Multiplicity="0..1" />
</Association>
<EntityContainer Name="DemoService"
m:IsDefaultEntityContainer="true">
<EntitySet Name="Products" EntityType="ODataDemo.Product" />
<EntitySet Name="Categories" EntityType="ODataDemo.Category" />
<EntitySet Name="Suppliers" EntityType="ODataDemo.Supplier" />
<AssociationSet Name="Products_Category_Categories"
Association="ODataDemo.Product_Category_Category_Products">
<End Role="Product_Category" EntitySet="Products" />
<End Role="Category_Products" EntitySet="Categories" />
</AssociationSet>
<AssociationSet Name="Products_Supplier_Suppliers"
Association="ODataDemo.Product_Supplier_Supplier_Products">
<End Role="Product_Supplier" EntitySet="Products" />
<End Role="Supplier_Products" EntitySet="Suppliers" />
</AssociationSet>
<FunctionImport Name="GetProductsByRating" EntitySet="Products"
ReturnType="Collection(ODataDemo.Product)" m:HttpMethod="GET">
<Parameter Name="rating" Type="Edm.Int32" Mode="In" />
</FunctionImport>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
El Service Metadata Document está descrito por EDM de forma que sea
independiente al formato en que se quiera exponer (JSON, Atom). Lo único que exige
es que se exponga a través de una interfaz HTTP. EDM está descrito en lenguaje XML
siguiendo la descripción de modelos del llamado lenguaje de definición de esquemas
conceptuales o Conceptual Schema Definition Language (CSDL en adelante).
Estas son las claves de la especificación OData ya que no comprometen la
estructura de datos a formatos propietarios sino que rigen la forma en que las
estructuras de entradas deben ser expuestas.
En la siguiente tabla podemos ver los diferentes tipos de recursos descritos en el
Entity Data Model.
Fundamentos de OData 11
Consumiendo datos a
través de OData
Para exponer una serie de recursos definidos bajo el modelo de datos EDM, en un
servicio de datos basado en REST y siguiendo las especificaciones OData, se deben
seguir unas convenciones en lo que respecta a la URI (Uniform Resource Indetifier). El
primer paso necesario para comprender el funcionamiento de OData es conocer dichas
convenciones por elementos.
El siguiente ejemplo representaría la consulta que nos permitiría obtener los dos
primeros Productos de la Categoria identificada a través de la clave primaria con valor
1 y ordenados por alfabéticamente por su nombre:
15
16 Comenzando con OData
Por ejemplo, para navegar por una entrada cualquiera, en nuestro caso la lista de
categorías con Id igual a 0, usaremos la siguiente dirección:
http://services.odata.org/OData/OData.svc/Categories(0)
<id>http://services.odata.org/OData/OData.svc/Categories(0)</id>
<title type="text">Food</title>
<updated>2010-04-23T13:22:49Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Category" href="Categories(0)" />
<link
rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related
18 Comenzando con OData
http://services.odata.org/OData/OData.svc/Categories(0)/Products
<id>http://services.odata.org/OData/OData.svc/Categories(0)/Produc
ts</id>
<updated>2010-04-23T13:32:45Z</updated>
<link rel="self" title="Products" href="Products" />
<entry>
<id>http://services.odata.org/OData/OData.svc/Products(0)</id>
<title type="text">Bread</title>
<summary type="text">Whole grain bread</summary>
<updated>2010-04-23T13:32:45Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Product" href="Products(0)" />
<link
rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related
/Category" type="application/atom+xml;type=entry" title="Category"
href="Products(0)/Category" />
<link
rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related
/Supplier" type="application/atom+xml;type=entry" title="Supplier"
Consumiendo datos a través de OData 19
href="Products(0)/Supplier" />
<category term="ODataDemo.Product"
scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/sche
me" />
<content type="application/xml">
<m:properties>
<d:ID m:type="Edm.Int32">0</d:ID>
<d:ReleaseDate m:type="Edm.DateTime">1992-01-
01T00:00:00</d:ReleaseDate>
<d:DiscontinuedDate m:type="Edm.DateTime" m:null="true"
/>
<d:Rating m:type="Edm.Int32">4</d:Rating>
<d:Price m:type="Edm.Decimal">2.5</d:Price>
</m:properties>
</content>
</entry>
</feed>
http://services.odata.org/OData/OData.svc/Categories(0)/$links/Products
<uri>http://services.odata.org/OData/OData.svc/Products(0)</uri>
</links>
http://services.odata.org/OData/OData.svc/Categories(0)/$links/Products/$
count
Sin embargo aún podemos sacar mucho más provecho a través de las opciones de
ordenado o de función como por ejemplo $top.
En la siguiente figura se observa el resultado de una consulta realizada sobre un
servicio hospedado en localhost, en la que se muestran los 3 primeros clientes
ordenados por el campo FirstName de manera descendente.
Figura 5.- Resultado de consulta que devuelve los tres primeros elementos
4.1.- $orderby
http://localhost:12560/AdventureWorksService.svc/Customer?$orderby=Fi
rstName asc
4.2.- $top
La opción $top devuelve las n primeras entradas indicadas por el valor $top=n.
El siguiente ejemplo devuelve los 5 productos con coste estándar más alto.
http://localhost:12560/AdventureWorksService.svc/Product?$orderby=Standar
dCost&$top=5
4.3.- $expand
Esta opción es especialmente útil para mostrar las relaciones de más de una Entrada.
Es decir, si por ejemplo quisiéramos mostrar una Entrada Customer y su Entrada
relacionada representada por CustomerAddress podríamos hacerlo mediante dos
consultas ejecutadas consecutivamente, o bien podríamos hacerlo en una sola mediante
la opción $expand.
El siguiente ejemplo ilustra la obtención del primer Customer ($top=1) con
CustomerAddress.
http://localhost:12560/AdventureWorksService.svc/Customer?$expand=Custome
rAddress&$top=1
Resultado:
<id>http://localhost:12560/AdventureWorksService.svc/Customer</id>
<updated>2010-04-26T08:03:08Z</updated>
<link rel="self" title="Customer" href="Customer" />
<entry>
<id>http://localhost:12560/AdventureWorksService.svc/Customer(1)</
id>
<title type="text"></title>
<updated>2010-04-26T08:03:08Z</updated>
22 Comenzando con OData
<author>
<name />
</author>
<link rel="edit" title="Customer" href="Customer(1)" />
<link
rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related
/CustomerAddress" type="application/atom+xml;type=feed"
title="CustomerAddress" href="Customer(1)/CustomerAddress">
<m:inline>
<feed>
<title type="text">CustomerAddress</title>
<id>http://localhost:12560/AdventureWorksService.svc/Customer(1)/C
ustomerAddress</id>
<updated>2010-04-26T08:03:08Z</updated>
<author>
<name />
</author>
<link rel="self" title="CustomerAddress"
href="Customer(1)/CustomerAddress" />
</feed>
</m:inline>
</link>
<link
rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related
/SalesOrderHeader" type="application/atom+xml;type=feed"
title="SalesOrderHeader" href="Customer(1)/SalesOrderHeader" />
<category term="AdventureWorksLT2008Model.Customer"
scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/sche
me" />
<content type="application/xml">
<m:properties>
<d:CustomerID m:type="Edm.Int32">1</d:CustomerID>
<d:NameStyle m:type="Edm.Boolean">false</d:NameStyle>
<d:Title>Mr.</d:Title>
<d:FirstName>Orlando</d:FirstName>
<d:MiddleName>N.</d:MiddleName>
<d:LastName>Gee</d:LastName>
<d:Suffix m:null="true" />
<d:CompanyName>A Bike Store</d:CompanyName>
<d:SalesPerson>adventure-works\pamela0</d:SalesPerson>
<d:EmailAddress>orlando0@adventure-
works.com</d:EmailAddress>
<d:Phone>245-555-0173</d:Phone>
<d:PasswordHash>L/Rlwxzp4w7RWmEgXX+/A7cXaePEPcp+KwQhl2fJL7w=</d:Pa
sswordHash>
<d:PasswordSalt>1KjXYs4=</d:PasswordSalt>
<d:rowguid m:type="Edm.Guid">3f5ae95e-b87d-4aed-95b4-
Consumiendo datos a través de OData 23
c3797afcb74f</d:rowguid>
<d:ModifiedDate m:type="Edm.DateTime">2001-08-
01T00:00:00</d:ModifiedDate>
</m:properties>
</content>
</entry>
</feed>
4.4.- $filter
Filtra las entradas por una expresión lógica, aritmética o de agrupación. Veremos
más detalles sobre las opciones de este filtro en la siguiente sección.
4.5.- $inlinecount
http://localhost:12560/AdventureWorksService.svc/Product?$filter=Standard
Cost gt 2000&$inlinecount=allpages
El resultado es el siguiente:
<id>http://localhost:12560/AdventureWorksService.svc/Product</id>
<updated>2010-04-26T10:15:30Z</updated>
<link rel="self" title="Product" href="Product" />
<m:count>5</m:count>
<entry>
…
http://localhost:12560/AdventureWorksService.svc/Product?$filter=Standard
Cost gt 2000&$inlinecount=allpages&$top=2
4.6.- $select
http://localhost:12560/AdventureWorksService.svc/Product(680)?$select=Nam
e,Color,StandardCost
Y su resultado será:
4.7.- $skip
Esta opción obvia las n primeras entradas indicadas por el valor $skip=n.
El siguiente URI devuelve los 5 productos con coste estándar más alto, obviando
los dos primeros.
http://localhost:12560/AdventureWorksService.svc/Product?$orderby=Standar
dCost&$top=5&$skip=2
Consumiendo datos a través de OData 25
4.8.- $skiptoken
Esta opción es especialmente útil junto a $orderby, ya que trabaja como un cursor
indicando a partir de qué valor del elemento o propiedad o de la clave debe retornar los
resultados. Es decir, supongamos el siguiente ejemplo:
http://localhost:12560/AdventureWorksService.svc/Customer?$orderby=FirstN
ame&$skiptoken='Yuping'
El resultado será las Entradas ordenada por FirstName desde el cliente llamado
Yuping hasta el final. En este caso se obvian todos los clientes cuyo nombre –
FirstName- se alfabéticamente anterior al valor del $skiptoken.
Operadores aritméticos
Add Suma /Products?$filter=Price add
5 gt 10
Sub Resta /Products?$filter=Price sub
5 gt 10
Mul Multiplicación /Products?$filter=Price mul
2 gt 2000
Div División /Products?$filter=Price div 2
gt 4
Mod Módulo /Products?$filter=Price mod
2 eq 0
Operadores de agrupamiento
() Agrupación /Products?$filter=(Price sub
5) gt 10
Además existen una serie de funciones para los operadores o funciones, específicos
para el tratamiento de:
Cadenas
Fechas
Expresiones matemáticas
De tipo
Las cuales podemos ver en las siguientes tablas, con un ejemplo asociado a cada uno de
ellos:
Tabla 4.- Funciones de cadena
Función Ejemplo
bool substringof(string http://services.odata.org/Northwind/Northwind.svc
p0, string p1) /Customers?$filter=substringof('Alfreds',
CompanyName) eq true
bool endswith(string http://services.odata.org/Northwind/Northwind.svc
p0, string p1) /Customers?$filter=endswith(CompanyName,
'Futterkiste') eq true
bool startswith(string http://services.odata.org/Northwind/Northwind.svc
p0, string p1) /Customers?$filter=startswith(CompanyName,
'Alfr') eq true
int length(string p0) http://services.odata.org/Northwind/Northwind.svc
/Customers?$filter=length(CompanyName) eq 19
int indexof(string p0, http://services.odata.org/Northwind/Northwind.svc
string p1) /Customers?$filter=indexof(CompanyName,
'lfreds') eq 1
Consumiendo datos a través de OData 27
Función Ejemplo
int day(DateTime p0) http://services.odata.org/Northwind/Northwind.svc
/Employees?$filter=day(BirthDate) eq 8
int hour(DateTime p0) http://services.odata.org/Northwind/Northwind.svc
/Employees?$filter=hour(BirthDate) eq 0
int minute(DateTime http://services.odata.org/Northwind/Northwind.svc
p0) /Employees?$filter=minute(BirthDate) eq 0
int month(DateTime http://services.odata.org/Northwind/Northwind.svc
p0) /Employees?$filter=month(BirthDate) eq 12
int second(DateTime http://services.odata.org/Northwind/Northwind.svc
p0) /Employees?$filter=second(BirthDate) eq 0
int year(DateTime p0) http://services.odata.org/Northwind/Northwind.svc
/Employees?$filter=year(BirthDate) eq 1948
Función Ejemplo
28 Comenzando con OData
Función Ejemplo
bool IsOf(type p0) http://services.odata.org/Northwind/Northwind.svc
/Orders?$filter=isof('NorthwindModel.Order')
bool IsOf(expresión p0, http://services.odata.org/Northwind/Northwind.svc
type p1) /Orders?$filter=isof(ShipCountry, 'Edm.String')
http://services.odata.org/OData/OData.svc/Products?$format=atom
http://services.odata.org/OData/OData.svc/Products?$format=json
http://services.odata.org/OData/OData.svc/Products?$format=xml
Así como varios entornos de desarrollo que soportan la creación de orígenes OData
como:
29
30 Comenzando con OData
Para ello basta con crear un nuevo proyecto ASP.NET Web Application para
hospedar el servicio. Dado que vamos a representar íntegramente la base de datos
AdventureWorksLT2008 lo primero que vamos a hacer es crear un modelo de entidades
a través de ADO.NET Entity Framework, añadiendo el elemento ADO.NET Entity
Data Model:
Figura 2.- Asistente para generación del modelo a partir de una base de datos
Paso a paso: creación de un servicio OData 31
metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;p
rovider=System.Data.SqlClient;provider connection string="Data
Source=LATITUDE-E6400;Initial Catalog=AdventureWorksLT2008;Integrated
Security=True"
Ahora hay que exponer el modelo a un servicio y para ello añadimos un nuevo
elemento WCF Data Service:
Por último configuramos el servicio para que haga uso del modelo de entidades
generado anteriormente:
Ejemplos multi-
plataforma de consumo
de OData
De la misma forma que tenemos herramientas para la generación de orígenes OData,
disponemos de múltiples herramientas de desarrollo a nuestro alcance para la
manipulación en el lado cliente de esos datos, como por ejemplo:
Nota: Podemos encontrar el código fuente de las librerías clientes para OData
de Silverlight 3.0 y .NET Framework 3.5 SP1 en el sitio
http://odata.codeplex.com, bajo licencia Apache 2.0.
35
36 Comenzando con OData
Para crear el cliente o proxy al servicio de datos podemos utilizar el propio Visual
Studio .NET 2008/2010:
La lógica que aplicaremos es la de llamar y obtener todos los productos bajo una
condición y ordenados por un campo, tal y como se muestra en el cuerpo del evento del
botón en el siguiente fragmento, que se corresponde con el código fuente completo de
la ventana WPF:
public MainWindow()
{
InitializeComponent();
m= new AdventureWorksLT2008Entities(
new
Uri("http://localhost:12560/AdventureWorksService.svc"));
}
dataGrid1.ItemsSource = query.ToList();
}
Otro de los clientes disponibles para consumir OData es Microsoft Excel 2010
utilizando su extensión gratuita PowerPivot. Lo único que necesitamos es
descargárnosla desde www.powerpivot.com e instalarla.
Para configurar un origen de datos OData basta con una ventana PowerPivot tal y
como se muestra a continuación:
Finalmente tendremos todos los datos de las Entradas repartidas en Hojas del libro
PowerPivot.
Una de las novedades que presentó Microsoft en el pasado MIX2010 que tuvo lugar
en Las Vegas fue la compatibilidad de cualquier base de datos SQL Azure para ser
expuesta como OData. Es decir que si hospedamos una base de datos SQL Azure
tendremos la opción de exponerla como servicio OData, y sin necesidad de tener que
crear el servicio, algo que si hacemos con otros modelo de datos y que hemos visto
anteriormente.
Lo único que debemos hacer es visitar OData Service Portal y seguir el asistente,
indicando el servidor y usuario de administración. Posteriormente seleccionamos la
base de datos que tenemos expuesta en Azure y habilitamos OData mediante la opción
Enable OData.
En ese momento se generará un EndPoint para el Servicio de Datos y podremos
seleccionar/crear los usuarios que tendrán permisos de acceso al EndPoint.
Ejemplos multi-plataforma de consumo de OData 45
6.- LINQPAD
Otro cliente disponible para trabajar con OData es LINQPad, versión 4. Para
empezar a consumir datos de un servicio OData basta con configurar la conexión
siguiendo los pasos explicados a continuación.
En primer lugar añadimos una nueva conexión y seleccionamos WCF Data Service
para establecer el contexto del origen:
46 Comenzando con OData
Y finalmente ejecutamos las consultas LINQ que queramos sobre dicho origen de
datos:
Ejemplos multi-plataforma de consumo de OData 47
Conclusiones y resumen
de OData
OData es sin duda una fuerte apuesta por parte de Microsoft para la manipulación
de datos a través de operaciones CRUD tipadas, construido sobre estándares de
Internet. Su futuro está en mano de los fabricantes/empresas, así como de la comunidad
que quiera adoptarlo bajo la promesa de código abierto –OSS (Open Source Software)-.
En este manual le hemos tratado de brindar una introducción suficiente como para dar
los primeros pasos en esta tecnología, con los conceptos teóricos suficientes, así como
con algunos ejemplos prácticos de uso de los que partir.
OData le resultará de gran utilidad en multitud de escenarios prácticos dentro de las
empresas y en arquitecturas distribuidas y para Internet.
Las tablas de referencia y algunas imágenes mostradas en este artículo han sido
extraídas de http://www.odata.org. En algunos casos se ha optado por la traducción
del contenido de algunas tablas mientras que en otros se ha optado por dejar los valores
en inglés originales para no crear confusiones y facilitar al lector la compresión de
términos utilizados por OData.
49
50 Comenzando con OData
· OData interoperability with .NET, Java, PHP, iPhone and more, en el blog de
interoperabilidad de Microsoft.
· Producing and consuming OData feeds: An end-to-end example, por Jon Udell
· Retrieving Data with the OData SDK for PHP, por Brian Swan
· Every SharePoint 2010 server is a Data Services server, por Pablo Castro
- En formato PDF
- Sin DRM
- Imprimible
- Busca en el contenido