[{"data":1,"prerenderedAt":678},["ShallowReactive",2],{"page-\u002Fapi\u002Fmethodes-et-codes-de-statut":3,"pieces-api":635,"autour-\u002Fapi\u002Fmethodes-et-codes-de-statut":660,"prerequis-\u002Fapi\u002Fmethodes-et-codes-de-statut":665,"plan-api":667},{"id":4,"title":5,"body":6,"description":601,"extension":602,"ligne":603,"meta":604,"motsCles":605,"navigation":608,"niveau":609,"path":610,"prerequis":611,"ressources":613,"seo":625,"sources":626,"stem":633,"__hash__":634},"docs\u002Fapi\u002F02.methodes-et-codes-de-statut.md","Méthodes et codes de statut",{"type":7,"value":8,"toc":592},"minimark",[9,14,32,36,45,147,161,165,184,187,191,198,244,247,374,380,384,387,397,400,404,409,501,515,536,540,588],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,24],"ul",{},[18,19,20],"li",{},"Les cinq méthodes courantes et ce que chacune exprime.",[18,22,23],{},"Les codes de statut à connaître et leurs familles.",[18,25,26,27,31],{},"Comment l'API de ton site de recettes les combine, et un piège de ",[28,29,30],"code",{},"fetch",".",[10,33,35],{"id":34},"la-méthode-dit-lintention","La méthode dit l'intention",[37,38,39,40,44],"p",{},"Dans une requête, la ",[41,42,43],"strong",{},"méthode"," indique ce que tu veux faire de la ressource visée. La même adresse peut répondre différemment selon la méthode.",[46,47,48,64],"table",{},[49,50,51],"thead",{},[52,53,54,58,61],"tr",{},[55,56,57],"th",{},"Méthode",[55,59,60],{},"Intention",[55,62,63],{},"Exemple sur le site de recettes",[65,66,67,84,100,116,132],"tbody",{},[52,68,69,75,78],{},[70,71,72],"td",{},[28,73,74],{},"GET",[70,76,77],{},"Lire",[70,79,80,83],{},[28,81,82],{},"GET \u002Fapi\u002Frecettes"," : la liste",[52,85,86,91,94],{},[70,87,88],{},[28,89,90],{},"POST",[70,92,93],{},"Créer (ou déclencher une action)",[70,95,96,99],{},[28,97,98],{},"POST \u002Fapi\u002Frecettes"," : ajouter une recette",[52,101,102,107,110],{},[70,103,104],{},[28,105,106],{},"PUT",[70,108,109],{},"Remplacer entièrement",[70,111,112,115],{},[28,113,114],{},"PUT \u002Fapi\u002Frecettes\u002F2"," : nouvelle version complète",[52,117,118,123,126],{},[70,119,120],{},[28,121,122],{},"PATCH",[70,124,125],{},"Modifier en partie",[70,127,128,131],{},[28,129,130],{},"PATCH \u002Fapi\u002Frecettes\u002F2"," : changer seulement la durée",[52,133,134,139,142],{},[70,135,136],{},[28,137,138],{},"DELETE",[70,140,141],{},"Supprimer",[70,143,144],{},[28,145,146],{},"DELETE \u002Fapi\u002Frecettes\u002F2",[37,148,149,150,152,153,155,156,158,159,31],{},"Une requête ",[28,151,74],{}," ne doit pas contenir de corps. Les corps servent à ",[28,154,90],{},", ",[28,157,106],{}," et ",[28,160,122],{},[10,162,164],{"id":163},"idempotent-ou-pas","Idempotent ou pas",[37,166,167,168,171,172,155,174,158,176,178,179,158,181,183],{},"Une méthode est ",[41,169,170],{},"idempotente"," quand l'envoyer dix fois produit le même effet que l'envoyer une fois. D'après MDN, ",[28,173,74],{},[28,175,106],{},[28,177,138],{}," le sont, ",[28,180,90],{},[28,182,122],{}," non.",[37,185,186],{},"Concrètement : supprimer deux fois la recette 2 laisse le même état final. Poster deux fois « Crêpes » crée deux recettes.",[10,188,190],{"id":189},"le-code-de-statut-dit-le-résultat","Le code de statut dit le résultat",[37,192,193,194,197],{},"La réponse commence par un ",[41,195,196],{},"code de statut"," à trois chiffres. Le premier chiffre donne la famille.",[46,199,200,210],{},[49,201,202],{},[52,203,204,207],{},[55,205,206],{},"Famille",[55,208,209],{},"Sens",[65,211,212,220,228,236],{},[52,213,214,217],{},[70,215,216],{},"2xx",[70,218,219],{},"Réussite",[52,221,222,225],{},[70,223,224],{},"3xx",[70,226,227],{},"Redirection",[52,229,230,233],{},[70,231,232],{},"4xx",[70,234,235],{},"Erreur du client (ta requête est à corriger)",[52,237,238,241],{},[70,239,240],{},"5xx",[70,242,243],{},"Erreur du serveur (le problème est de son côté)",[37,245,246],{},"Les codes que tu croiseras le plus, avec leur sens selon MDN :",[46,248,249,262],{},[49,250,251],{},[52,252,253,256,259],{},[55,254,255],{},"Code",[55,257,258],{},"Nom",[55,260,261],{},"Quand",[65,263,264,275,286,297,308,319,330,341,352,363],{},[52,265,266,269,272],{},[70,267,268],{},"200",[70,270,271],{},"OK",[70,273,274],{},"La requête a réussi",[52,276,277,280,283],{},[70,278,279],{},"201",[70,281,282],{},"Created",[70,284,285],{},"Une ressource a été créée",[52,287,288,291,294],{},[70,289,290],{},"204",[70,292,293],{},"No Content",[70,295,296],{},"Réussite, rien à renvoyer",[52,298,299,302,305],{},[70,300,301],{},"400",[70,303,304],{},"Bad Request",[70,306,307],{},"Requête mal formée",[52,309,310,313,316],{},[70,311,312],{},"401",[70,314,315],{},"Unauthorized",[70,317,318],{},"Il faut s'authentifier",[52,320,321,324,327],{},[70,322,323],{},"403",[70,325,326],{},"Forbidden",[70,328,329],{},"Pas les droits d'accès",[52,331,332,335,338],{},[70,333,334],{},"404",[70,336,337],{},"Not Found",[70,339,340],{},"Ressource introuvable",[52,342,343,346,349],{},[70,344,345],{},"405",[70,347,348],{},"Method Not Allowed",[70,350,351],{},"Méthode non prise en charge ici",[52,353,354,357,360],{},[70,355,356],{},"429",[70,358,359],{},"Too Many Requests",[70,361,362],{},"Trop de requêtes en peu de temps",[52,364,365,368,371],{},[70,366,367],{},"500",[70,369,370],{},"Internal Server Error",[70,372,373],{},"Le serveur a rencontré un cas qu'il ne gère pas",[375,376,377],"tip",{},[37,378,379],{},"Retiens la différence entre 401 et 403 : 401 veut dire « identifie-toi », 403 « tu n'as pas le droit ».",[10,381,383],{"id":382},"un-exemple-complet","Un exemple complet",[37,385,386],{},"Voici les échanges d'une API de recettes bien conçue, avec méthode, adresse et code attendu :",[388,389,394],"pre",{"className":390,"code":392,"language":393},[391],"language-text","GET    \u002Fapi\u002Frecettes        ->  200  la liste\nGET    \u002Fapi\u002Frecettes\u002F99     ->  404  recette inexistante\nPOST   \u002Fapi\u002Frecettes        ->  201  recette créée\nPOST   \u002Fapi\u002Frecettes (vide) ->  400  titre manquant\nDELETE \u002Fapi\u002Frecettes\u002F2      ->  204  supprimée, rien à renvoyer\nPUT    \u002Fapi\u002Frecettes        ->  405  méthode non prévue\n","text",[28,395,392],{"__ignoreMap":396},"",[37,398,399],{},"Tu écriras cette API au chapitre 5. Le bon code aide le client : il sait s'il doit corriger sa requête (4xx) ou réessayer plus tard (5xx).",[10,401,403],{"id":402},"le-piège-de-fetch","Le piège de fetch",[37,405,406,408],{},[28,407,30],{},", la fonction native du navigateur, ne considère pas un 404 ou un 500 comme une erreur. La promesse n'est rejetée que pour les vraies pannes, comme un réseau coupé. Il faut tester toi-même :",[388,410,414],{"className":411,"code":412,"language":413,"meta":396,"style":396},"language-js shiki shiki-themes github-light-default github-dark-default github-dark-default","const reponse = await fetch('\u002Fapi\u002Frecettes\u002F99')\nif (!reponse.ok) {\n  throw new Error(`Statut de réponse : ${reponse.status}`)\n}\n","js",[28,415,416,450,465,495],{"__ignoreMap":396},[417,418,421,425,429,432,435,439,443,447],"span",{"class":419,"line":420},"line",1,[417,422,424],{"class":423},"sOnC1","const",[417,426,428],{"class":427},"s5iOY"," reponse",[417,430,431],{"class":423}," =",[417,433,434],{"class":423}," await",[417,436,438],{"class":437},"syCW7"," fetch",[417,440,442],{"class":441},"scfrF","(",[417,444,446],{"class":445},"shWOn","'\u002Fapi\u002Frecettes\u002F99'",[417,448,449],{"class":441},")\n",[417,451,453,456,459,462],{"class":419,"line":452},2,[417,454,455],{"class":423},"if",[417,457,458],{"class":441}," (",[417,460,461],{"class":423},"!",[417,463,464],{"class":441},"reponse.ok) {\n",[417,466,468,471,474,477,479,482,485,487,490,493],{"class":419,"line":467},3,[417,469,470],{"class":423},"  throw",[417,472,473],{"class":423}," new",[417,475,476],{"class":437}," Error",[417,478,442],{"class":441},[417,480,481],{"class":445},"`Statut de réponse : ${",[417,483,484],{"class":441},"reponse",[417,486,31],{"class":445},[417,488,489],{"class":441},"status",[417,491,492],{"class":445},"}`",[417,494,449],{"class":441},[417,496,498],{"class":419,"line":497},4,[417,499,500],{"class":441},"}\n",[37,502,503,506,507,510,511,514],{},[28,504,505],{},"reponse.ok"," vaut ",[28,508,509],{},"true"," pour les codes 2xx, et ",[28,512,513],{},"reponse.status"," donne le code.",[516,517,518],"note",{},[37,519,520,158,523,526,527,530,531,31],{},[28,521,522],{},"useFetch",[28,524,525],{},"$fetch"," de Nuxt se chargent de ce test pour les réponses en erreur : tu lis ",[28,528,529],{},"error"," sans comparer le statut à la main, comme dans le cours ",[532,533,535],"a",{"href":534},"\u002Fnuxt\u002Frecuperer-des-donnees","Récupérer des données",[10,537,539],{"id":538},"à-retenir","À retenir",[15,541,542,560,573,576,579],{},[18,543,544,545,547,548,550,551,553,554,556,557,559],{},"La méthode exprime l'intention : ",[28,546,74],{}," lit, ",[28,549,90],{}," crée, ",[28,552,106],{}," remplace, ",[28,555,122],{}," modifie en partie, ",[28,558,138],{}," supprime.",[18,561,562,155,564,158,566,568,569,158,571,183],{},[28,563,74],{},[28,565,106],{},[28,567,138],{}," sont idempotentes, ",[28,570,90],{},[28,572,122],{},[18,574,575],{},"Les codes 2xx disent la réussite, 4xx une erreur du client, 5xx une erreur du serveur.",[18,577,578],{},"Utilise 201 pour une création, 204 sans contenu, 400 pour une entrée invalide, 404 pour l'absent.",[18,580,581,582,584,585,587],{},"Avec ",[28,583,30],{}," natif, teste ",[28,586,505],{}," : un 404 ne déclenche pas d'erreur tout seul.",[589,590,591],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":396,"searchDepth":452,"depth":467,"links":593},[594,595,596,597,598,599,600],{"id":12,"depth":452,"text":13},{"id":34,"depth":452,"text":35},{"id":163,"depth":452,"text":164},{"id":189,"depth":452,"text":190},{"id":382,"depth":452,"text":383},{"id":402,"depth":452,"text":403},{"id":538,"depth":452,"text":539},"Choisir la bonne méthode HTTP (GET, POST, PUT, PATCH, DELETE) et lire les codes de réponse pour savoir ce qui s'est passé.","md","api",{},[74,90,106,122,138,196,268,334,606,607],"idempotent","REST",true,"debutant","\u002Fapi\u002Fmethodes-et-codes-de-statut",[612],"\u002Fapi\u002Fcomprendre-les-api",[614,618,621],{"nom":615,"url":616,"type":617},"Méthodes de requête HTTP sur MDN","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FMethods","doc",{"nom":619,"url":620,"type":617},"Codes de statut de réponse HTTP sur MDN","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FStatus",{"nom":622,"url":623,"type":624},"Utiliser l'API Fetch sur MDN","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FAPI\u002FFetch_API\u002FUsing_Fetch","cours",{"title":5,"description":601},[627,629,631],{"nom":628,"url":616},"Méthodes de requête HTTP (MDN)",{"nom":630,"url":620},"Codes de statut de réponse HTTP (MDN)",{"nom":632,"url":623},"Utiliser l'API Fetch (MDN)","api\u002F02.methodes-et-codes-de-statut","NAs3-2-tUPEX05NdzP0vqYnVUCfVMC2hiKS9UhX9J-o",[636,639,640,644,648,652,656],{"path":612,"title":637,"stem":638},"Comprendre les API","api\u002F01.comprendre-les-api",{"path":610,"title":5,"stem":633},{"path":641,"title":642,"stem":643},"\u002Fapi\u002Fconsommer-une-api-externe","Consommer une API externe","api\u002F03.consommer-une-api-externe",{"path":645,"title":646,"stem":647},"\u002Fapi\u002Fcacher-une-cle-d-api","Cacher une clé d'API","api\u002F04.cacher-une-cle-d-api",{"path":649,"title":650,"stem":651},"\u002Fapi\u002Fecrire-une-api-complete","Écrire une API complète","api\u002F05.ecrire-une-api-complete",{"path":653,"title":654,"stem":655},"\u002Fapi\u002Fsecurite-et-limites","Sécurité et limites","api\u002F06.securite-et-limites",{"path":657,"title":658,"stem":659},"\u002Fapi","API","api\u002Findex",[661,663],{"title":637,"path":612,"stem":638,"description":662,"children":-1},"Ce qu'est une API web, comment une requête HTTP et sa réponse en JSON s'échangent, et comment les observer dans ton navigateur.",{"title":642,"path":641,"stem":643,"description":664,"children":-1},"Appeler une API publique depuis Nuxt, transformer sa réponse pour ne garder que l'utile et gérer les erreurs et les paramètres.",[666],{"path":612,"title":637,"ligne":603},[668,669,670,671,673,674,676],{"path":612,"title":637,"niveau":609,"stem":638},{"path":610,"title":5,"niveau":609,"stem":633},{"path":641,"title":642,"niveau":609,"stem":643},{"path":645,"title":646,"niveau":672,"stem":647},"intermediaire",{"path":649,"title":650,"niveau":672,"stem":651},{"path":653,"title":654,"niveau":675,"stem":655},"avance",{"path":657,"title":658,"niveau":677,"stem":659},"memo",1794583449635]