[badge:OData v4|info]
Přehled
OData v4 API poskytuje standardizované rozhraní RESTful pro dotazování a přístup k datům ze všech entit v systému. OData (Open Data Protocol) je standard OASIS, který definuje osvědčené postupy pro vytváření a využívání REST API.
Základní URL pro všechny požadavky OData je:
`{HOSTNAME}/api/odata/{companyId}`
Integrace s PowerBI
OData v4 API lze použít přímo v PowerBI a dalších nástrojích business intelligence, které podporují OData feedy. To vám umožní vytvářet sestavy a řídicí panely pomocí vašich dat bez vlastních integrací.
V PowerBI vyberte **Získat data** → **OData**
Zadejte URL OData: `{HOSTNAME}/api/odata/{companyId}`
Po zobrazení výzvy k ověření vyberte **Základní** ověření
Zadejte uživatelské jméno: `api` a heslo: váš API klíč
Vyberte entity (tabulky), které chcete importovat
**Je vyžadován API klíč**
Před použitím OData feedu musíte vygenerovat API klíč. [navigate:/apiKeys|Vygenerujte API klíč zde|key]
Klíčové koncové body
| Koncový bod | Popis |
|---|---|
GET /api/odata/{companyId} | Servisní dokument se seznamem všech dostupných sad entit |
GET /api/odata/{companyId}/$metadata | EDMX metadatový dokument popisující všechny entity, vlastnosti a vztahy |
GET /api/odata/{companyId}/{entityName} | Dotaz na kolekci entit s možnostmi dotazu OData |
GET /api/odata/{companyId}/{entityName}({id}) | Načtení jedné entity podle ID |
GET /api/odata/{companyId}/{entityName}/$count | Získání počtu entit odpovídajících dotazu |
GET /api/odata/{companyId}/{entityName}({id})/{navigationProperty}/$ref | Získání odkazů na související entity prostřednictvím navigační vlastnosti |
Podporované možnosti dotazu
| Možnost | Popis | Příklad |
|---|---|---|
$filter | Filtrování entit na základě podmínek | $filter=price gt 100 and active eq true |
$select | Výběr konkrétních polí k vrácení | $select=id,name,price |
$orderby | Řazení entit podle polí | $orderby=name asc,price desc |
$top | Omezení počtu výsledků | $top=10 |
$skip | Přeskočení určitého počtu entit (stránkování) | $skip=20 |
$expand | Zahrnutí souvisejících entit | $expand=category,supplier |
$count | Zahrnutí celkového počtu do odpovědi | $count=true |
$apply | Agregace a transformace dat | $apply=groupby((category),aggregate($count as total)) |
Příklady použití
Základní filtrování
GET /api/odata/{companyId}/products?$filter=price gt 100&$orderby=name&$top=10
Kolekční Lambda (any/all)
GET /api/odata/{companyId}/products?$filter=reviews/any(r: r/rating gt 4)
Rozšíření vztahů
GET /api/odata/{companyId}/products?$expand=category,supplier&$select=name,price
Agregace se seskupováním
GET /api/odata/{companyId}/products?$apply=groupby((category_id),aggregate($count as count,price with sum as total))
Řetězcové funkce
GET /api/odata/{companyId}/products?$filter=contains(name,'widget') and startswith(sku,'PRD')
Funkce data/času
GET /api/odata/{companyId}/orders?$filter=year(orderDate) eq 2024 and month(orderDate) ge 6
Matematické funkce a operátory
GET /api/odata/{companyId}/products?$filter=round(price) gt 100 and (price mul 0.8) lt 500
Odkazy na entity ($ref)
GET /api/odata/{companyId}/products(123)/category/$ref
Vrátí odkaz URL na související entitu kategorie.
Příklady kódu s ověřením
tab: JavaScript
// Použití HTTP Basic Authentication
const apiKey = 'your-api-key';
const auth = btoa('api:' + apiKey); // base64 encode
fetch('/api/odata/{companyId}/products?$top=10', {
headers: {
'Authorization': 'Basic ' + auth
}
})
.then(response => response.json())
.then(data => console.log(data.value));
---
tab: cURL
# Použití HTTP Basic Authentication (-u flag)
curl -u api:YOUR_API_KEY "/api/odata/{companyId}/products?\$filter=price gt 100&\$top=10"
# Nebo ručně zadejte hlavičku Authorization
curl -H "Authorization: Basic $(echo -n 'api:YOUR_API_KEY' | base64)" \
"/api/odata/{companyId}/products"
---
tab: Python
import requests
from requests.auth import HTTPBasicAuth
api_key = 'your-api-key'
url = '/api/odata/{companyId}/products'
# Použití HTTP Basic Authentication
response = requests.get(
url,
auth=HTTPBasicAuth('api', api_key),
params={'$filter': 'price gt 100', '$top': 10}
)
data = response.json()
print(data['value'])
---
tab: PowerShell
$apiKey = "your-api-key"
$credentials = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("api:$apiKey"))
$headers = @{
"Authorization" = "Basic $credentials"
}
$response = Invoke-RestMethod -Uri "/api/odata/{companyId}/products?`$top=10" -Headers $headers
$response.value
Ověření
Koncové body OData API vyžadují ověření pomocí jedné z následujících metod:
HTTP Basic Authentication [badge:Doporučeno pro OData|success]
Pro koncové body OData použijte HTTP Basic Authentication s uživatelským jménem api a vaším API klíčem jako heslem:
Authorization: Basic {base64(api:your-api-key)}
Příklad s curl:
curl -u api:YOUR_API_KEY \
/api/odata/{companyId}/products
[navigate:/apiKeys|Generování a správa API klíčů →|key]
Bearer Token (JWT)
Použijte JWT token získaný z přihlášení pro ověření UI:
Authorization: Bearer your-jwt-token
Hlavička API klíče
Alternativní metoda pomocí vlastní hlavičky (ne pro koncové body OData):
X-API-Key: your-api-key
Session Cookie
Automatické ověření založené na relaci pro požadavky prohlížeče:
Cookie: session=...
**Důležité**
Pro koncové body OData (`/api/odata/*`) je vyžadováno HTTP Basic Authentication. Uživatelské jméno musí být `api` a heslo je váš API klíč. Ostatní metody ověření fungují pro koncové body, které nejsou OData.
ETags pro ukládání do mezipaměti
OData API podporuje ETags (Entity Tags) pro efektivní ukládání do mezipaměti. ETags pomáhají klientům vyhnout se zbytečným přenosům dat, když se entity nezměnily.
Jak to funguje:
Server vrací hlavičku `ETag` s každou odpovědí
Klient odesílá hlavičku `If-None-Match` s hodnotou ETag u následných požadavků
Pokud se entita nezměnila, server vrátí **304 Not Modified** (žádné tělo)
Pokud se entita změnila, server vrátí **200 OK** s aktualizovanými daty a novým ETag
Implementované funkce
- Koncový bod servisního dokumentu
- Koncový bod
$metadatas generováním EDMX - Anotace schopností v metadatech (FilterRestrictions, SortRestrictions atd.)
- Anotace FilterFunctions (oznamuje podporované funkce filtru)
- Anotace ApplySupported (oznamuje možnosti agregace)
- Dotazy na kolekce entit
- Načtení jedné entity podle ID
- Koncový bod
$count - Koncový bod
$refpro navigační vlastnosti (získání odkazů na entity) $filters operátory porovnání (eq,ne,gt,ge,lt,le)$filters logickými operátory (and,or,not)$filters matematickými operátory (add,sub,mul,div,mod)$filters řetězcovými funkcemi (contains,startswith,endswith,tolower,toupper,concat,substring,indexof,length,trim)$filters funkcemi extrakce data/času (year,month,day,hour,minute,second,quarter,week,dayofweek)$filters funkcemi ohraničení data (startOfYear,endOfYear,startOfMonth,endOfMonth,startOfDay,endOfDay,startOfHour,endOfHour)$filters matematickými funkcemi (round,floor,ceiling)$filters operátory lambda kolekce (any,all) — plně implementováno s podporou vnoření$selectpro projekci polí$orderbypro řazení$toppro omezení výsledků$skippro stránkování$expandpro vztahy (základní)$countinline v dotazech$applys agregačními transformacemi$applys transformacemi groupby- Agregační funkce:
count,sum,avg,min,max - Formát odpovědi OData v4 s
@odata.context - Správné hlavičky OData (
OData-Version,Content-Type) - ETags pro efektivní ukládání do mezipaměti
- Podmíněný GET
If-None-Match(vrací 304 Not Modified)
Chybějící funkce (budoucí implementace)
Následující funkce ještě nejsou implementovány:
- `$search` — Fulltextové vyhledávání (parsováno, ale neprovedeno)
- `$filter` s geo funkcemi (`geo.distance`, `geo.intersects` atd.)
- Pokročilé transformace `$apply` (`filter`, `compute`, `concat`, `expand`)
- `$compute` — Vypočítané vlastnosti
- `$expand` s vnořenými možnostmi (např. `$expand=category($select=name)`)
- `$levels` — Rekurzivní hierarchie
- `$format` — Explicitní specifikace formátu (vždy vrací JSON)
- `POST` — Vytvoření nových entit
- `PATCH` — Aktualizace entit
- `PUT` — Nahrazení entit
- `DELETE` — Odstranění entit
- `$batch` — Dávkové požadavky
- Sledování změn — `$deltatoken`
- Importy funkcí a importy akcí
- `If-Match` — Optimistická kontrola souběžnosti (ETags pouze pro ukládání do mezipaměti)
- Stránkování řízené serverem s `@odata.nextLink`
Osvědčené postupy
- Použijte
$selectk vyžádání pouze polí, která potřebujete - Implementujte stránkování pomocí
$topa$skippro velké datové sady - Použijte
$filterke snížení přenosu dat namísto filtrování na straně klienta - Využijte ETags a
If-None-Matchpro efektivní ukládání do mezipaměti - Použijte
$applypro agregace na straně serveru namísto agregace na straně klienta - Zkontrolujte koncový bod
$metadataa zjistěte dostupné entity a jejich vlastnosti