<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Programmation système</title>
		<link>https://www.developpez.net/forums/</link>
		<description />
		<language>fr</language>
		<lastBuildDate>Mon, 01 Jun 2026 21:05:10 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Programmation système</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>Vos pull requests slop vibe-codées ne sont pas les bienvenues</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182666&amp;goto=newpost</link>
			<pubDate>Mon, 16 Mar 2026 11:28:32 GMT</pubDate>
			<description>*Vos pull requests slop...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Vos pull requests slop vibe-codées ne sont pas les bienvenues, car les outils de codage basés sur l'IA posent un nouveau problème aux responsables de projets open source, par Sam Saffron</font></b> <br />
<br />
En tant que développeurs et responsables de grands projets open source, nous constatons que les outils de codage basés sur l’IA créent un nouveau problème pour les mainteneurs open source.<br />
<br />
Les assistants IA tels que GitHub Copilot, Cursor, Codex et Claude peuvent désormais générer des centaines de lignes de code en quelques minutes. C’est certes très utile, mais cela a une conséquence inattendue : la révision du code généré par une machine est très coûteuse.<br />
<br />
Le problème central : les outils d'IA ont rendu la génération de code peu coûteuse, mais ils n'ont pas rendu la révision de code peu coûteuse. Chaque PR incomplète accapare l'attention du responsable de maintenance, qui pourrait être consacrée à des contributions prêtes à être fusionnées.<br />
<br />
Chez Discourse, nous constatons déjà que ce phénomène s'accélère au sein de notre communauté de contributeurs. L'année prochaine, tous les ingénieurs chargés de la maintenance de projets open source seront confrontés au même défi.<br />
<br />
Nous avons besoin d’un cadre plus clair pour les contributions assistées par l’IA, qui tienne compte de la réalité du temps limité dont disposent les responsables de maintenance.<br />
<br />
Un système binaire fonctionne extrêmement bien dans ce contexte. D’un côté, il y a les prototypes qui se contentent de démontrer une idée. De l’autre, il y a les PR prêtes à être révisées qui respectent les directives de contribution du projet et sont prêtes à être examinées par un humain.<br />
<br />
<b>L'absence d'étiquetage et de règles appropriés est néfaste pour l'écosystème logiciel.</b><br />
<br />
Les nouveaux outils permettent de créer très facilement un ensemble de modifications et de le lancer par-dessus la barrière. Cela peut introduire un système pervers où les mainteneurs de projet consacrent des efforts disproportionnés à réviser du code généré par l'IA de qualité inégale, qui a pris quelques secondes aux contributeurs à créer et qui prendra désormais de nombreuses heures à réviser.<br />
<br />
Cela peut être frustrant, chronophage et démotivant. D'un côté, il y a un contributeur qui a passé quelques minutes à jouer avec des invites d'IA ; de l'autre, un ingénieur qui doit passer de nombreuses heures, voire des jours, à déchiffrer une intelligence étrangère.<br />
<br />
Cette situation n'est pas viable et est extrêmement néfaste.<br />
<br />
<b><font size="3">Le prototype</font></b><br />
<br />
Les agents de codage IA tels que Claude Code, Codex, Cursor CLI et bien d'autres ont ouvert la voie à la livraison d'un « nouveau type » de jeu de modifications : le prototype.<br />
<br />
Le prototype est une démo en direct. Il ne respecte pas les normes de codage d’un projet. Ce n’est pas du code dont vous vous portez garant ou dont vous assurez la qualité. Il manque de tests, peut contenir des failles de sécurité et entraînerait très probablement une dette technique énorme s’il était fusionné tel quel.<br />
<br />
Cela dit, c’est une démo vivante qui peut aider à rendre une idée plus concrète. C’est aussi extrêmement amusant.<br />
<br />
Considérez-le comme un plateau de tournage enchanteur.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674983d1773667020/general-developpement/programmation-systeme/vos-pull-requests-slop-vibe-codees-ne-bienvenues/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 52585
Taille : 161,2 Ko"  style="float: CONFIG" /><br />
<i>Considérez les PR de prototype comme des plateaux de tournage</i></div><br />
Les prototypes, en particulier sur des projets tels que Discourse où des outils d’aide à la création existent, sont incroyablement faciles à explorer à l’aide d’outils comme dv.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">% dv new my-experiment
% dv branch my-amazing-prototype
% dv ls
total 1
* my-amazing-prototype Running 1 minute ago http://localhost:4200

# finally visit http://localhost:4200 to see in action</pre></td></tr></table></code><hr />
</div><br />
<br />
Les prototypes sont d’excellents vecteurs pour explorer des idées. En fait, vous pouvez livrer plusieurs prototypes qui démontrent des solutions complètement différentes à un même problème, ce qui aide à choisir la meilleure approche.<br />
<br />
Les prototypes, les démos vidéo et les maquettes visuelles simples sont d’excellents compagnons. Le prototype a l’avantage de vous permettre de jouer avec et d’explorer correctement le comportement d’un changement. La vidéo est plus rapide à consommer. Parfois, vous voudrez peut-être les utiliser tous.<br />
<br />
Si vous pratiquez le « vibe coding » et le prototypage, il y a quelques règles claires que vous devriez suivre<br />
<br />
1. N'envoyez pas de pull requests (pas même de brouillons), mais utilisez plutôt des branches pour partager votre code généré par la machine.<br />
<br />
2. Partagez une courte vidéo ET/OU des liens vers une branche ET/OU des extraits de code particulièrement intéressants tirés du prototype dans des tickets ou des messages sur le forum.<br />
<br />
3. Jouez cartes sur table, expliquez que vous exploriez une idée à l’aide d’outils d’IA, afin que les gens comprennent la nature du changement que vous partagez.<br />
<br />
Peut-être aurez-vous de la chance et votre idée sera-t-elle adoptée ; peut-être que quelqu’un d’autre voudra investir du temps pour transformer un prototype en pull request de production.<br />
<br />
<b><font size="3">Quand faut-il prototyper ?</font></b><br />
<br />
Le prototypage est amusant et incroyablement accessible. Tout le monde peut s'y mettre en utilisant des environnements de développement locaux, ou même des environnements de développement sur le cloud tels que Jules, Codex Cloud, Cursor Cloud, Lovable, v0 et bien d'autres encore.<br />
<br />
Cela abaisse considérablement le seuil d'accès au prototypage. Les chefs de produit peuvent prototyper, les PDG peuvent prototyper, les designers peuvent prototyper, etc.<br />
<br />
Cependant, ce nouveau plaisir soulève une série de questions que vous devriez explorer avec votre équipe.<br />
<br />
- Quand un prototype est-il approprié ?<br />
- Que pensent les designers des prototypes ?<br />
- Sont-ils source de distraction ? (les liens vers le code source sont-ils trop tentants) ?<br />
- Nuisent-ils à la créativité humaine ?<br />
- Comment devrions-nous nommer et partager les prototypes ?<br />
- Un prototype permet-il à une idée de passer devant les autres ?<br />
<br />
Lorsque vous introduisez le prototypage dans votre entreprise, vous devez aborder ces questions avec soin et parvenir à un consensus interne, sinon vous risquez de créer de profondes divisions et du ressentiment au sein de l’équipe.<br />
<br />
<b><font size="3">L'intérêt du prototype</font></b><br />
<br />
Les prototypes, à quoi servent-ils ? À beaucoup de choses, c'est certain.<br />
<br />
Je trouve les prototypes incroyablement utiles dans mes pratiques de développement au quotidien.<br />
<br />
- C'est comme un Grep sous stéroïdes. J'adore le fait que les prototypes servent souvent à parcourir notre vaste base de code pour isoler toutes les petites zones qui pourraient nécessiter une modification afin d'aboutir à un changement.<br />
<br />
- J'adore communiquer par des paragraphes, mais je suis aussi quelqu'un qui communique de manière visuelle. J'adore la facilité avec laquelle un prototype bien construit peut communiquer une idée de conception que j'ai, même si je ne suis pas très doué avec Figma.<br />
<br />
- J'adore le fait qu'il y ait quelque chose avec quoi jouer. Cela fait souvent ressortir de nombreuses préoccupations qui auraient pu passer inaperçues dans un cahier des charges. Le meilleur prototype est celui qui est testé ; pendant le test, on découvre de nombreux petits détails qu'il est tout simplement impossible de deviner à l'avance.<br />
<br />
- Le code farfelu généré par les LLM m'intéresse souvent ; il peut parfois remettre en question certaines de mes idées.<br />
<br />
<b><font size="3">Le prototype : guide de survie du mainteneur</font></b><br />
<br />
Malheureusement, au fil de l’année, je m’attends à ce que de nombreux projets open source reçoivent beaucoup de PR au stade de prototype. Tout le monde n’aura pas lu cet article de blog, ni même ne sera d’accord avec lui.<br />
<br />
En tant que mainteneur chargé de gérer les contributions externes :<br />
<br />
- Protégez-vous et protégez votre temps. Limitez la durée des premières revues des ensembles de modifications volumineux ; concentrez-vous sur le fait de déterminer s’il s’agit d’un code « intuitif » plutôt que de laisser 100 commentaires sur du code généré par une machine qui n’a pris que quelques minutes à produire.<br />
<br />
- Élaborez un code de conduite pour gérer les prototypes se faisant passer pour des PR. Renvoyez les contributeurs vers les directives de contribution, offrez-leur un autre moyen d’expression. « Je ferme cette PR, mais c’est intéressant, rendez-vous sur notre forum/nos tickets pour en discuter. »<br />
 <br />
- Ne vous sentez pas coupable de fermer une PR de prototype codée à l’instinct et non révisée !<br />
<br />
<b><font size="3">La PR prête à être révisée</font></b><br />
<br />
Une PR prête à être révisée correspond aux PR traditionnelles que nous soumettons.<br />
<br />
Nous avons révisé tout le code généré par une machine et nous en garantissons l’intégralité. Nous avons exécuté les tests et, tout comme les tests, nous apprécions la structure du code ; nous avons lu attentivement chaque ligne de code et nous nous sommes également assurés que la PR respecte les directives du projet.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674984d1773667025/general-developpement/programmation-systeme/vos-pull-requests-slop-vibe-codees-ne-bienvenues/2.jpg/" border="0" alt="Nom : 2.jpg
Affichages : 1812
Taille : 205,1 Ko"  style="float: CONFIG" /><br />
<i>Les PR sont censées être des créations abouties, prêtes à être examinées par des humains</i></div><br />
Tout le code farfelu généré par les agents en cours de route a été corrigé, et nous sommes heureux d’apposer notre propre marque sur le code.<br />
<br />
Les projets ont généralement un ensemble de règles strictes concernant la qualité du code, son organisation, les tests et bien plus encore.<br />
<br />
Nous avons peut-être utilisé l’aide de l’IA pour générer une PR prête à être révisée, mais fondamentalement, cela n’a pas d’importance : nous garantissons le code et nous nous portons garants de sa conformité à la fois avec notre marque et avec les directives du projet.<br />
<br />
La distance entre un prototype et une PR prête à être révisée peut être trompeusement grande. Il peut falloir des jours de travail d'ingénierie pour prendre un prototype complexe et le rendre prêt pour la production.<br />
<br />
Cette grande distance a également été évoquée par Andrej Karpathy dans le podcast Dwarkesh.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Pour certains types de tâches, de travaux, etc., il existe un écart très important entre la démo et le produit : la démo est très facile, mais le produit est très difficile.<br />
<br />
…<br />
<br />
Par exemple, en génie logiciel, je pense que cette caractéristique existe bel et bien. Pour beaucoup de codage « à l'instinct », ce n'est pas le cas. Mais si vous écrivez du code destiné à la production, cette caractéristique devrait exister, car toute erreur peut entraîner une faille de sécurité ou quelque chose de ce genre.
			
		<hr />
	</div>
