{"id":11599,"date":"2026-01-06T14:37:57","date_gmt":"2026-01-06T13:37:57","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=11599"},"modified":"2026-01-15T12:12:27","modified_gmt":"2026-01-15T11:12:27","slug":"web-service-fastapi","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=11599","title":{"rendered":"Web service : fastAPI"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Web service sous fastAPI (Janvier 2026)<\/h2>\n\n\n\n<p>Source Building Python Web APIs with FastAPI<\/p>\n\n\n\n<p>Premi\u00e8re mise en oeuvre d&#8217;un petit service avec Validation<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code><strong>api.py\n<\/strong>from fastapi import FastAPI\nfrom todo import todo_router\napp = FastAPI()\n\n@app.get(\"\/\")\nasync def welcome() -&gt; dict:\n    return { \"message\": \"Hello World\"}\napp.include_router(todo_router)\n<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code><strong>model.py\n<\/strong>from pydantic import BaseModel\nclass Todo(BaseModel):\n    id: int\n    item: str\n<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-code\"><code><strong>todo.py\n<\/strong>from fastapi import APIRouter\nfrom model import Todo\ntodo_router = APIRouter()\n\ntodo_list = &#91;]\n@todo_router.post(\"\/todo\")\nasync def add_todo(todo: Todo) -&gt; dict:\n    todo_list.append(todo)\n    return {\"message\": \"Todo added successfully\"}\n@todo_router.get(\"\/todo\")\nasync def retrieve_todos() -&gt; dict:\n    return {\"todos\": todo_list}\n<\/code><\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>Explication sur le fonctionnement et l&#8217;utilisation de ce web service tr\u00e8s simple <\/p>\n\n\n\n<p>Pour d\u00e9marrer et activer le web service utilisez la commande suivante : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>uvicorn api:app --port 8005 --reload<\/strong>\nINFO:     Will watch for changes in these directories: &#91;'\/home\/ystroppa\/fastAPI']\nINFO:     Uvicorn running on http:\/\/127.0.0.1:8005 (Press CTRL+C to quit)\nINFO:     Started reloader process &#91;22901] using StatReload\nINFO:     Started server process &#91;22903]\nINFO:     Waiting for application startup.\nINFO:     Application startup complete.\n<\/code><\/pre>\n\n\n\n<p>Utilisation et v\u00e9rification du fonctionnement <\/p>\n\n\n\n<p>A partir d&#8217;un autre terminal, on peut utiliser les instructions suivantes : <\/p>\n\n\n\n<p>Pour un ajout qui ne respecte par le mod\u00e8le d\u00e9finie <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X 'POST' 'http:\/\/127.0.0.1:8000\/todo' -H 'accept: application\/json'   -H 'Content-Type: application\/json' -d '{}'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color has-link-color wp-elements-2d10cc7980d90cd21a5a794ab236dadd\"><code>{\"detail\":&#91;{\"type\":\"missing\",\"loc\":&#91;\"body\",\"id\"],\"msg\":\"Field required\",\"input\":{}},{\"type\":\"missing\",\"loc\":&#91;\"body\",\"item\"],\"msg\":\"Field required\",\"input\":{}}]}<\/code><\/pre>\n\n\n\n<p>Pour un ajout d&#8217;un nouvel item qui respecte le mod\u00e8le d\u00e9finie <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> curl -X 'POST' 'http:\/\/127.0.0.1:8005\/todo' -H 'accept: application\/json'   -H 'Content-Type: application\/json' -d '{\"id\": 2,\"item\": \"Validation models help with input types\"}'\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color has-link-color wp-elements-0d4f788e6b4ca8791ce326a57986c94b\"><code>{\"message\":\"Todo added successfully\"}<\/code><\/pre>\n\n\n\n<p>Pour lister les items existants dans la dictionnaire interne <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> curl http:\/\/0.0.0.0:8005\/todo<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color has-link-color wp-elements-0356df1b0d63450a396199340eaad400\"><code>{\"todos\":&#91;{\"id\":2,\"item\":\"Validation models help with input types\"},{\"id\":2,\"item\":\"Validation models help with input types\"}]}<\/code><\/pre>\n\n\n\n<p>Petite explication : la v\u00e9rification et le contr\u00f4le de l&#8217;envoie des donn\u00e9es se fait \u00e0 l&#8217;aide de pydantic qui permet de convertir et de contr\u00f4ler les donn\u00e9es transmises.<\/p>\n\n\n\n<p>On peut \u00e9tendre le concept des mod\u00e8les par des structures nested (imbriqu\u00e9es) de la fa\u00e7on suivante : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Item(BaseModel)\n    item: str\n    status: str\nclass Todo(BaseModel)\n    id: int\n    item: Item<\/code><\/pre>\n\n\n\n<p>Ce qui nous permetrait de cr\u00e9er des structures de type  : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"id\": 1,\n  \"item\": {\n        \"item\": \"Nested models\",\n        \"Status\": \"completed\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>Chemin d&#8217;acc\u00e8s et requ\u00eate : si on souhaite extraire non pas la liste compl\u00e8te mais un item \u00e0 partir de son id il nous suffit de red\u00e9finir un chemin sp\u00e9cifique et d\u00e9di\u00e9 dans le fichier todo.py ce qui nous donne <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from fastapi import APIRouter, <strong>Path<\/strong>\nfrom model import Todo\ntodo_router = APIRouter()\ntodo_list = &#91;]\n@todo_router.post(\"\/todo\")\nasync def add_todo(todo: Todo) -&gt; dict:\n    todo_list.append(todo)\n    return {\n        \"message\": \"Todo added successfully.\"\n    }\n@todo_router.get(\"\/todo\")\nasync def retrieve_todo() -&gt; dict:\n    return {\n        \"todos\": todo_list\n    }\n<strong>@todo_router.get(\"\/todo\/{todo_id}\")\nasync def get_single_todo(todo_id: int = Path(..., title=\"The ID of the todo to retrieve.\")) -&gt; dict:\n    for todo in todo_list:\n        if todo.id == todo_id:\n            return {\n                \"todo\": todo\n            }\n    return {\n        \"message\": \"Todo with supplied ID doesn't exist.\"\n    }<\/strong><\/code><\/pre>\n\n\n\n<p>Et pour r\u00e9cup\u00e9rer le contenu : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X 'GET' 'http:\/\/127.0.0.1:8005\/todo\/2' -H 'accept: application\/json'<\/code><\/pre>\n\n\n\n<p>On a de fa\u00e7on implicite swagger pour les acc\u00e8s aux descripteurs des fonctions <\/p>\n\n\n\n<p>On y acc\u00e8de par l&#8217;url suivante : <a href=\"http:\/\/localhost:8005\/docs#\/\">http:\/\/localhost:8005\/docs#\/<\/a> <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"442\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-06-16-40-00-1024x442.png\" alt=\"\" class=\"wp-image-11630\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-06-16-40-00-1024x442.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-06-16-40-00-300x130.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-06-16-40-00-768x332.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-06-16-40-00.png 1510w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Partie persistance :  voir aussi <a href=\"\/?page_id=11668\">lien<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Web service sous fastAPI (Janvier 2026) Source Building Python Web APIs with FastAPI Premi\u00e8re mise en oeuvre d&#8217;un petit service avec Validation Explication sur le fonctionnement et l&#8217;utilisation de ce web service tr\u00e8s simple Pour d\u00e9marrer et activer le web service utilisez la commande suivante : Utilisation et v\u00e9rification du fonctionnement A partir d&#8217;un autre [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11599","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11599"}],"version-history":[{"count":20,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11599\/revisions"}],"predecessor-version":[{"id":11682,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/11599\/revisions\/11682"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}