En bref
OData V4 est le protocole d'API standard sur S/4HANA, exposé via RAP et le Service Binding. Par rapport à OData V2 (en mode maintenance depuis 2018), il apporte du JSON natif et compact, des Actions / Functions typées, un Draft handling intégré, et une navigation profonde via $expand multi-niveaux. Pour une DSI, le message est simple : tout nouveau service doit être OData V4, et toute intégration critique en V2 doit avoir une trajectoire de migration planifiée.
Pendant près d'une décennie, OData V2 a été le pivot d'intégration de l'écosystème SAP : SAP Gateway, Fiori 1.x, applications mobiles, intégrations B2B, partenaires CRM, tout passait par les mêmes endpoints /sap/opu/odata/sap/<service>/. Le format Atom XML, les $expand limités à un niveau et l'absence d'actions typées ont fait leur travail le temps que SAP construise le successeur.
Depuis 2018, ce successeur s'appelle OData V4, standard OASIS, profondément intégré à RAP, et désormais le seul chemin recommandé pour exposer un Business Object S/4HANA. Cet article fait le tour, pour une DSI, des décisions techniques structurantes : quand basculer, comment exposer, comment sécuriser, et quel ROI attendre.
OData : qu'est-ce que c'est exactement ?
OData (Open Data Protocol) est un protocole REST standardisé par l'OASIS qui définit une grammaire commune pour interroger et modifier des données via HTTP. Il standardise ce que chaque équipe back-end réinvente sans cela : pagination ($top, $skip), filtrage ($filter), tri ($orderby), sélection de champs ($select), expansion d'entités liées ($expand), et même les opérations métier non-CRUD (Actions, Functions).
Sur S/4HANA, OData est le protocole d'intégration officiel entre la couche métier ABAP/RAP et le reste de l'écosystème : applications Fiori, intégrations BTP, partenaires externes, apps mobiles, batchs d'extraction temps réel. Toute donnée standard SAP ou tout Business Object spécifique correctement modélisé peut être exposé sous forme de service OData.
Différences V2 vs V4 : le tableau qui résume tout
Le saut conceptuel entre V2 et V4 est massif. V4 n'est pas une simple version mineure : c'est un protocole repensé en intégrant huit ans d'expérience opérationnelle.
| Critère | OData V2 | OData V4 |
|---|---|---|
| Sérialisation par défaut | Atom XML (JSON optionnel et verbeux) | JSON natif, compact, type-aware |
| $expand multi-niveaux | Limité (1 niveau pratique) | N niveaux + projection par niveau |
| Actions / Functions | Function Imports non typées | Actions et Functions typées avec parameters complexes |
| Draft Handling | Hors protocole (custom SAP) | Natif via Common.DraftRoot |
| Delta tokens | Non standardisé | Standardisé ($deltatoken) |
| Concurrency control | ETag manuel | ETag standardisé + If-Match |
| Standardisation | Microsoft / open | OASIS standard officiel |
| Implémentation SAP | SEGW + DPC/MPC (mode maintenance) | RAP + Service Binding (recommandé) |
| Statut SAP | Maintenance depuis 2018 | Standard depuis S/4HANA 1909 |
Le tableau parle de lui-même. Sur tout sujet structurant (sérialisation, navigation, actions, draft, concurrence), V4 fait progresser le protocole d'un cran. Pour une DSI, l'arbitrage n'est plus « est-ce qu'on bascule un jour ? » mais « comment cadencer la migration de nos services V2 historiques sans rompre la continuité métier ? ».
OData V4 sur S/4HANA via RAP
Sur S/4HANA, le chemin standard pour exposer un service OData V4 ne passe plus par la SEGW. Il passe par RAP. Le pipeline est le suivant :
- CDS Interface View qui modélise les données, voir notre guide CDS Views
- CDS Projection View qui ajoute les annotations
@UIet les champs exposés - Behavior Definition (BDEF) qui déclare le comportement transactionnel (CRUD, actions, draft)
- Service Definition qui sélectionne les Projection Views à exposer
- Service Binding de type
ODATA V4qui publie l'endpoint réel
L'endpoint généré est de la forme /sap/opu/odata4/sap/<service>/srvd_a2x/sap/<service>/0001/. Le métadonnées ($metadata) est généré automatiquement à partir des annotations CDS, aucun fichier d'annotations XML externe à maintenir, contrairement à V2.
Voici un exemple de payload OData V4 retourné par un appel GET /SalesOrder?$top=2&$expand=_Items&$select=SalesOrder,NetAmount :
{
"@odata.context": "$metadata#SalesOrder(SalesOrder,NetAmount,_Items())",
"@odata.metadataEtag": "W/\"20260518000000\"",
"value": [
{
"SalesOrder": "0000010234",
"NetAmount": 12450.00,
"@odata.editLink": "SalesOrder('0000010234')",
"_Items": [
{
"SalesOrder": "0000010234",
"ItemNumber": "00010",
"Material": "KH-PRESS-2000",
"Quantity": 2,
"NetAmount": 8200.00
},
{
"SalesOrder": "0000010234",
"ItemNumber": "00020",
"Material": "KH-SERVICE-INST",
"Quantity": 1,
"NetAmount": 4250.00
}
]
}
]
}
Performance : pourquoi JSON change tout
Le volume d'une réponse dépend notamment du format, des champs et des entités retournés. Pour une application Fiori, il est utile d'analyser le payload et les requêtes réseau avant de choisir une optimisation.
Mais le gain ne s'arrête pas au volume transporté. JSON est nativement parsé par les moteurs JavaScript des navigateurs modernes, pas de pipeline XML/DOM lourd. Le typage natif (nombres, booléens, dates ISO 8601) évite les conversions explicites. Et le $expand multi-niveaux de V4 permet de récupérer un graphe métier complet en un seul roundtrip réseau, là où V2 demandait trois ou quatre appels en cascade.
Une modernisation de service peut être l'occasion de revoir les requêtes, les données transmises et les usages de l'interface. La comparaison avant et après doit porter sur les mêmes scénarios et conditions de mesure.
Actions et Functions typées
OData V4 distingue clairement deux types d'opérations métier non-CRUD :
- Functions (HTTP GET, lecture seule) : calculer une valeur dérivée sans changer l'état du système. Exemples : simuler un prix, estimer une date de livraison, calculer un score de crédit.
- Actions (HTTP POST, transactionnelles) : déclencher une opération métier qui modifie l'état. Exemples : approuver une commande, soumettre un congé, lancer un calcul de paie.
Les deux acceptent des paramètres typés et structurés (entités complexes, collections) et retournent des valeurs typées. C'est un changement majeur par rapport aux Function Imports V2, dont les paramètres se limitaient à des types simples.
Sur Fiori Elements, les Actions apparaissent automatiquement comme boutons sur les Object Pages, annoter une action Approve dans la BDEF avec @UI.lineItem.position suffit à la voir surgir dans la barre d'outils, sans une ligne de code UI5.
Draft natif : l'autre rupture
Le concept de Draft, sauvegarder un enregistrement en cours de saisie sans l'activer définitivement, a été inventé par SAP pour Fiori, hors protocole OData V2. Cela impliquait des conventions maison, des entités draft annexes, et un travail d'intégration côté client lourd.
OData V4 intègre le concept au protocole via le vocabulary Common.DraftRoot et Common.DraftNode. Une entité annotée comme Draft expose automatiquement les actions Edit, Activate, Discard, et le client OData (Fiori Elements, SAPUI5, ou un client tiers compatible) sait nativement les invoquer.
RAP propose des mécanismes de gestion du Draft à configurer pour le Business Object. Les scénarios de saisie, les verrous et les conflits doivent être vérifiés avec les utilisateurs.
Sécurité : CSRF, OAuth 2.0 et bonnes pratiques
Un service OData V4 hérite des protections classiques de la stack SAP : authentification (Basic, SAML, OAuth, jeton SSO), autorisations (objets d'autorisation ABAP plus les DCL CDS), et protection CSRF.
Le jeton CSRF reste obligatoire pour toute opération non-GET. Le client récupère le token via un GET initial avec le header x-csrf-token: fetch, puis le réinjecte dans tous les POST, PUT, PATCH, DELETE suivants. C'est un mécanisme transparent pour Fiori et pour les SDK SAP, mais à implémenter explicitement quand le service est consommé par un client tiers.
Pour une exposition au-delà du périmètre interne (partenaire externe, app mobile non SAP, plateforme cloud tierce), le standard est OAuth 2.0. SAP supporte les flows Authorization Code, Client Credentials et SAML Bearer Assertion. Le configurateur OAuth de S/4HANA (transaction OA2C_CONFIG / WD pour SAP Gateway) déclare le client, gère les scopes et publie les endpoints token / autorisation. Le service OData V4 est alors protégé via un module d'authentification ICM.
Trois bonnes pratiques systématiquement recommandées en revue d'architecture :
- Toujours servir en HTTPS, même en interne, un OAuth en clair n'a aucun sens
- Cloisonner les services exposés en externe dans un Communication Scenario dédié, avec son propre Service Binding et ses propres scopes OAuth
- Logger les accès et superviser les anomalies de volume via SAP Web Dispatcher ou un API Manager BTP en amont
Cas de migration V2 → V4
La tentation, sur un parc de cinquante ou cent services V2, est de chercher une conversion automatique de la SEGW vers V4. SAP ne propose pas d'outil de ce type, et c'est une bonne chose : la conversion mécanique produirait un V4 qui ressemble à du V2 en JSON, sans tirer aucun bénéfice du protocole.
La trajectoire recommandée est différente :
- Inventorier les services V2 en production, classifier par criticité (Fiori critique, intégration partenaire, batch interne) et par fréquence d'usage
- Reconstruire les Business Objects sous-jacents en CDS Views + BDEF RAP, l'occasion de nettoyer le modèle métier au passage
- Exposer en V4 via un Service Binding, sur un nouvel endpoint, sans casser l'ancien
- Cohabiter avec les deux endpoints pendant la migration des consommateurs.
- Décommissionner l'ancien service V2 après vérification de l'absence d'usages et validation du plan de reprise.
La durée de la migration dépend du nombre de services, de leurs consommateurs et des contraintes d'exploitation. Une transition progressive permet d'organiser les validations et les adaptations sans imposer une bascule unique.
Questions fréquentes
Faut-il encore créer des services OData V2 sur S/4HANA ?
Non. Tout nouveau service doit être OData V4 via RAP. OData V2 est en mode maintenance depuis 2018 et n'est conservé que pour les apps Fiori legacy.
OData V4 est-il significativement plus performant qu'OData V2 ?
Les performances dépendent des requêtes, des volumes, du format et de l'environnement. Mesurez les échanges et le chargement sur les mêmes scénarios avant et après modification.
Le Draft handling OData V4 fonctionne-t-il sans RAP ?
Techniquement oui, mais le coût d'implémentation manuel est rédhibitoire. RAP gère le Draft en quelques annotations BDEF.
Quelles différences pratiques entre Actions et Functions OData V4 ?
Une Function est en lecture seule (GET), retourne une valeur typée. Une Action est transactionnelle (POST), modifie l'état d'une ou plusieurs entités. Sur Fiori Elements, les Actions apparaissent comme boutons sur les Object Pages.
Quelle stratégie d'authentification pour un OData V4 exposé en externe ?
OAuth 2.0 avec un flow Authorization Code ou Client Credentials selon le cas. Configuration via OA2C_CONFIG, protection ICM, exposition idéalement derrière un API Manager BTP.
Comment migrer un service OData V2 existant vers V4 ?
Reconstruire ou adapter le Business Object et exposer un service V4, puis organiser la migration des consommateurs. Décommissionner l'ancien service après vérification de ses usages et de ses dépendances.
Vos services OData V2 freinent vos projets Fiori et vos intégrations partenaires ?
Audit de votre paysage OData, plan de migration V2 → V4 et accompagnement Service Binding RAP.
Discuter de votre stratégie OData V4