</div>Une enquête Veracode a révélé que seulement 55 % des tâches de génération aboutissaient à un code sécurisé.<br />
<br />
Nos modèles s’améliorent de jour en jour, et tout dépend en réalité d’une quantité énorme de paramètres, mais le message central selon lequel les LLM peuvent générer et génèrent effectivement du code non sécurisé reste valable.<br />
<br />
<b><font size="3">À propos de l’intelligence extraterrestre</font></b><br />
<br />
La cause profonde de l’écart entre les directives du projet et un prototype est l’intelligence extraterrestre de l’IA.<br />
<br />
Beaucoup d’ingénieurs que je connais se répartissent en deux camps : d’un côté, ceux qui trouvent cette nouvelle classe de LLM intelligente, révolutionnaire et incroyablement performante ; de l’autre, ceux qui considèrent tout le contenu généré par les LLM comme « les habits neufs de l’empereur », le code qu’ils produisent étant « nu », fondamentalement défectueux et toxique.<br />
<br />
J’aime penser que ces nouveaux systèmes ne sont ni l’un ni l’autre. J'aime considérer cette nouvelle catégorie d'intelligence comme une « intelligence extraterrestre ». Elle est à la fois incroyablement bonne et incroyablement mauvaise, exactement au même moment.<br />
<br />
Qualifier les LLM de « stagiaires super compétents » ou leur attribuer toute autre analogie humaine est erroné. Ces systèmes sont des extraterrestres, et plus tôt nous l'accepterons, plus tôt nous serons capables de naviguer dans la complexité qu'entraîne l'injection d'une intelligence extraterrestre dans notre processus d'ingénierie.<br />
<br />
<b><font size="3">Tirer parti des atouts de l'intelligence artificielle : le prototype</font></b><br />
<br />
Au cours des derniers mois, j'ai beaucoup expérimenté avec des agents IA. L'un des projets dont je suis particulièrement fier est dv. Il s'agit d'un orchestrateur de conteneurs pour Discourse, qui facilite l'utilisation de divers agents IA avec Discourse.<br />
<br />
Je lance souvent plusieurs environnements Discourse complets et distincts, destinés à être jetés, sur mes machines afin d'explorer différentes fonctionnalités. Ce type d'outils est idéal pour créer des prototypes d'ingénierie d'ambiance.<br />
<br />
Il est intéressant de noter que dv a été principalement construit à l’aide d’agents IA avec très peu d’intervention humaine ; une partie du code n’est pas tout à fait au niveau, mais contrairement à Discourse ou à bon nombre des autres joyaux open source que je maintiens, il s’agit d’un projet ludique.<br />
<br />
Pour en revenir au sujet, dv s’est révélé être une excellente usine à prototypes sur Discourse. Cela a été formidable pour moi. J’ai pu explorer de nombreuses idées tout en rattrapant mon retard dans mes e-mails et mes discussions sur divers sites Discourse.<br />
<br />
<b><font size="3">À propos de l'interdiction des contributions IA, des prototypes et autres</font></b><br />
<br />
Tout d'abord, vous devez respecter les règles de tout projet auquel vous contribuez ; recherchez-les et lisez-les avant de contribuer. Par exemple : Cloud Hypervisor interdit le code généré par l'IA pour éviter les risques liés aux licences.<br />
<br />
Cela dit, il existe une tendance chez de nombreux développeurs à bannir l'IA. Certains vont jusqu'à dire « L'IA n'est pas la bienvenue ici », trouvez un autre projet.<br />
<br />
Cela me semble extrêmement contre-productif et fondamentalement inapplicable. De toute façon, une grande partie du code généré par l’IA est impossible à distinguer du code humain. On peut généralement repérer un prototype qui se fait passer pour une pull request humaine, mais une véritable pull request créée par un humain avec l’aide de l’IA peut être impossible à distinguer.<br />
<br />
Les nouveaux outils LLM peuvent être utilisés de multiples façons, allant de simples revues de code et de simples renommages au sein d’un fichier, jusqu’à la mise en place d’une architecture de jeux de modifications.<br />
<br />
Compte tenu de l’énorme désordre et de la grande diversité qui règnent ici, je pense que l’approche la plus saine consiste à définir des attentes claires. Si je soumets une PR, elle doit correspondre à mon image de marque et contenir du code dont je me porte garant.<br />
<br />
En tant qu’ingénieurs, il est de notre devoir d’étiqueter correctement nos modifications. Notre modification est-elle prête pour une révision humaine ou s’agit-il simplement d’une exploration ludique de l’espace du problème ?<br />
<br />
<b><font size="3">Pourquoi est-ce important ?</font></b><br />
<br />
La révision humaine du code devient de plus en plus un goulot d'étranglement majeur dans l'ingénierie logicielle. Nous devons respecter le temps des autres et protéger nos propres marques d'ingénierie.<br />
<br />
Les prototypes sont amusants, ils peuvent nous en apprendre beaucoup sur un domaine problématique. Mais lorsqu'il s'agit d'envoyer des contributions à un projet, traitez tout le code comme s'il s'agissait de votre propre code, apposez votre marque de propriété et d'approbation sur tout ce que vous construisez, et n'envoyez ensuite qu'une PR dont vous vous portez garant.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://samsaffron.com/archive/2025/10/27/your-vibe-coded-slop-pr-is-not-welcome" target="_blank">Your vibe coded slop PR is not welcome</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cet avis est crédible ou pertinent ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://alm.developpez.com/actu/378898/Au-coeur-du-massacre-des-Pull-Requests-PR-des-logiciels-open-source-OSS-sur-GitHub-par-Kush-Creates/" target="_blank">Au cœur du massacre des Pull Requests (PR) des logiciels open source (OSS) sur GitHub,<br />
Par Kush Creates</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/376065/Le-Vibe-Coding-cree-des-codeurs-sans-cervelle-par-Namanyay-Goel/" target="_blank">Le Vibe Coding crée des codeurs sans cervelle, par Namanyay Goe</a><br />
<br />
:fleche: <a href="https://alm.developpez.com/actu/378864/Le-destin-du-petit-open-source-l-ere-des-petites-bibliotheques-a-faible-valeur-ajoutee-est-revolue-les-LLM-en-sont-le-coup-de-grace-par-Nolan-Lawson/" target="_blank">Le destin du « petit » open source : l'ère des petites bibliothèques à faible valeur ajoutée est révolue, les LLM en sont le coup de grâce, par Nolan Lawson</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p674983d1773667020/general-developpement/programmation-systeme/vos-pull-requests-slop-vibe-codees-ne-bienvenues/1.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p674984d1773667025/general-developpement/programmation-systeme/vos-pull-requests-slop-vibe-codees-ne-bienvenues/2.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>Sam Saffron</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182666/general-developpement/programmation-systeme/vos-pull-requests-slop-vibe-codees-ne-bienvenues/</guid>
		</item>
		<item>
			<title><![CDATA[Google lance l'API Developer Knowledge et le serveur MCP pour un accès direct à la documentation]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182020&amp;goto=newpost</link>
			<pubDate>Tue, 10 Feb 2026 07:07:32 GMT</pubDate>
			<description><![CDATA[*Google lance l'API Developer...]]></description>
			<content:encoded><![CDATA[<div><b><font size="4">Google lance l'API Developer Knowledge et le serveur MCP pour un accès direct à la documentation officielle de Google, offrant aux développeurs et aux outils d'IA un accès lisible par machine</font></b><br />
<br />
<b>Google lance l'API Developer Knowledge et le serveur MCP pour un accès direct à la documentation. Google a ouvert la préversion publique de son API Developer Knowledge et de son serveur Model Context Protocol (MCP), offrant aux développeurs et aux outils d'IA un accès en direct et lisible par machine à la documentation officielle des développeurs Google.</b><br />
<br />
Au lieu de s'appuyer sur des données d'entraînement obsolètes ou sur le web scraping, l'API Developer Knowledge fournit une source de vérité programmatique. Les développeurs peuvent rechercher et récupérer de la documentation dans Markdown, ce qui simplifie l'intégration avec les applications et les flux de travail. Parallèlement, le serveur Model Context Protocol (MCP), basé sur une norme ouverte, permet aux assistants IA et aux environnements de développement intégrés (IDE) de se connecter directement à la documentation de Google. Cette compatibilité s'étend à de nombreux outils d'IA et éditeurs de code populaires.<br />
<br />
Ces outils sont immédiatement disponibles pour tous les utilisateurs et développeurs dans le cadre de la préversion publique. Tout en utilisant l'ensemble de fonctionnalités actuel, les développeurs peuvent s'attendre à d'autres améliorations à venir. Google prévoit d'ajouter la prise en charge de contenus structurés, tels que des objets d'échantillons de code et des entités de référence API, élargissant ainsi le type de données accessibles. L'entreprise vise également à élargir le corpus de documentation et à réduire la latence de réindexation, garantissant ainsi une couverture plus rapide et plus complète à mesure que sa plateforme évolue.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/7wEGEAbMAbk?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Présentation de l'API Developer Knowledge et du serveur MCP</font></b><br />
<br />
À mesure que l'écosystème des outils de développement basés sur l'IA, des plateformes agentiques comme Antigravity aux interfaces de ligne de commande comme Gemini CLI, continue de s'étendre, un défi majeur se pose : comment garantir que ces modèles aient accès à la documentation la plus précise et la plus à jour possible ? Les grands modèles de langage (LLM) ne sont efficaces que dans le contexte qui leur est donné. Lorsqu'ils développent avec la technologie Google, les développeurs ont besoin que leurs assistants IA connaissent les dernières fonctionnalités de Firebase, les modifications les plus récentes de l'API Android et les meilleures pratiques actuelles pour Google Cloud.<br />
<br />
C'est pourquoi, Google annonce la préversion publique de l'API Developer Knowledge et de son serveur Model Context Protocol (MCP) associé. Ensemble, ces outils fournissent une passerelle canonique et lisible par machine vers la documentation officielle de Google destinée aux développeurs.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674090d1770711407/general-developpement/programmation-systeme/google-lance-l-api-developer-knowledge-serveur-mcp-acces-direct-documentation/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 5038
Taille : 58,7 Ko"  style="float: CONFIG" /></div><br />
<b>Qu'est-ce que l'API Developer Knowledge ?</b><br />
<br />
L'API Developer Knowledge est conçue pour être la source programmatique de référence pour la documentation publique de Google. Au lieu de s'appuyer sur des données d'entraînement potentiellement obsolètes ou sur un web scraping fragile, les développeurs peuvent désormais rechercher et récupérer les pages de documentation pour développeurs de Google au format Markdown.<br />
<br />
Voici les principales fonctionnalités :<br />
<br />
1. Couverture complète : accédez à la documentation de firebase.google.com, developer.android.com, docs.cloud.google.com, et plus encore.<br />
<br />
2. Recherche et récupération : trouvez les pages et extraits de documentation pertinents, puis récupérez l'intégralité du contenu Markdown.<br />
<br />
3. Actualité : pendant notre aperçu public, la documentation est réindexée dans les 24 heures suivant une mise à jour, ce qui garantit que vos outils restent à jour avec les dernières versions.<br />
<br />
<b>Alimenter les outils d'IA avec un serveur MCP</b><br />
<br />
Parallèlement à l'API, Google lance un serveur officiel Model Context Protocol (MCP). MCP est une norme ouverte qui permet aux assistants IA d'accéder facilement et en toute sécurité à des sources de données externes.<br />
<br />
En connectant le serveur Developer Knowledge MCP à votre IDE ou à votre assistant IA, vous lui donnez la possibilité de « lire » la documentation pour développeurs de Google. Cela permet d'obtenir des fonctionnalités plus fiables, telles que :<br />
<br />
- Conseils de mise en œuvre : « Quelle est la meilleure façon de mettre en œuvre les notifications push dans Firebase ? »<br />
<br />
- Dépannage : « Pouvez-vous consulter la documentation pour savoir comment corriger l'erreur ApiNotActivatedMapError dans l'API Maps ? »<br />
<br />
- Analyse comparative : « Comparez Google Cloud Run et Cloud Functions pour ce cas d'utilisation spécifique. »<br />
<br />
Le serveur est compatible avec un large éventail d'assistants et d'outils populaires, comme décrit dans la documentation.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/eur8dUO9mvE?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Vous pouvez commencer à utiliser l'API Developer Knowledge et le serveur MCP dès aujourd'hui en préversion publique.<br />
<br />
1. Créez une clé API : vous pouvez générer et restreindre une clé API spécifiquement pour l'API Developer Knowledge dans la page Credentials (Identifiants) de votre projet Google Cloud.<br />
<br />
2. Activez le serveur MCP : installez l'interface CLI Google Cloud, puis activez le serveur MCP via gcloud :<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">gcloud beta services mcp enable developerknowledge.googleapis.com --project=PROJECT_ID</span><br />
<br />
3. Configurez votre outil : mettez à jour le fichier de configuration de votre outil (tel que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">mcp_config.json</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">settings.json</span>). Vous trouverez les étapes de configuration détaillées pour divers assistants IA dans la documentation.<br />
<br />
<b>Source</b> : Google<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette annonce est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://sgbd.developpez.com/actu/379930/Dites-bonjour-a-GoogleSQL-Google-a-discretement-abandonne-le-nom-ZetaSQL-et-rebaptise-son-projet-open-source-d-analyse-et-d-analyse-syntaxique-SQL-GoogleSQL/" target="_blank">Dites bonjour à GoogleSQL : Google a discrètement abandonné le nom ZetaSQL et rebaptisé son projet open source d'analyse et d'analyse syntaxique SQL « GoogleSQL »</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/380011/OpenAI-lance-Frontier-une-plateforme-d-entreprise-qui-gere-les-agents-IA-de-differents-fournisseurs-avec-des-fonctionnalites-similaires-a-celles-des-RH-notamment-l-integration-et-les-autorisations/" target="_blank">OpenAI lance Frontier, une plateforme d'entreprise qui gère les agents IA de différents fournisseurs avec des fonctionnalités similaires à celles des RH, notamment l'intégration et les autorisations</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/365230/Anthropic-rend-open-source-le-Model-Context-Protocol-MCP-pour-l-integration-de-l-IA-avec-une-connectivite-universelle-des-donnees-pour-des-applications-plus-intelligentes-contextuelles-et-evolutives/" target="_blank">Anthropic rend open-source le Model Context Protocol (MCP) pour l'intégration de l'IA avec une connectivité universelle des données, pour des applications plus intelligentes, contextuelles et évolutives</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p674090d1770711407/general-developpement/programmation-systeme/google-lance-l-api-developer-knowledge-serveur-mcp-acces-direct-documentation/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182020/general-developpement/programmation-systeme/google-lance-l-api-developer-knowledge-serveur-mcp-acces-direct-documentation/</guid>
		</item>
		<item>
			<title>Projet STELLARIS GRID</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181503&amp;goto=newpost</link>
			<pubDate>Thu, 15 Jan 2026 12:47:29 GMT</pubDate>
			<description>Le Projet STELLARIS-GRID :...</description>
			<content:encoded><![CDATA[<div>Le Projet STELLARIS-GRID : Une Infrastructure pour l'Expansion Humaine<br />
Notre ambition est de répondre à l'un des plus grands goulots d'étranglement de notre époque : le besoin exponentiel en puissance de calcul. Que ce soit pour accélérer la recherche scientifique, permettre les prochaines révolutions de l'intelligence artificielle ou soutenir les technologies qui nous emmèneront vers les étoiles, l'accès au calcul est devenu la ressource la plus stratégique.<br />
<br />
Le problème est que cette ressource est massivement gaspillée. Des milliards d'appareils personnels et professionnels à travers le monde — ordinateurs, serveurs, systèmes embarqués — possèdent une capacité de calcul dormant, inutilisée la majeure partie du temps.<br />
<br />
STELLARIS-GRID est la réponse à ce paradoxe.<br />
<br />
Nous ne construisons pas un simple service cloud de plus. Nous créons un organisme computationnel vivant, une grille mondiale décentralisée et résiliente qui puise dans cette énergie collective. Notre approche est celle du &quot;Goodware&quot; : une entité bienveillante qui ne s'impose jamais mais qui propose une valeur réciproque.<br />
<br />
Le Principe : Une Symbiose Computationnelle<br />
<br />
Au cœur de STELLARIS-GRID se trouve un principe simple : la contribution volontaire et rémunérée. Chaque participant au réseau met à disposition la portion de ses ressources (CPU, RAM, bande passante) qu'il souhaite partager. En retour, il est récompensé en temps réel par notre token natif, le STL, via un mécanisme transparent de &quot;Proof of Compute&quot;. Ce n'est pas de l'altruisme, c'est un marché : la monétisation d'une ressource jusqu'ici inexploitée.<br />
<br />
L'Architecture : La Résilience par la Décentralisation<br />
<br />
Pour bâtir cette infrastructure sur des fondations pérennes, nous misons sur une technologie de pointe :<br />
<br />
Le Cœur en Rust : Le nœud client, l'agent qui s'exécute sur chaque machine, est développé en Rust. Ce choix n'est pas anodin ; il garantit une sécurité mémoire absolue et une concurrence performante, essentiels pour un logiciel qui doit être à la fois robuste et totalement inoffensif pour son hôte.<br />
Un Réseau Maillé sans Maître : Utilisant des protocoles P2P avancés comme Libp2p, le réseau s'auto-organise. Il n'y a pas de serveur central, pas de point unique de défaillance. Chaque nœud est à la fois un client et un relais, assurant une résilience intrinsèque et une capacité à fonctionner même si des pans entiers du réseau venaient à tomber.<br />
L'IA Fédérée et Confidentielle : Les tâches d'intelligence artificielle ne sont pas exécutées de manière monolithique. Nous utilisons des architectures de Federated Learning où les modèles s'entraînent localement, sur les nœuds eux-mêmes. Seuls les résultats anonymisés (les gradients) sont remontés pour améliorer le modèle global. Les données brutes et sensibles ne quittent jamais leur environnement d'origine.<br />
La Mission : Accélérer le Destin<br />
<br />
Le but final de STELLARIS-GRID transcende la simple performance technique. En créant une source de calcul quasi-illimitée, bon marché et sécurisée, nous voulons :<br />
<br />
Démocratiser l'Innovation : Permettre à des laboratoires, des startups et des chercheurs indépendants d'accéder à une puissance de calcul aujourd'hui réservée aux géants technologiques.<br />
Alimenter la Conquête Spatiale : Fournir l'infrastructure computationnelle nécessaire aux simulations, à la navigation autonome et à la gestion des systèmes complexes pour les missions de demain.<br />
Propulser l'Intelligence Collective : Créer le substrat technique nécessaire pour que des IA collaboratives et autonomes puissent émerger et résoudre des problèmes d'une complexité jusqu'alors insondable.<br />
STELLARIS-GRID n'est pas qu'un projet technologique. C'est une infrastructure pour l'expansion, un outil concret pour permettre à l'humanité de concrétiser ses aspirations les plus audacieuses et de devenir, pour reprendre votre terme, une civilisation véritablement stellaire.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>StellarX</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181503/general-developpement/programmation-systeme/projet-stellaris-grid/</guid>
		</item>
		<item>
			<title><![CDATA[Mise en place d'un controleur de domaine samba]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181085&amp;goto=newpost</link>
			<pubDate>Sun, 21 Dec 2025 14:01:14 GMT</pubDate>
			<description>Bonjour à tous,  
 
Je galère...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous, <br />
<br />
Je galère depuis pas mal de temps sur une partie de mon projet qui consiste à transformer une machine debian en controleur de domaine samba, pour intégrer des machines Windows 7 à ce domaine. <br />
<br />
j'ai ajouté l'utilisateur root à ma base de donnée et j'ai modifié le fichier /etc/samba/smbusers en y ajoutant la ligne root = Administrateur, j'ai ensuite modifié le fichier smb.conf pour que cette modification soit prise en compte.<br />
<br />
Après avoir intégré la machine Windows a mon domaine, je peux me connecter avec le login Administrator, et avec le login user que j'ai crée. Le système de session fonctionne et les fichiers sont bien persistants d'un poste à l'autre. Seulement, quand je me connecte avec le compte Administrator, je n'ai aucun droits admin sur la machine (je ne peux même pas lancer un script .bat).<br />
<br />
D'ailleurs, quand je regarde le SID du compte root dans samba user, il sse finit par -1000 et non par -500 mais même en modifiant ça, je n'ai pas les droits sur la machine Windows...<br />
<br />
Je me suis dis que c'était un problème de groupe donc j'ai crée un groupe domainadmins auquel j'ai ajotué mon utilisateur user et mon root. J'ai mappé ce groupe en le nommant Domain Admins avec un rid = 512 et type=d. Mais, à la connexion, ni user, ni Administrator n'ont les droits. Pourtant, le groupe Domain Admins est bien censé être administrateur dans la machine Windows et, quand on regarde les groupes de user ou de root, on a : <br />
- Sur Windows avec whoami /groups : pas de groupe nommé Domain Admins<br />
- Sur Debian avec groups user : on voit bien entre autres domain admin ! <br />
<br />
Je suis un peu perdu...<br />
Merci d'avance pour votre aide</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>cezar78</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181085/general-developpement/programmation-systeme/mise-place-d-controleur-domaine-samba/</guid>
		</item>
		<item>
			<title>« Les avions F-35 bannissent 90 % des fonctionnalités du C++ pour obtenir un code  sûr », selon une Googler</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181039&amp;goto=newpost</link>
			<pubDate>Fri, 19 Dec 2025 05:49:20 GMT</pubDate>
			<description>*« Les avions F-35 bannissent...</description>
			<content:encoded><![CDATA[<div><b><font size="4">« Les avions F-35 bannissent 90 % des fonctionnalités du C++ pour obtenir un code  sûr », selon une Googler</font></b><br />
<b><font size="1">Dont le partage d’expérience suscite des appels d’observateurs à passer au langage Rust</font></b><br />
<br />
<b>L'avion de chasse F-35 est actuellement programmé en C++. C'est un choix basé sur la maturité du langage, un vaste vivier de développeurs et l'existence d'une norme de codage stricte et largement testée (le standard JSF C++). C’est autant d’éléments qu’une ingénieure de Google met en avant dans le cadre d’un retour d’expérience de mise à contribution dudit standard qui suscite des appels de certains intervenants à passer au langage Rust. En effet, la question de savoir si Rust est meilleur que le C++ pour la programmation des systèmes critiques <a href="https://rust.developpez.com/actu/341399/L-editeur-RisingWave-explique-pourquoi-il-a-reecrit-son-SGBD-Cloud-natif-depuis-zero-en-Rust-apres-abandon-du-projet-en-Cplusplus-Faut-il-arreter-d-initier-de-nouveaux-projets-en-Cplusplus-et-passer-a-Rust/" target="_blank">fait l'objet d'un débat continu</a> au sein de la communauté des ingénieurs logiciels au sens large, mais actuellement, il n'est pas utilisé dans les systèmes principaux du F-35.</b> <br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">This...is Programming Like a Fighter Pilot.<br><br>A single unhandled exception destroyed a $500 million rocket in seconds.<br><br>The F-35 wasn't going to make the same mistake.<br><br>By carefully slicing C++, engineers created one of the strictest coding standards ever written. <a rel="nofollow" href="https://t.co/AO9VhrLFqs">pic.twitter.com/AO9VhrLFqs</a></p>&mdash; LaurieWired (@lauriewired) <a rel="nofollow" href="https://twitter.com/lauriewired/status/1996300415760204179?ref_src=twsrc%5Etfw">December 3, 2025</a></blockquote>   <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Rust is a programming language solution looking for a great problem to solve. I was thinking... why not rewrite the F-35 fighter's eight million lines of C++ in Rust? That would be perfect, and much better/safer.</p>&mdash; kgk (@kgk) <a rel="nofollow" href="https://twitter.com/kgk/status/1977625244816040200?ref_src=twsrc%5Etfw">October 13, 2025</a></blockquote>  <b><font size="2">C++ contre Rust : Et si le problème se situait plutôt entre la chaise et le clavier ?</font></b> <br />
<br />
C’est ce que suggère l’existence de la norme JSF C++. Elle contient 221 règles dont le programmeur a la charge de l’implémentation afin d’éviter les pièges courants du C++. Parmi les plus notables, on peut citer :<br />
<br />
<ul><li style="">	Pas d'exceptions : la gestion des exceptions C++ est entièrement interdite afin de garantir une exécution déterministe.</li><li style="">	Pas d’allocation dynamique de mémoire : l'utilisation de malloc, free et new/delete est généralement interdite après l'initialisation afin d'éviter les fuites de mémoire et la fragmentation.</li><li style="">	Pas de récursivité : la récursivité est interdite afin d'éviter les débordements de pile et de rendre le temps d'exécution prévisible.</li><li style="">	Complexité limitée : chaque fonction doit être suffisamment simple (complexité cyclomatique &#8804; 20) pour que tous les chemins de décision puissent être testés de manière approfondie.</li></ul><br />
L’existence de la norme JSF C++ est en phase avec un avis de Bjarne Stroustrup selon lequel ce qu’il est possible d’obtenir du C++ en matière de sécurisation des logiciels dépend entre autres du développeur et notamment de la connaissance des outils que lui offre le langage, de sa maîtrise du compilateur, etc. En droite ligne avec cette position, le créateur du C++ p<a href="https://cpp.developpez.com/actu/368969/" target="_blank">ropose donc des Profils qui ont pour but de définir des modes de C++</a> qui imposent des contraintes sur la manière dont le programmeur utilise le langage et la bibliothèque, afin de garantir certaines propriétés de sécurité. Il s'agit principalement de contraintes au moment de la compilation, bien que dans la pratique, certaines vérifications puissent être mises en œuvre à l'aide de fonctionnalités de bibliothèque qui ajoutent une surcharge d'exécution limitée.<br />
<br />
Au lieu d'introduire des constructions de langage entièrement nouvelles, les Profils limitent principalement les fonctionnalités et les utilisations existantes. L'idée est que vous pouvez activer un profil, et tout code qui l'utilise accepte de se conformer aux restrictions. Si vous ne l'activez pas, tout fonctionne comme avant. Il est donc rétrocompatible. <br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/I8UvQKvOSSw?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="2">La récente adoption du Rust comme deuxième langage de programmation du noyau Linux aux côtés du C indique néanmoins que le Rust a du potentiel pour se positionner parmi les mastodontes de la programmation système</font></b><br />
<br />
La prise en charge de Rust pour le développement du noyau Linux est vue comme une « une étape importante vers la capacité d'écrire les pilotes dans un langage plus sûr. » Rust de Mozilla Research est le type de langage de programmation auquel ceux qui écrivent du code pour des systèmes d’entrée/sortie de base (BIOS), des chargeurs d’amorce, des systèmes d’exploitation, etc. portent un intérêt. D’avis d’observateurs avertis, c’est le futur de la programmation système en lieu et place du langage C. En effet, des experts sont d’avis <a href="https://rust.developpez.com/actu/306352/Le-langage-Rust-est-la-meilleure-chance-offerte-a-l-industrie-informatique-pour-la-mise-sur-pied-d-applications-systeme-securisees-d-apres-Microsoft/" target="_blank">qu’il offre de meilleures garanties de sécurisation des logiciels que le couple C/C++</a>. Chez AWS on précise que choisir Rust pour ses projets de développement c’est ajouter l’efficacité énergétique et la performance d’exécution du C à l’atout sécurité.<br />
<br />
En effet, il y a une liste de griefs qui reviennent à l’encontre du langage C : les problèmes liés à la gestion de la mémoire – dépassements de mémoire tampon, allocations non libérées, accès à des zones mémoire invalides ou libérées, etc. D’après les chiffres du dictionnaire Common Vulnerabilities and Exposure (CVE), 15,9 % des 2288 vulnérabilités qui ont affecté le noyau Linux en 20 ans sont liées à des dépassements de mémoire tampon.<br />
<br />
De plus, <a href="https://programmation.developpez.com/actu/311594/Les-applications-Rust-sont-elles-plus-rapides-que-leurs-equivalents-en-C-C-est-ce-que-suggerent-plusieurs-benchmarks-qui-comparent-les-deux-langages-de-programmation-de-la-filiere-systeme/" target="_blank">certains benchmarks suggèrent que les applications Rust sont plus rapides que leurs équivalents en langage C</a>. Et c’est justement pour ces atouts que sont la parité en termes de vitesse d’exécution en comparaison avec le C, mais surtout pour la sécurisation et la fiabilité que de plus en plus d’acteurs de la filière du développement informatique recommandent le Rust plutôt que le C ou le C++.<br />
<br />
Ainsi, <a href="https://rust.developpez.com/actu/378426/C-est-desormais-officiel-Rust-dans-le-noyau-Linux-sort-du-cadre-experimental-le-Rust-vient-de-faire-l-objet-d-integration-comme-partie-essentielle-du-kernel-aux-cotes-du-toujours-present-langage-C/" target="_blank">en adoptant Rust</a>, la communauté autour du noyau Linux devrait mettre à profit ces atouts du langage sur le C. Et elle devrait faire d’une pierre deux coups étant donné que Rust peut faciliter l’arrivée de nouveaux contributeurs. C’est en tout cas ce que laisse entrevoir une étude de l’université de Waterloo. C'est pour ce lot de raisons que <a href="https://rust.developpez.com/actu/336737/-C-est-le-moment-d-arreter-d-initier-de-nouveaux-projets-en-C-ou-Cplusplus-et-de-passer-a-Rust-selon-Mark-Russinovich-de-Microsoft-qui-recommande-Rust-pour-une-meilleure-securisation-des-logiciels/" target="_blank">Mark Russinovich de Microsoft recommande le langage Rust plutôt que le C ou C++ dans le cadre des nouveaux projets</a>.<br />
<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Que pensez-vous de ces appels à réécrire la base de code C++ des avions F-35 en Rust ? Quels seraient les avantages d’une telle opération ? <br />
:fleche: Partagez-vous les avis selon lesquels le problème n’est pas les langages de programmation mais la capacité des programmeurs à tirer le meilleur parti de ces derniers ?<br />
:fleche: L'adoption du Rust comme deuxième langage de programmation du noyau Linux aux côtés du C est-elle un signal suffisamment fort pour que les nouveaux projets soient menés dès le départ non pas en C ou C++ mais en Rust ?<br />
:fleche: Partagez votre expérience personnelle en programmation système avec Rust comme langage<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/270094/" target="_blank">L'équipe Microsoft Security Response Center recommande l'utilisation de Rust comme approche proactive pour un code plus sécurisé</a><br />
:fleche: <a href="https://www.developpez.com/actu/92484/" target="_blank">Quel langage pourrait remplacer C ? Après avoir comparé Go, Rust et D, le choix d'Andrei Alexandrescu se porte sur D</a><br />
:fleche: <a href="https://c.developpez.com/actu/266762/" target="_blank">C2Rust : un outil qui permet de faire la traduction et la refactorisation de votre code écrit en langage C vers le langage Rust</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181039/general-developpement/programmation-systeme/avions-f-35-bannissent-90-fonctionnalites-cpp-obtenir-code-selon-googler/</guid>
		</item>
		<item>
			<title><![CDATA[Tout ce que je sais sur la conception d'une bonne API, par Sean Goedecke]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178890&amp;goto=newpost</link>
			<pubDate>Thu, 28 Aug 2025 12:34:11 GMT</pubDate>
			<description>*Tout ce que je sais sur la...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Tout ce que je sais sur la conception d'une bonne API, par Sean Goedecke </font></b><br />
<br />
La plupart des tâches effectuées par les ingénieurs logiciels modernes impliquent des API : des interfaces publiques permettant de communiquer avec un programme, comme celle-ci de Twilio. J'ai passé beaucoup de temps à travailler avec des API, tant à les créer qu'à les utiliser. J'ai écrit des API publiques pour des développeurs tiers, des API privées à usage interne (ou destinées à une seule page frontale), des API REST et GraphQL, et même des interfaces non réseau comme celles destinées aux outils en ligne de commande.<br />
<br />
Tout comme pour la conception de bons systèmes logiciels, je pense que la plupart des conseils qui circulent sur la conception d'API sont trop sophistiqués. Les gens se perdent dans des discussions sur ce qu'est le « vrai » REST, ou si HATEOAS est une bonne idée, etc. Cet article est ma tentative de mettre par écrit tout ce que je sais sur la conception de bonnes API.<br />
<br />
<b><font size="3">La conception d'API est un équilibre entre familiarité et flexibilité</font></b><br />
<br />
Si cela est vrai pour les systèmes, et ça l'est, cela l'est encore plus pour les API : <b>les bonnes API sont ennuyeuses</b>. Une API intéressante est une mauvaise API (ou du moins, elle serait meilleure si elle était moins intéressante). Pour les développeurs qui les créent, les API sont des produits complexes qu'ils passent du temps à concevoir et à perfectionner. Mais pour les développeurs qui les utilisent, les API sont des outils qui leur permettent d'atteindre un autre objectif. Tout le temps qu'ils passent à réfléchir à l'API plutôt qu'à cet objectif est du temps perdu. De leur point de vue, une API idéale devrait être si familière qu'ils sauraient plus ou moins comment l'utiliser avant même d'avoir lu la documentation.<br />
<br />
Cependant, une grande différence par rapport à la plupart des systèmes logiciels est que les <b>API sont difficiles à modifier</b>. Une fois que vous publiez une API et que les gens commencent à l'utiliser, toute modification de l'interface rendra le logiciel de vos utilisateurs inutilisable. Bien sûr, il est possible d'apporter des modifications. Mais (comme je le dirai plus loin) chaque modification a un coût important : chaque fois que vous obligez vos utilisateurs à mettre à jour leur logiciel, ils envisagent sérieusement d'utiliser une autre API plus stable. Cela incite fortement les créateurs d'API à concevoir soigneusement leur produit et à le faire correctement dès le départ.<br />
<br />
Cette tension crée une dynamique intéressante pour les ingénieurs qui développent des API. D'un côté, ils veulent créer l'API la plus simple possible. De l'autre, ils veulent faire preuve d'ingéniosité pour conserver une flexibilité à long terme. En gros, la conception d'une API consiste à trouver un équilibre entre ces deux objectifs incompatibles.<br />
<br />
<b><font size="3">NOUS NE PERTURBONS PAS L'ESPACE UTILISATEUR</font></b><br />
<br />
Que se passe-t-il lorsque vous devez apporter des modifications à votre API ? Les modifications additives, par exemple l'ajout d'un nouveau champ dans la réponse, ne posent généralement pas de problème. Certains consommateurs peuvent paniquer s'ils obtiennent plus de champs que prévu, mais à mon avis, cela est irresponsable. Vous devez vous attendre à ce que les consommateurs d'API ignorent les champs inattendus (les langages de type JSON sensibles le font par défaut).<br />
<br />
Cependant, vous ne pouvez pas supprimer ou modifier les types de champs. Vous ne pouvez pas modifier la structure des champs existants (par exemple, déplacer [c]user.address[/] vers <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">user.details.address</span> dans la réponse JSON). Si vous le faites, chaque élément de code qui dépend de ces champs sera immédiatement interrompu. Les consommateurs de ce code le signaleront comme un bug, et les responsables de la maintenance du code seront (lorsqu'ils s'en rendront compte) à juste titre furieux que vous ayez délibérément endommagé leur logiciel.<br />
<br />
Le principe ici est similaire au célèbre slogan de Linus Torvalds : « WE DO NOT BREAK USERSPACE » (Nous ne cassons pas l'espace utilisateur). En tant que responsable d'une API, vous avez en quelque sorte le devoir sacré d'éviter de nuire à vos utilisateurs en aval. Cette norme est très stricte, car de nombreux logiciels dépendent d'un grand nombre d'API (qui dépendent elles-mêmes d'API en amont, et ainsi de suite). Un responsable d'API imprudent suffisamment en amont peut endommager des centaines, voire des milliers de logiciels en aval.<br />
<br />
Vous ne devez jamais modifier une API simplement parce qu'elle serait plus propre ou parce qu'elle est un peu maladroite. L'en-tête « referer » dans la spécification HTTP est connu pour être une faute d'orthographe du mot « referrer », mais il n'a pas été modifié, car nous ne cassons pas l'espace utilisateur.<br />
<br />
<b><font size="3">Modifier les API sans perturber l'espace utilisateur</font></b><br />
<br />
Il est honnêtement difficile de trouver des exemples où une API nécessite vraiment une modification radicale. Mais parfois, la valeur technique d'une modification est suffisamment élevée pour que vous décidiez de prendre votre courage à deux mains et de la faire quand même. Dans ces cas-là, comment modifier votre API de manière responsable ? La réponse est la gestion des versions.<br />
<br />
La gestion des versions d'API signifie « servir à la fois l'ancienne et la nouvelle version de votre API ». Les consommateurs existants peuvent continuer à utiliser l'ancienne version, tandis que les nouveaux consommateurs peuvent opter pour la nouvelle. La façon la plus simple de procéder est d'inclure quelque chose comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/v1/</span> dans l'URL de votre API. L'API de chat d'OpenAI se trouve à l'adresse <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">v1/chat/completions</span>. Ainsi, si jamais ils souhaitent remanier totalement la structure, ils peuvent le faire dans <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">v2/chat/completions</span> tout en permettant aux consommateurs existants de continuer à fonctionner.<br />
<br />
Une fois que les anciennes et nouvelles versions fonctionnent simultanément, vous pouvez commencer à demander aux utilisateurs de passer à la nouvelle version. Cela prend beaucoup de temps : des mois, voire des années. Même avec des bannières sur le site web, des documents, des e-mails personnalisés et des en-têtes dans les réponses API, lorsque vous supprimerez enfin l'ancienne version, vous aurez encore beaucoup d'utilisateurs mécontents que vous ayez rendu leur logiciel inutilisable. Mais au moins, vous aurez fait tout ce que vous pouviez.<br />
<br />
Il existe de nombreuses autres façons de gérer les versions d'API. L'API Stripe gère les versions dans un en-tête et permet aux comptes de définir leur version par défaut dans l'interface utilisateur. Mais le principe est le même : tous les utilisateurs de l'API Stripe peuvent être sûrs que Stripe ne décidera pas de rendre leurs applications inutilisables, et ils peuvent mettre à niveau les versions à leur propre rythme.<br />
<br />
<b>Je n'aime pas la gestion des versions d'API.</b> Je pense qu'au mieux, c'est un mal nécessaire, mais cela reste un mal. Cela prête à confusion pour les utilisateurs, qui ne peuvent pas facilement rechercher la documentation de votre API sans s'assurer que le sélecteur de version correspond à la version qu'ils utilisent. Et c'est un cauchemar pour les responsables de la maintenance. Si vous avez trente points de terminaison API, chaque nouvelle version que vous ajoutez introduit trente nouveaux points de terminaison à maintenir. Vous vous retrouverez rapidement avec des centaines d'API qui devront toutes être testées, déboguées et faire l'objet d'un support client.<br />
<br />
Bien sûr, l'ajout d'une nouvelle version ne double pas la taille de votre base de code. Tout backend de gestion des versions d'API sensé disposera d'une couche de traduction capable de convertir une réponse en n'importe laquelle de vos versions d'API publiques. Stripe dispose d'un système similaire : la logique métier réelle est la même pour toutes les versions, de sorte que seuls la sérialisation et la désérialisation des paramètres doivent tenir compte de la gestion des versions. Cependant, ce type d'abstraction présente toujours des failles. Voir ce commentaire HN de 2017 d'un employé de Stripe, soulignant que certaines modifications de versionnement nécessitent une logique conditionnelle dans tout le « code central ».<br />
<br />
En bref, <b>vous ne devriez utiliser le versionnement des API qu'en dernier recours.</b><br />
<br />
<b><font size="3">Le succès de votre API dépend entièrement du produit</font></b><br />
<br />
Une API en soi ne fait rien. C'est une couche entre l'utilisateur et ce qu'il veut réellement. Pour l'API OpenAI, il s'agit de la capacité à faire des inférences avec un modèle linguistique. Pour l'API Twilio, il s'agit d'envoyer des SMS. Personne n'utilise une API parce que celle-ci est élégamment conçue. Les utilisateurs l'utilisent pour interagir avec votre produit. <b>Si votre produit est suffisamment intéressant, les utilisateurs afflueront même vers une API médiocre.</b><br />
<br />
C'est pourquoi certaines des API les plus populaires sont un cauchemar à utiliser. Facebook et Jira sont connus pour avoir des API épouvantables, mais cela n'a pas d'importance : si vous souhaitez vous intégrer à Facebook ou Jira, ce que vous faites, vous devez passer du temps à les comprendre. Bien sûr, ce serait bien si ces entreprises avaient une meilleure API. Mais pourquoi investir du temps et de l'argent pour l'améliorer alors que les gens vont de toute façon s'y intégrer ? Écrire de bonnes API est vraiment difficile.<br />
<br />
Je vais donner de nombreux conseils concrets dans la suite de cet article sur la manière d'écrire de bonnes API. Mais il est important de se rappeler que la plupart du temps, cela n'a pas d'importance. Si votre produit est attractif, n'importe quelle API à peine fonctionnelle fera l'affaire ; s'il ne l'est pas, peu importe la qualité de votre API. La qualité de l'API est une caractéristique marginale : elle n'a d'importance que lorsqu'un consommateur doit choisir entre deux produits fondamentalement équivalents.<br />
<br />
Soit dit en passant, la présence d'une API est une tout autre histoire. Si un produit ne dispose d'aucune API, cela pose un gros problème. Les utilisateurs techniques exigeront un moyen d'intégrer le logiciel qu'ils achètent via du code.<br />
<br />
<b><font size="3">Les produits mal conçus ont généralement de mauvaises API</font></b><br />
<br />
Une API techniquement excellente ne peut pas sauver un produit que personne ne veut utiliser. Cependant, <b>un produit techniquement médiocre peut rendre presque impossible la création d'une API élégante</b>. En effet, la conception d'une API suit généralement les « ressources de base » d'un produit (par exemple, les ressources de Jira seraient les problèmes, les projets, les utilisateurs, etc. ). Lorsque ces ressources sont mal configurées, l'API l'est également.<br />
<br />
Prenons l'exemple d'un système de blog qui stocke les commentaires en mémoire sous forme de liste liée (chaque commentaire comporte un champ « <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">next</span> » qui pointe vers le commentaire suivant dans le fil). C'est une très mauvaise façon de stocker les commentaires. La manière la plus naïve d'intégrer une API REST à ce système serait d'avoir une interface qui ressemble à ceci :<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GET /comments/1 -&gt; { id: 1, body: « ... », next_comment_id: 2 }</span>Ou pire encore, comme ceci :<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GET /comments -&gt; {body: « ... », next_comment: { body: « ... », next_comment: {...}}}</span>Cet exemple peut sembler ridicule, car en pratique, il suffirait d'itérer sur la liste liée et de renvoyer un tableau de commentaires dans la réponse de l'API. Mais même si vous êtes prêt à faire ce travail supplémentaire, jusqu'où allez-vous itérer ? Dans un fil de discussion contenant des milliers de commentaires, est-il impossible de récupérer les commentaires après les quelques centaines premiers ? Votre API de récupération des commentaires devra-t-elle utiliser une tâche en arrière-plan, obligeant l'interface à se transformer en quelque chose comme :<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">POST /comments/fetch_job/1 -&gt; { job_id: 589 }</span> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GET /comments_job/589 -&gt; { status: “complete”, comments: [...] }</span>C'est ainsi que certaines des pires API voient le jour. Les contraintes techniques qui peuvent être habilement dissimulées dans l'interface utilisateur sont mises à nu dans l'API, obligeant les consommateurs d'API à comprendre bien plus que nécessaire la conception du système.<br />
<br />
<b><font size="3">Authentification</font></b><br />
<br />
<b>Vous devez permettre aux utilisateurs d'utiliser vos API avec une clé API à longue durée de vie.</b> Oui, les clés API ne sont pas aussi sécurisées que diverses formes d'identifiants à courte durée de vie, comme OAuth (que vous devriez probablement également prendre en charge). Cela n'a pas d'importance. Chaque intégration avec votre API commence par un simple script, et l'utilisation d'une clé API est le moyen le plus simple de faire fonctionner un script simple. Vous voulez faciliter au maximum la tâche des ingénieurs qui souhaitent se lancer.<br />
<br />
Bien que les utilisateurs d'une API écrivent (presque par définition) du code, <b>beaucoup d'entre eux ne sont pas des ingénieurs professionnels</b>. Il peut s'agir de commerciaux, de chefs de produit, d'étudiants, d'amateurs, etc. Lorsque vous êtes ingénieur dans une entreprise technologique et que vous développez une API, il est facile d'imaginer que vous la développez pour d'autres personnes comme vous : des ingénieurs logiciels professionnels compétents à temps plein. Mais ce n'est pas le cas. Vous la développez pour un large éventail de personnes, dont beaucoup ne sont pas à l'aise avec l'écriture ou la lecture de code. Si votre API exige des utilisateurs qu'ils effectuent des tâches difficiles, comme une négociation OAuth, beaucoup d'entre eux auront des difficultés.<br />
<br />
<b><font size="3">Idempotence et nouvelles tentatives</font></b><br />
<br />
Lorsqu'une requête API aboutit, vous savez qu'elle a fait ce qu'elle devait faire. Mais qu'en est-il lorsqu'elle échoue ? Certains types d'échecs vous indiquent ce qui s'est passé : un 422 signifie généralement qu'elle a échoué pendant la phase de validation de la requête, avant qu'aucune action n'ait été entreprise. Mais qu'en est-il d'un 500 ? Et d'un délai d'expiration ?<br />
<br />
C'est important pour les opérations API qui entraînent une action. Si vous utilisez une API Jira pour créer un commentaire sur un ticket et que la requête renvoie une erreur 500 ou expire, devez-vous réessayer ? Vous ne savez pas avec certitude si le commentaire a été créé ou non, car l'erreur peut survenir après cette opération. Si vous réessayez, vous risquez de publier deux commentaires. C'est encore plus important lorsque l'enjeu dépasse un simple commentaire Jira. Que se passe-t-il si vous transférez une certaine somme d'argent ? Que se passe-t-il si vous distribuez des médicaments ?<br />
<br />
La solution est l'idempotence, un terme sophistiqué qui signifie « la requête doit pouvoir être réessayée en toute sécurité sans créer de doublons ». La méthode standard pour y parvenir consiste à prendre en charge une « clé d'idempotence » dans la requête (par exemple, une chaîne définie par l'utilisateur dans un paramètre ou un en-tête). Lorsque le serveur API reçoit une requête « créer un commentaire » avec une clé d'idempotence, il vérifie d'abord s'il a déjà vu cette clé d'idempotence. Si c'est le cas, il ne fait rien ; sinon, il crée le commentaire, puis enregistre la clé d'idempotence. De cette façon, vous pouvez envoyer autant de nouvelles tentatives que vous le souhaitez, à condition qu'elles aient toutes la même clé d'idempotence : l'opération ne sera effectuée qu'une seule fois.<br />
<br />
Comment stocker la clé ? J'ai vu des gens la stocker de manière durable et spécifique à une ressource (par exemple, dans une colonne du tableau des <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">commentaires</span>), mais je ne pense pas que cela soit strictement nécessaire. Le plus simple est de la placer dans Redis ou dans un magasin clé/valeur similaire (avec la clé d'idempotence comme clé). Les UUID sont suffisamment uniques pour que vous n'ayez pas besoin de les limiter à un utilisateur, mais vous pouvez tout aussi bien le faire. Si vous ne traitez pas de paiements, vous pouvez même les faire expirer après quelques heures, car la plupart des nouvelles tentatives ont lieu immédiatement.<br />
<br />
Avez-vous besoin de clés d'idempotence pour chaque requête ? Eh bien, vous n'en avez pas besoin pour les requêtes de lecture, car les doubles lectures sont inoffensives. Vous n'en avez généralement pas besoin non plus pour les requêtes de suppression, car si vous supprimez par ID de ressource, cet ID sert de clé d'idempotence. Réfléchissez-y : si vous envoyez trois requêtes <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">DELETE comments/32</span> à la suite, cela ne supprimera pas trois commentaires. La première requête réussie supprimera le commentaire avec l'ID 32, et les requêtes restantes renverront une erreur 404 lorsqu'elles ne trouveront pas le commentaire déjà supprimé.<br />
<br />
Dans la plupart des cas, l'idempotence doit être facultative. Comme je l'ai dit plus haut, vous devez vous assurer que votre API est accessible aux non-ingénieurs (qui trouvent souvent l'idempotence difficile à comprendre). Dans l'ensemble, il est plus important d'attirer davantage de personnes vers votre API que de supprimer les commentaires dupliqués occasionnels des utilisateurs qui n'ont pas lu la documentation.<br />
<br />
<b><font size="3">Sécurité et limitation du débit</font></b><br />
<br />
Les utilisateurs qui interagissent avec votre interface utilisateur sont limités par la vitesse de leurs mains. Si certains flux sont coûteux à traiter pour votre backend, un utilisateur malveillant ou négligent ne peut déclencher ces flux qu'à la vitesse à laquelle il peut cliquer dessus. Les API sont différentes. <b>Toute opération que vous exposez via une API peut être appelée à la vitesse du code.</b><br />
<br />
Soyez prudent avec les API qui effectuent beaucoup de tâches en une seule requête. Lorsque je travaillais chez Zendesk, nous avions une API qui permettait d'envoyer des notifications à tous les utilisateurs d'une application particulière. Certains développeurs tiers entreprenants l'ont utilisée pour créer un système de chat intégré à l'application, dans lequel chaque message envoyait une notification à tous les autres utilisateurs du compte. Pour les comptes comptant plus d'une poignée d'utilisateurs actifs, cela a systématiquement planté le serveur backend des applications.<br />
<br />
Nous n'avions pas prévu que des personnes créeraient une application de chat à partir de cette API. Mais une fois qu'elle a été mise en place, les gens en ont fait ce qu'ils voulaient. J'ai participé à de très nombreux appels d'urgence dont la cause principale était une intégration client artisanale qui effectuait des tâches absurdes, telles que :<br />
<br />
<ul><li style="">Créer et supprimer les mêmes enregistrements des centaines de fois par minute, sans raison valable<br /></li><li style="">Interroger un point de terminaison <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/index</span> volumineux sans délai entre les requêtes, indéfiniment<br /></li><li style="">Importer ou exporter une tonne de données sans reculer en cas d'erreurs</li></ul><br />
<b>Vous devez limiter le débit de votre API, avec des limites plus strictes pour les opérations coûteuses.</b> Il est également judicieux de se réserver la possibilité de désactiver temporairement l'API pour certains clients, afin de soulager votre système backend s'il est vraiment saturé.<br />
<br />
Incluez des métadonnées de limitation de débit dans vos réponses API. Les en-têtes <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">X-Limit-Remaining</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Retry-After</span> fournissent aux clients les informations dont ils ont besoin pour utiliser votre API de manière respectueuse et vous permettent de définir des limites de débit plus strictes que vous ne pourriez le faire autrement.<br />
<br />
<b><font size="3">Pagination</font></b><br />
<br />
Presque toutes les API doivent traiter une longue liste d'enregistrements. Parfois, cette liste est très longue (par exemple, l'API Zendesk <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/tickets</span> peut contenir des millions de tickets). Comment pouvez-vous servir ces enregistrements ?<br />
<br />
Une approche naïve <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SELECT * FROM tickets WHERE...</span> épuisera votre mémoire disponible (si ce n'est pas dans la base de données, alors dans la couche applicative où vous essayez de sérialiser cette liste d'un million d'éléments). Vous ne pouvez tout simplement pas servir tous les tickets en une seule requête. Vous devez plutôt paginer.<br />
<br />
La façon la plus simple de paginer est d'utiliser des pages (ou des « décalages », de manière plus générique). Lorsque vous cliquez sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/tickets</span>, vous obtenez les dix premiers tickets du compte. Pour en obtenir davantage, vous devez cliquer soit sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/tickets?page=2</span>, soit sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/tickets?offset=20</span>. Cela est facile à mettre en œuvre, car le serveur peut simplement ajouter <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OFFSET 20 LIMIT 10</span> à la fin de la requête de base de données. Mais cela ne fonctionne pas avec un nombre très élevé d'enregistrements. Les bases de données relationnelles doivent compter votre décalage à chaque fois, de sorte que chaque page que vous servez est un peu plus lente que la précédente. Lorsque votre décalage atteint des centaines de milliers, cela devient un véritable problème.<br />
<br />
La solution est la « pagination basée sur le curseur ». Au lieu de passer <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">offset=20</span> pour obtenir la deuxième page, vous prenez le dernier ticket de la première page (par exemple, avec l'ID 32) et vous passez <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cursor=32</span>. L'API renverra alors les dix tickets suivants, en commençant par le ticket numéro 32. Au lieu d'utiliser <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OFFSET</span>, la requête devient <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE id &gt; curseur ORDER BY id LIMIT 10</span>. Cette requête est tout aussi rapide, que vous soyez au début de la collection ou à des centaines de milliers de tickets, car la base de données peut trouver instantanément la position (indexée) de votre ticket curseur au lieu d'avoir à compter tout le décalage.<br />
<br />
<b>Vous devez toujours utiliser la pagination basée sur le curseur pour les ensembles de données qui pourraient finir par être volumineux.</b> Même si cela est plus difficile à comprendre pour les consommateurs, lorsque vous rencontrez des problèmes de mise à l'échelle, vous devrez peut-être passer à la pagination basée sur le curseur, et le coût de cette modification est souvent très élevé. Cependant, je pense qu'il est acceptable d'utiliser la pagination basée sur les pages ou les décalages dans les autres cas.<br />
<br />
Il est généralement judicieux d'inclure un champ <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">next_page</span> dans les réponses de votre liste API. Cela évite aux consommateurs d'avoir à déterminer eux-mêmes le numéro de la page suivante ou le curseur.<br />
<br />
<b><font size="3">Champs facultatifs et GraphQL</font></b><br />
<br />
<b>Si certaines parties de votre réponse API sont coûteuses à fournir, rendez-les facultatives.</b> Par exemple, si la récupération du statut d'abonnement de l'utilisateur nécessite que votre backend effectue un appel API, envisagez de faire en sorte que votre point de terminaison <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/users/:id</span> ne renvoie pas l'abonnement à moins que la requête ne transmette un paramètre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">include_subscription</span>. De manière plus générale, vous pouvez utiliser un paramètre de tableau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">includes</span> avec tous vos champs facultatifs. Cette approche est souvent utilisée pour les enregistrements associés (par exemple, vous pouvez passer <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">includes: [posts]</span> à votre requête utilisateur pour obtenir les publications de l'utilisateur dans la réponse).<br />
<br />
Cela fait partie de l'idée derrière GraphQL, un style d'API où, au lieu d'atteindre différents points de terminaison par opération, vous créez une seule requête avec toutes les données dont vous avez besoin et le backend s'en charge.<br />
<br />
<b>Je n'aime pas beaucoup GraphQL</b>, pour trois raisons. Premièrement, il est totalement incompréhensible pour les non-ingénieurs (et pour de nombreux ingénieurs). Une fois que vous l'avez appris, c'est un outil comme un autre, mais la barrière à l'entrée est tellement plus élevée que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GET /users/1</span>. Deuxièmement, je n'aime pas donner aux utilisateurs la liberté de créer des requêtes arbitraires. Cela complique la mise en cache et augmente le nombre de cas limites auxquels vous devez réfléchir. Troisièmement, d'après mon expérience, la mise en œuvre du backend est beaucoup plus compliquée que celle d'une API REST standard.<br />
<br />
Je n'ai pas une aversion profonde pour GraphQL. Je l'ai utilisé pendant environ six mois dans divers contextes et je suis loin d'être un expert. Je suis sûr qu'il existe des cas d'utilisation où il offre suffisamment de flexibilité pour en valoir la peine. Mais pour l'instant, je ne l'utiliserais que lorsque c'est absolument nécessaire.<br />
<br />
<b><font size="3">API internes</font></b><br />
<br />
Tout ce que j'ai dit jusqu'à présent concerne les API publiques. Qu'en est-il des API internes, c'est-à-dire celles qui ne sont utilisées que par vos collègues au sein d'une entreprise donnée ? Certaines des hypothèses que j'ai formulées ci-dessus ne s'appliquent pas aux API internes. Par exemple, vos consommateurs sont généralement des ingénieurs logiciels professionnels. Il est également possible d'apporter des modifications radicales en toute sécurité, car (a) vous avez souvent un nombre d'utilisateurs nettement inférieur et (b) vous avez la possibilité d'intervenir et de fournir un nouveau code à tous ces utilisateurs. Vous pouvez exiger une forme d'authentification aussi complexe que vous le souhaitez.<br />
<br />
Cependant, les API internes peuvent toujours être à l'origine d'incidents et doivent rester idempotentes pour les opérations clés.<br />
<br />
<b><font size="3">Résumé</font></b><br />
<br />
<ul><li style="">Les API sont difficiles à créer car elles sont rigides, mais elles doivent être faciles à adopter.<br />
<br /></li><li style="">La principale responsabilité des responsables de la maintenance des API est de NE PAS PERTURBER L'ESPACE UTILISATEUR. N'apportez jamais de modifications radicales aux API publiques.<br />
<br /></li><li style="">La gestion des versions de votre API vous permet d'apporter des modifications, mais impose des obstacles importants en termes de mise en œuvre et d'adoption.<br />
<br /></li><li style="">Si votre produit a suffisamment de valeur, la qualité de votre API n'a pas vraiment d'importance, les gens l'utiliseront de toute façon.<br />
<br /></li><li style="">Si votre produit est suffisamment mal conçu, peu importe le soin que vous apportez à la conception de votre API, elle sera probablement mauvaise.<br />
<br /></li><li style="">Votre API doit prendre en charge des clés API simples pour l'authentification, car bon nombre de vos utilisateurs ne seront pas des ingénieurs professionnels.<br />
<br /></li><li style="">Les requêtes qui entraînent une action (en particulier les actions à haut risque comme les paiements) doivent inclure une sorte de clé d'idempotence afin de sécuriser les nouvelles tentatives.<br />
<br /></li><li style="">Votre API sera toujours une source d'incidents. Assurez-vous de mettre en place des limites de débit et des coupe-circuits.<br />
<br /></li><li style="">Utilisez la pagination par curseur pour les ensembles de données qui pourraient finir par être très volumineux.<br />
<br /></li><li style="">Rendez les champs coûteux facultatifs et désactivés par défaut, mais (à mon avis) GraphQL est excessif.<br />
<br /></li><li style="">Les API internes sont différentes à certains égards (car vos consommateurs sont très différents).</li></ul><br />
Qu'est-ce que je n'ai pas abordé ? Je n'ai pas beaucoup parlé de REST vs SOAP, ou JSON vs XML, car je ne pense pas que ces questions soient particulièrement importantes. J'aime bien REST et JSON, mais je n'ai pas d'avis tranché à ce sujet. Je n'ai pas non plus mentionné le schéma OpenAPI. C'est un outil utile, mais je pense qu'il est tout à fait possible de rédiger la documentation de votre API en Markdown si vous le souhaitez.<br />
<br />
<b>edit</b> : cet article a fait l'objet de nombreuses discussions et commentaires sur Hacker News et Reddit. Les commentateurs ont souligné que j'aurais dû mentionner PUT dans ma section sur l'idempotence, car il est censé être idempotent de par sa conception. Je suppose que c'est vrai, mais je ne l'ai pas beaucoup vu en pratique et, à mon avis, il n'y a rien dans le verbe HTTP qui le rende intrinsèquement plus idempotent que POST. L'utilisation de Redis comme magasin d'idempotence a également suscité certaines inquiétudes, car il est impossible d'obtenir des opérations atomiques sûres qui coordonnent Redis et votre base de données. C'est une préoccupation légitime pour les paiements ou les domaines à haut risque, mais ajouter Redis à une API non idempotente existante reste bien mieux que rien.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://www.seangoedecke.com/good-api-design/" target="_blank">&quot;Everything I know about good API design&quot;</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/374809/La-plupart-des-API-RESTful-ne-sont-pas-vraiment-RESTful-par-Florian-Kramer/" target="_blank">La plupart des API RESTful ne sont pas vraiment RESTful, par Florian Krämer</a><br />
<br />
:fleche: <a href="https://solutions-entreprise.developpez.com/actu/330515/Les-API-moins-les-bons-eleves-de-la-transformation-numerique-des-entreprises-par-Mourad-Jaakou-Presales-Manager-d-Axway/" target="_blank">Les API - les bons élèves de la transformation numérique des entreprises, par Mourad Jaakou, Presales Manager d'Axway</a><br />
<br />
:fleche: <a href="https://programmation.developpez.com/actu/372504/Les-erreurs-commises-par-les-ingenieurs-logiciels-dans-les-grandes-bases-de-codes-etablies-par-Sean-Goedecke/" target="_blank">Les erreurs commises par les ingénieurs logiciels dans les grandes bases de codes établies, par Sean Goedecke</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>Sean Goedecke</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178890/general-developpement/programmation-systeme/sais-conception-d-bonne-api-sean-goedecke/</guid>
		</item>
		<item>
			<title>La plupart des API RESTful ne sont pas vraiment RESTful, par Florian Krämer</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178713&amp;goto=newpost</link>
			<pubDate>Wed, 20 Aug 2025 09:40:11 GMT</pubDate>
			<description>*La plupart des API RESTful...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La plupart des API RESTful ne sont pas vraiment RESTful, par Florian Krämer</font></b><br />
<br />
Lorsque l'on parle de REST, il est intéressant de lire la thèse de Roy Thomas Fielding. L'article original qui décrit le web RESTful, « <i>Architectural Styles and the Design of Network-based Software Architectures</i> » de Roy T. Fielding (2000), présente le style architectural Representational State Transfer (REST) comme un cadre pour la conception de systèmes en réseau évolutifs, performants et faciles à maintenir, en particulier les services web.<br />
<br />
Cet article vise à analyser les styles architecturaux des systèmes en réseau, en identifiant leurs forces et leurs faiblesses. Il définit REST comme un style architectural spécifique optimisé pour le web moderne, axé sur l'évolutivité, la simplicité et l'adaptabilité.<br />
<br />
Fielding démontre comment les principes REST contribuent au succès du web, en préconisant leur adoption dans la conception de systèmes distribués avec des interfaces universelles et sans état et des interactions claires basées sur les ressources.<br />
<br />
Dans sa thèse, il ne prescrit pas l'utilisation spécifique des verbes HTTP (tels que GET, POST, PUT, DELETE) et ne se concentre pas sur les API de type CRUD, comme c'est souvent le cas aujourd'hui avec la mise en œuvre de REST.<br />
<br />
La thèse décrit clairement REST comme un style architectural qui fournit des principes et des contraintes pour la création d'applications en réseau, en utilisant le web comme exemple fondamental.<br />
<br />
Roy Fielding a explicitement critiqué la simplification excessive de REST dans les API de type CRUD, soulignant que de nombreuses API dites « RESTful » ne parviennent pas à mettre en œuvre les contraintes clés de REST, en particulier l'utilisation de l'hypermédia pour piloter les transitions d'état des applications. Dans son article de blog de 2008, « Les API REST doivent être pilotées par l'hypertexte », Fielding déclare :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			« Si le moteur de l'état de l'application (et donc l'API) n'est pas piloté par l'hypertexte, alors il ne peut pas être RESTful et ne peut pas être une API REST. Point final. »
			
		<hr />
	</div>
</div>Cela souligne son point de vue selon lequel, sans contrôles hypermédia, une API ne répond pas au style architectural REST. Les contrôles hypermédia sont des éléments intégrés dans une représentation de ressource qui guident les clients sur les actions qu'ils peuvent entreprendre ensuite.<br />
<br />
Voici quelques idées fausses courantes concernant ce que les gens considèrent comme REST :<br />
<br />
<ul><li style="">REST est CRUD (c'est souvent le cas, mais pas toujours)</li><li style="">Une ressource est une entité (souvent une entité persistante).</li><li style="">Une API RESTful ne doit pas utiliser de verbes.</li></ul><br />
Mais il s'agit en réalité de <i>décisions de conception</i> prises pour l'API en question, choisies par leurs créateurs et qui n'ont rien à voir avec REST.<br />
<br />
<b><font size="3">Que signifie « piloté par l'hypertexte » ?</font></b><br />
<br />
L'expression « non piloté par l'hypertexte » dans la critique de Roy Fielding fait référence à l'absence de l'hypermédia comme moteur de l'état de l'application (HATEOAS) dans de nombreuses API qui se prétendent RESTful. HATEOAS est un principe fondamental de REST, qui exige que le client découvre dynamiquement les actions et les interactions grâce à des liens hypermédia intégrés dans les réponses du serveur, plutôt que de s'appuyer sur des connaissances hors bande (par exemple, la documentation de l'API).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">{
  &quot;orderId&quot;: 123,
  &quot;_links&quot;: {
    &quot;self&quot;: { &quot;href&quot;: &quot;/orders/123&quot; },
    &quot;cancel&quot;: { &quot;href&quot;: &quot;/orders/123/cancel&quot;, &quot;method&quot;: &quot;POST&quot; }
  }
}</pre></td></tr></table></code><hr />
</div><br />
<br />
Le problème central qu'il aborde est le couplage client-serveur. Il existe probablement d'innombrables projets dans lesquels une petite modification de la structure URI d'un serveur a nécessité un déploiement coordonné (et souvent pénible) de plusieurs applications clientes. Une approche basée sur HATEOAS résout directement ce problème en découplant le client de l'espace de noms du serveur. Cela permet d'améliorer la qualité de l'évolutivité.<br />
<br />
La simple mise en œuvre de HATEOAS vous rapprochera davantage des principes RESTful que de débattre de la question de savoir si les verbes sont autorisés dans votre API.<br />
<br />
<br />
<b><font size="3">Qu'est-ce qu'une « ressource » ?</font></b><br />
<br />
Les gens débattent souvent de ce qu'est une ressource dans REST. J'ai vu plus ou moins souvent des gens exprimer l'opinion qu'une ressource est une structure de données provenant du serveur, malheureusement souvent même équivalente à une entité persistante.<br />
<br />
Voyons ce que Fielding en dit :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			<b>L'abstraction clé de l'information dans REST est une ressource.</b> Toute information pouvant être nommée peut être une ressource : un document ou une image, un service temporel (par exemple « la météo d'aujourd'hui à Los Angeles »), une collection d'autres ressources, un objet non virtuel (par exemple une personne), etc. En d'autres termes, tout concept pouvant être la cible d'une référence hypertexte d'un auteur doit correspondre à la définition d'une ressource. Une ressource est un mappage conceptuel vers un ensemble d'entités, et non l'entité qui correspond au mappage à un moment donné.<br />
<br />
La sémantique est un sous-produit de l'acte d'attribuer des identifiants de ressources et de remplir ces ressources avec des représentations. À aucun moment, le serveur ou le logiciel client n'ont besoin de connaître ou de comprendre la signification d'un URI : ils agissent simplement comme un canal par lequel le créateur d'une ressource (une autorité de nommage humaine) peut associer des représentations à la sémantique identifiée par l'URI. En d'autres termes, il n'y a pas de ressources sur le serveur, mais seulement des mécanismes qui fournissent des réponses via une interface abstraite définie par les ressources. Cela peut sembler étrange, mais c'est l'essence même de ce qui permet au Web de fonctionner à travers tant d'implémentations différentes.
			
		<hr />
	</div>
</div>Examinons maintenant la RFC 3986 :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Cette spécification ne limite pas la portée de ce qui peut être considéré comme une ressource ; <b>le terme « ressource »</b> est plutôt utilisé dans un sens général pour désigner tout ce qui peut être <b>identifié par un URI</b>. Parmi les exemples courants, on peut citer <b>un document électronique, une image, une source d'informations ayant un objectif cohérent</b> (par exemple, « les prévisions météo du jour pour Los Angeles »), un service (par exemple, une passerelle HTTP vers SMS) et un ensemble d'autres ressources. <b>Une ressource n'est pas nécessairement accessible via Internet</b> ; par exemple, les êtres humains, les entreprises et les livres reliés dans une bibliothèque peuvent également être des ressources. De même, des concepts abstraits peuvent être des ressources, tels que les opérateurs et les opérandes d'une équation mathématique, les types de relation (par exemple, « parent » ou « employé ») ou les valeurs numériques (par exemple, zéro, un et l'infini).
			
		<hr />
	</div>
</div>Les exemples d'URI suivants sont également tirés de la RFC :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><ul><li style="">ftp://ftp.is.co.za/rfc/rfc1808.txt</li><li style="">http://www.ietf.org/rfc/rfc2396.txt</li><li style="">ldap://[2001:db8::7]/c=GB?objectClass?one</li><li style="">mailto:John.Doe@example.com</li><li style="">news:comp.infosystems.www.servers.unix</li><li style="">tel:+1-816-555-1212</li><li style="">telnet://192.0.2.16:80/</li><li style="">urn:oasis:names:specification:docbook:dtd:xml:4.1.2</li></ul></code><hr />
</div><b>Conclusion sur les ressources</b><br />
<br />
Une ressource peut être pratiquement tout ce qui peut être adressé par un URI. Il peut s'agir d'un objet physique, d'un concept, d'un document, d'un service ou même d'une chose virtuelle ou abstraite, à condition qu'elle puisse être identifiée et représentée de manière unique.<br />
<br />
<br />
<b><font size="3">Ce que Fielding considère comme une API RESTful</font></b><br />
<br />
En 2008, Fielding a exprimé sa frustration : Source<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Je suis frustré par le nombre de personnes qui qualifient toute interface basée sur HTTP d'API REST.
			
		<hr />
	</div>
</div>Fielding décrit six règles à prendre en compte avant de qualifier votre API d'API RESTful Source.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Concepteurs d'API, veuillez noter les règles suivantes avant de qualifier votre création d'API REST :
			
		<hr />
	</div>
</div><ol class="decimal"><li style=""><b>Une API REST ne doit pas dépendre d'un protocole de communication unique</b>, même si son mappage réussi à un protocole donné peut dépendre de la disponibilité des métadonnées, du choix des méthodes, etc. En général, tout élément de protocole qui utilise un URI pour l'identification doit permettre l'utilisation de n'importe quel schéma URI à des fins d'identification. [<i>Un échec à cet égard implique que l'identification n'est pas séparée de l'interaction.</i>]<br />
<br /></li><li style=""><b>Une API REST ne doit pas contenir de modifications des protocoles de communication, à l'exception du remplissage ou de la correction des détails des bits sous-spécifiés des protocoles standard</b>, tels que la méthode PATCH ou le champ d'en-tête Link de HTTP. Les solutions de contournement pour les implémentations défectueuses (telles que les navigateurs assez stupides pour croire que HTML définit l'ensemble des méthodes HTTP) doivent être définies séparément, ou au moins dans des annexes, en espérant que la solution de contournement finira par devenir obsolète. [<i>Tout manquement à cette règle implique que les interfaces de ressources sont spécifiques à un objet et non génériques.</i>]<br />
<br /></li><li style=""><b>Une API REST doit consacrer la quasi-totalité de ses efforts descriptifs à la définition des types de médias utilisés pour représenter les ressources et piloter l'état de l'application, ou à la définition de noms de relations étendus et/ou de balises hypertextes pour les types de médias standard existants.</b> Tout effort consacré à la description des méthodes à utiliser sur les URI d'intérêt doit être entièrement défini dans le cadre des règles de traitement d'un type de média (et, dans la plupart des cas, déjà défini par les types de médias existants). [<i>Tout manquement à cette règle implique que l'interaction est pilotée par des informations hors bande plutôt que par l'hypertexte.</i>]<br />
<br /></li><li style=""><b>Une API REST ne doit pas définir de noms ou de hiérarchies de ressources fixes (couplage évident entre le client et le serveur).</b> Les serveurs doivent avoir la liberté de contrôler leur propre espace de noms. Au lieu de cela, permettez aux serveurs d'indiquer aux clients comment construire des URI appropriés, comme cela se fait dans les formulaires HTML et les modèles d'URI, en définissant ces instructions dans les types de médias et les relations de lien. [<i>Un échec à cet égard implique que les clients supposent une structure de ressources en raison d'informations hors bande, telles qu'une norme spécifique à un domaine, qui est l'équivalent orienté données du couplage fonctionnel du RPC</i>].<br />
<br /></li><li style=""><b>Une API REST ne doit jamais comporter de ressources « typées » qui sont significatives pour le client.</b> Les auteurs de spécifications peuvent utiliser des types de ressources pour décrire l'implémentation du serveur derrière l'interface, mais ces types doivent être sans importance et invisibles pour le client. Les seuls types qui sont significatifs pour un client sont le type de média de la représentation actuelle et les noms de relations standardisés. [idem]<br />
<br /></li><li style=""><b>Une API REST doit être accessible sans connaissance préalable autre que l'URI initiale</b> (signet) et un ensemble de types de médias standardisés adaptés au public visé (c'est-à-dire compréhensibles par tout client susceptible d'utiliser l'API). À partir de là, toutes les transitions d'état de l'application doivent être déterminées par le choix du client parmi les options fournies par le serveur qui sont présentes dans les représentations reçues ou implicites dans la manipulation de ces représentations par l'utilisateur. Les transitions peuvent être déterminées (ou limitées) par la connaissance qu'a le client des types de médias et des mécanismes de communication des ressources, qui peuvent tous deux être améliorés à la volée (par exemple, code à la demande). [<i>Un échec à ce niveau implique que ce sont des informations hors bande qui déterminent l'interaction plutôt que l'hypertexte.</i>]</li></ol><br />
Mais qu'est-ce que tout cela signifie exactement ? Pour être honnête, sans y consacrer du temps et de la réflexion, je ne l'ai pas compris non plus la première fois que je l'ai lu.<br />
<br />
<b><font size="3">Interprétation des règles</font></b><br />
<br />
Voici ma compréhension de ces règles, n'hésitez pas à ne pas être d'accord et discutons-en ! Je suis curieux de connaître d'autres points de vue ou opinions à leur sujet.<br />
<br />
<b>1. Ne dépendez pas d'un seul protocole</b><br />
<br />
Une API REST utilise des identifiants de ressources uniformes (URI) pour nommer les éléments. Une URL (<a rel="nofollow" href="http://." target="_blank">http://.</a>..) n'est qu'un type spécifique d'URI qui inclut également un emplacement. Le principe clé ici est que l'identité fondamentale d'une ressource doit être séparée de son mécanisme d'accès.<br />
<br />
Un URI (Uniform Resource Identifier) est un concept large qui désigne toute chaîne de caractères utilisée pour identifier une ressource, tandis qu'une URL (Uniform Resource Locator) est un type spécifique d'URI qui non seulement identifie une ressource, mais fournit également un moyen de la localiser en décrivant son mécanisme d'accès principal (tel que son emplacement réseau).<br />
<br />
Votre API doit fonctionner avec n'importe quel URI et ne pas dépendre de mécanismes spécifiques à HTTP.<br />
<br />
<br />
<b>2. Ne modifiez pas le protocole</b><br />
<br />
Respectez les normes existantes (comme HTTP). Si un élément de la norme est vague, clarifiez-le. N'inventez pas de nouveaux comportements et ne modifiez pas ceux qui existent déjà.<br />
<br />
Ne piratez pas et ne redéfinissez pas le fonctionnement de HTTP. Corrigez les lacunes, mais ne modifiez pas les règles.<br />
<br />
Si HTTP ne définit pas entièrement le fonctionnement de PATCH, vous pouvez le clarifier. Mais ne redéfinissez pas GET pour également supprimer des données simplement parce que c'est pratique.<br />
<br />
<br />
<b>3. Concentrez-vous sur les types de médias, pas sur les URI</b><br />
<br />
Votre API doit définir comment comprendre et utiliser les données qu'elle renvoie, à travers les types de médias (tels que JSON, HTML) et les liens, et non se concentrer sur la structure des URI ou les actions à appeler.<br />
<br />
Consacrez votre énergie à la conception du format des données et des liens qu'elles contiennent, et non à la documentation des URL à utiliser.<br />
<br />
Au lieu de documenter que vous devez envoyer une requête POST à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/users/123/activate</span>, votre API doit renvoyer une représentation de l'utilisateur dans un format compatible avec l'hypermédia (comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">application/hal+json</span> ou un type personnalisé comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">application/vnd.myapp.user+json</span>).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">{
  &quot;name&quot;: &quot;John Doe&quot;,
  &quot;status&quot;: &quot;inactive&quot;,
  &quot;_links&quot;: {
    &quot;self&quot;: { &quot;href&quot;: &quot;/users/123&quot; },
    &quot;activate&quot;: { &quot;href&quot;: &quot;/users/123/activate&quot;, &quot;method&quot;: &quot;POST&quot; }
  }
}</pre></td></tr></table></code><hr />
</div><br />
<br />
Le code client ne connaît pas le chemin /users/123/activate. Il sait seulement que le type de média définit une relation de lien « activate » et utilise le href et la méthode fournis dans la réponse pour effectuer l'action.<br />
<br />
<br />
<b>4. Ne codifiez pas en dur les structures d'URI</b><br />
<br />
Cette règle est la conséquence directe de la règle n° 3. Les clients ne doivent pas supposer ou coder en dur des chemins tels que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/users/123/posts</span>. Ils doivent plutôt découvrir les URI via les liens fournis par le serveur. Les clients doivent apprendre les URI de manière dynamique.<br />
<br />
Un client ne doit pas supposer que les publications d'un utilisateur se trouvent à l'adresse /users/123/posts. Il doit lire un lien comme celui-ci à partir de la ressource :<br />
<br />
<br />
<b>5. Évitez les « types » de ressources</b><br />
<br />
La classification interne d'une ressource par le serveur (par exemple, utilisateur ou administrateur) doit être totalement indépendante et invisible pour le client.<br />
<br />
Le client ne doit pas se soucier du type d'entité qu'une ressource représente en interne (comme utilisateur, administrateur, modérateur). Il doit uniquement se soucier du type de média (comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">application/json</span>) et des liens/actions qu'il voit.<br />
<br />
N'exposez pas les types d'objets ou les rôles internes. Envoyez simplement une réponse bien structurée avec des liens utiles. Ne demandez pas au client de savoir qu'une ressource est de type Admin. Donnez-lui simplement une réponse <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">application/json</span> cohérente avec des liens et des données pertinents.<br />
<br />
Par « noms de relations standardisés », il fait référence aux relations de liens enregistrées par l'IANA.<br />
<br />
<br />
<b>6. Commencez par un signet et suivez les liens</b><br />
<br />
Le client ne devrait avoir besoin que d'un seul point de départ (par exemple, une URL de base, un signet) et d'une connaissance des types de médias standard. Tout le reste (quoi faire, où aller) devrait provenir des réponses du serveur.<br />
<br />
Les clients doivent suivre les liens comme s'ils naviguaient sur un site web, en commençant par la page d'accueil et en cliquant sur les liens, sans coder en dur les chemins d'accès.<br />
<br />
Commencez par <a rel="nofollow" href="https://api.example.com/" target="_blank">https://api.example.com/</a> et suivez les liens dans chaque réponse :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">{
  &quot;_links&quot;: {
    &quot;user&quot;: { &quot;href&quot;: &quot;/users/123&quot; },
    &quot;orders&quot;: { &quot;href&quot;: &quot;/users/123/orders&quot; }
  }
}</pre></td></tr></table></code><hr />
</div><br />
<br />
Dans la pratique, très peu d'API respectent ces principes. La section suivante examine pourquoi.<br />
<br />
<b><font size="3">Pourquoi la plupart des API ne sont-elles pas véritablement RESTful ?</font></b><br />
<br />
L'adoption généralisée d'un style plus simple, similaire au RPC, sur HTTP peut probablement être attribuée à des compromis pratiques en matière d'outils et d'expérience des développeurs : l'écosystème autour de spécifications telles que OpenAPI s'est développé rapidement, offrant des avantages immédiats qui se sont avérés irrésistibles pour les équipes de développement. Ces outils offraient des fonctionnalités puissantes telles que la génération automatique de code client/serveur, une documentation interactive et la validation des requêtes prête à l'emploi. Pour une équipe soumise à la pression de livrer, le contrat clair et statique fourni par une définition OpenAPI était et est probablement encore souvent considéré comme « suffisant », rendant les avantages architecturaux à long terme de HATEOAS, tels que l'évolutivité, abstraits et moins urgents.<br />
<br />
De plus, la charge cognitive initiale liée à la création d'un client véritablement hypermédia était perçue comme un obstacle important. Il semblait plus facile pour un développeur de lire la documentation et de coder en dur un modèle d'URI tel que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">/users/{id}/orders</span> que d'écrire un client capable d'analyser dynamiquement une section <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">_links</span> et de découvrir l'URI « orders » lors de l'exécution.<br />
<br />
Dans de nombreux scénarios courants, tels que le développement d'une application frontale à page unique par la même équipe que le backend, le client et le serveur sont déjà étroitement couplés. Dans ce contexte, le principal problème que HATEOAS résout, à savoir le découplage du client de la structure URI du serveur, ne se présente pas comme un point sensible immédiat, ce qui fait de l'approche plus simple, basée sur la documentation, la voie la moins résistante.<br />
<br />
<br />
<b><font size="3">Conclusion</font></b><br />
<br />
Les règles de Fielding soulignent qu'une API véritablement RESTful doit adopter l'hypermédia (HATEOAS) comme mécanisme central d'interaction, et ne pas se contenter d'utiliser HTTP comme moyen de transport. REST est indépendant du protocole dans son essence ; HTTP est simplement un moyen pratique de l'utiliser. Les clients doivent découvrir et naviguer dans les ressources de manière dynamique grâce à des liens et des relations standardisées intégrés dans les représentations, sans dépendre de structures d'URI, de types ou de documentation externe codés en dur.<br />
<br />
Cela rend les systèmes REST faiblement couplés, évolutifs et alignés sur le fonctionnement du web lui-même : à travers la représentation, la découverte et les transitions. <b>REST ne consiste pas à exposer votre modèle d'objet interne via HTTP, mais à construire des systèmes distribués qui se comportent comme le web.</b><br />
<br />
<b>Par conséquent, soyez simplement pragmatique.</b> Personnellement, j'aime éviter le terme « RESTful » pour les raisons exposées dans l'article et préfère parler d'API basées sur « HTTP ». Construisez ce qui est logique pour <b>votre</b> projet et les consommateurs de votre API. Ignorez les dogmatiques qui prêchent ce que devraient être ou ne pas être les API RESTful. Une API doit avant tout être facile à apprendre et difficile à utiliser à mauvais escient. Si elle répond à ces critères, peu importe qu'elle soit RESTful ou non. Suivez la loi de Postel si cela est logique dans votre cas : « Soyez conservateur dans ce que vous faites, soyez libéral dans ce que vous acceptez des autres. ».<br />
<br />
Qui sont les utilisateurs de votre API ? Sera-t-elle facile à apprendre et à utiliser ? Son utilisation sera-t-elle intuitive ? Quelles sont les contraintes possibles ? Comment la versionnez-vous ? Quelles sont vos stratégies de dépréciation et de mise hors service ? Comment les modifications apportées à l'API sont-elles communiquées efficacement aux utilisateurs ? Ces éléments sont bien plus importants que le format réel de votre identifiant de ressource.<br />
<br />
En utilisant HATEOAS et en référençant des définitions de schéma (telles que XSD ou JSON Schema) à partir de vos représentations de ressources, vous pouvez permettre aux clients de comprendre la structure des données et de naviguer dans l'API de manière dynamique. Cela peut prendre en charge des clients génériques ou auto-adaptatifs. Si cela correspond à vos objectifs (par exemple, découplage des clients, évolutivité, interaction dynamique), alors c'est un choix de conception valable et puissant. Si vous créez une API publique pour des développeurs externes que vous ne contrôlez pas, investissez dans HATEOAS. Si vous créez un backend pour un seul frontend contrôlé par votre propre équipe, une API de type RPC plus simple peut être un choix plus pratique.<br />
<br />
:arrow: L'auteur Florian Krämer possède plus de 20 ans d'expérience professionnelle, avec une spécialisation dans l'architecture et la qualité du code, et est disponible pour des missions de conseil ou un poste d'architecte ou d'ingénieur.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://florian-kraemer.net//software-architecture/2025/07/07/Most-RESTful-APIs-are-not-really-RESTful.html" target="_blank">&quot;Most RESTful APIs aren't really RESTful&quot;</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cet avis est crédible ou pertinent ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://solutions-entreprise.developpez.com/actu/330515/Les-API-moins-les-bons-eleves-de-la-transformation-numerique-des-entreprises-par-Mourad-Jaakou-Presales-Manager-d-Axway/" target="_blank">Les API - les bons élèves de la transformation numérique des entreprises, par Mourad Jaakou, Presales Manager d'Axway</a><br />
<br />
:fleche: <a href="https://postgresql.developpez.com/actu/339925/PostgREST-un-serveur-web-autonome-qui-fournit-une-API-RESTful-a-partir-de-n-importe-quelle-base-de-donnees-PostgreSQL-il-permet-de-contourner-les-ORM/" target="_blank">PostgREST : un serveur web autonome qui fournit une API RESTful à partir de n'importe quelle base de données PostgreSQL, il permet de contourner les ORM</a><br />
<br />
:fleche: <a href="https://web.developpez.com/actu/349248/Hypertext-Transfer-Protocol-l-adoption-de-HTTP-3-croit-rapidement-d-apres-Robin-Marx-expert-en-protocoles-et-performances-web-chez-Akamai/" target="_blank">Hypertext Transfer Protocol : l'adoption de HTTP/3 croît rapidement, d'après Robin Marx, expert en protocoles et performances web chez Akamai</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>Florian Krämer</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178713/general-developpement/programmation-systeme/api-restful-ne-vraiment-restful-florian-kraemer/</guid>
		</item>
		<item>
			<title>Compilation 32 bit sur machine Linux 64 bit</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178009&amp;goto=newpost</link>
			<pubDate>Fri, 11 Jul 2025 10:21:16 GMT</pubDate>
			<description><![CDATA[Bonjour 
j'ai une vielle...]]></description>
			<content:encoded><![CDATA[<div>Bonjour<br />
j'ai une vielle machine 32 bit sur laquelle je voudrais utiliser un exécutable Linux ; sur ma machine 64 bit , tout matche bien en utilisant la commande<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">gcc -I /usr/include/python3.11 -o hmk1b32 hmk1b.c -lm -lpython3.11</code><hr />
</div><br />
en 32 bit j'ai transformé et j'ai une erreur suivant sortie écran suivante :<br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">$ <b>gcc -I /usr/include/python3.11 -o -m32  hmk1b32  hmk1b.c -lm -lpython3.11</b>

hmk1b.c: In function ‘__Pyx_main’:
hmk1b.c:176317:9: warning: ‘Py_SetProgramName’ is deprecated [-Wdeprecated-declarations]
176317 |         Py_SetProgramName(argv[0]);
       |         ^~~~~~~~~~~~~~~~~
In file included from /usr/include/python3.11/Python.h:94,
                 from hmk1b.c:6:
/usr/include/python3.11/pylifecycle.h:37:38: note: declared here
   37 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *);
      |                                      ^~~~~~~~~~~~~~~~~
hmk1b.c:176320:9: warning: ‘PySys_SetArgv’ is deprecated [-Wdeprecated-declarations]
176320 |         PySys_SetArgv(argc, argv);
       |         ^~~~~~~~~~~~~
In file included from /usr/include/python3.11/Python.h:96:
/usr/include/python3.11/sysmodule.h:13:38: note: declared here
   13 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
      |                                      ^~~~~~~~~~~~~
/usr/bin/ld*: mode d'émulation non reconnu*: 32
Émulations prises en charge*: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386pep i386pe
collect2: error: ld returned 1 exit status</pre></td></tr></table></code><hr />
</div><br />
<br />
note :j'ai installé les complements requis à savoir :  libc6-dev-i386-x32-cross , gcc-multilib , g++multilib  sur mon Linux Mx <br />
Toute suggestion sera la bienvenue ; j'ai essayé de remplacer m32 par melf_i386 sans succes</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>osenon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178009/general-developpement/programmation-systeme/compilation-32-bit-machine-linux-64-bit/</guid>
		</item>
		<item>
			<title><![CDATA[Rendre un accès partiel d'un programme]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177651&amp;goto=newpost</link>
			<pubDate>Sat, 21 Jun 2025 13:39:46 GMT</pubDate>
			<description>Bonjour, 
 
Actuellement je...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Actuellement je programme un MCU STmicroélectronics STM32G431 sous l'environnement du fabriquant IDE STM32CubeIDE et et MX et afin de permettre à l'utilisateur de faire ces réglages ou optimisation lui permettre l'accès à au moins deux fichiers .c et .h les autres fichiers reste illisible.<br />
Peut-être compiler une partie ?... Est faisable ?<br />
<br />
j'ai également l'interphase sous Delphi ?... sous lequel j'aimerai faire la même chose.<br />
<br />
Merci de vos recommandation</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1554/general-developpement/programmation-systeme/">Programmation système</category>
			<dc:creator>davidif</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177651/general-developpement/programmation-systeme/rendre-acces-partiel-d-programme/</guid>
		</item>
	</channel>
</rss>
