11. Recetas por herramienta
curl
# comillas SIMPLES: en bash, "$filter" lo come la shell
curl -s -H "X-API-Key: TU_API_KEY" \
'https://TU-HOST/synergy-server/jwt-odata-key/o_customers?$select=code,name&$filter=active%20eq%20true&$top=10'
Si preferís no escapar los espacios a mano, usá --get --data-urlencode:
curl -s -H "X-API-Key: TU_API_KEY" --get \
--data-urlencode '$filter=contains(name,'"'"'molinos'"'"')' \
--data-urlencode '$expand=Localidad($select=name)' \
'https://TU-HOST/synergy-server/jwt-odata-key/o_customers'
Postman
- Importá
synergy-odata.postman_collection.json. - En la colección, pestaña Variables, completá
serviceRootyapiKey. Si vas por JWT, completá ademásuser,passwordeidClient. - Para JWT: ejecutá primero Autenticación → Obtener token. El token se guarda solo en la variable
token; el resto de los requests ya lo usan. - Empezá por Descubrimiento → Documento de servicio para ver tus entidades reales y reemplazar
o_customersen el resto.
Excel
No sirve Datos → Desde fuente OData. Ese conector no permite agregar headers HTTP, y esta API necesita X-API-Key o Authorization. Hay que ir por Power Query, que es igual de simple una vez que sabés el camino.
- Datos → Obtener datos → Desde otras fuentes → Consulta en blanco.
- En el editor: Inicio → Editor avanzado.
- Pegá el código de abajo, ajustá las dos primeras líneas y aceptá.
- Si pide credenciales, elegí Anónimo: la autenticación va en el header, no en el diálogo.
let
ServiceRoot = "https://TU-HOST/synergy-server/jwt-odata-key/",
ApiKey = "TU_API_KEY",
Fuente = OData.Feed(
ServiceRoot,
null,
[
Headers = [ #"X-API-Key" = ApiKey ],
Implementation = "2.0"
]
)
in
Fuente
Eso te deja el navegador con todas las entidades. Para traer una consulta concreta —con filtros y relacionados, que es mucho más rápido que bajar todo y filtrar en Excel—:
let
ServiceRoot = "https://TU-HOST/synergy-server/jwt-odata-key/",
ApiKey = "TU_API_KEY",
Respuesta = Json.Document(
Web.Contents(
ServiceRoot,
[
RelativePath = "o_customers",
Query = [
#"$select" = "code,name,city_code",
#"$filter" = "active eq true",
#"$expand" = "Localidad($select=name)",
#"$top" = "1000"
],
Headers = [ #"X-API-Key" = ApiKey ]
]
)
),
Filas = Respuesta[value],
Tabla = Table.FromRecords(Filas)
in
Tabla
El archivo power-query-odata.pq trae estas consultas más la variante con JWT y una función que sigue el @odata.nextLink para traer más de una página.
Power BI
Mismo camino que Excel y por el mismo motivo: Obtener datos → Consulta en blanco → Editor avanzado con el código de arriba. Una vez cargadas dos o más entidades relacionadas, Power BI lee los <ReferentialConstraint> del $metadata y propone las relaciones del modelo solo; conviene revisarlas en Modelo → Administrar relaciones antes de armar los visuales.
Para una entidad grande, filtrá en la URL con $filter y $select en vez de cargar todo y filtrar en Power BI: el servidor pagina de 1000 en 1000 y traer una tabla completa puede llevar muchas vueltas.
Python
Con requests, sin librerías de OData:
import requests
ROOT = "https://TU-HOST/synergy-server/jwt-odata-key/"
H = {"X-API-Key": "TU_API_KEY", "Accept": "application/json"}
def paginar(url, params=None):
while url:
r = requests.get(url, headers=H, params=params, timeout=60)
r.raise_for_status()
cuerpo = r.json()
filas = cuerpo.get("value", [])
if not filas:
break
for fila in filas:
yield fila
url, params = cuerpo.get("@odata.nextLink"), None # el nextLink ya trae todo
for c in paginar(ROOT + "o_customers", {
"$select": "code,name",
"$filter": "active eq true",
"$expand": "Localidad($select=name)"}):
print(c["code"], c["name"], (c.get("Localidad") or {}).get("name"))
El script completo está en ejemplo_odata.py: recorre el documento de servicio, baja el $metadata y lista una entidad con filtros.
C# / .NET
Con Simple.OData.Client, que lee el $metadata y tipa las consultas:
var settings = new ODataClientSettings(new Uri("https://TU-HOST/synergy-server/jwt-odata-key/"));
settings.BeforeRequest = req => req.Headers.Add("X-API-Key", "TU_API_KEY");
var client = new ODataClient(settings);
var clientes = await client
.For("o_customers")
.Select("code", "name")
.Filter("active eq true")
.Expand("Localidad")
.Top(50)
.FindEntriesAsync();