[{"data":1,"prerenderedAt":940},["ShallowReactive",2],{"page-\u002Fapi":3,"pieces-api":911,"autour-\u002Fapi":925,"prerequis-\u002Fapi":928,"plan-api":929},{"id":4,"title":5,"body":6,"description":883,"extension":884,"ligne":885,"meta":886,"motsCles":887,"navigation":894,"niveau":895,"path":896,"prerequis":897,"ressources":897,"seo":898,"sources":899,"stem":909,"__hash__":910},"docs\u002Fapi\u002Findex.md","API",{"type":7,"value":8,"toc":874},"minimark",[9,13,18,79,88,92,171,175,261,267,271,363,422,428,432,534,587,593,597,659,698,742,748,752,810,864,870],[10,11,12],"p",{},"Ce mémo résume l'essentiel des API avec Nuxt. Chaque section renvoie au chapitre qui l'explique en détail.",[14,15,17],"h2",{"id":16},"requête-et-réponse","Requête et réponse",[19,20,21,34],"table",{},[22,23,24],"thead",{},[25,26,27,31],"tr",{},[28,29,30],"th",{},"Élément",[28,32,33],{},"Exemple",[35,36,37,49,59,69],"tbody",{},[25,38,39,43],{},[40,41,42],"td",{},"Ligne de départ (requête)",[40,44,45],{},[46,47,48],"code",{},"GET \u002Fapi\u002Frecettes\u002F2 HTTP\u002F1.1",[25,50,51,54],{},[40,52,53],{},"Ligne de départ (réponse)",[40,55,56],{},[46,57,58],{},"HTTP\u002F1.1 200 OK",[25,60,61,64],{},[40,62,63],{},"En-tête",[40,65,66],{},[46,67,68],{},"Content-Type: application\u002Fjson",[25,70,71,74],{},[40,72,73],{},"Corps",[40,75,76],{},[46,77,78],{},"{ \"id\": 2, \"titre\": \"Ratatouille\" }",[10,80,81,82,87],{},"Détails : ",[83,84,86],"a",{"href":85},"\u002Fapi\u002Fcomprendre-les-api","Comprendre les API",".",[14,89,91],{"id":90},"méthodes","Méthodes",[19,93,94,107],{},[22,95,96],{},[25,97,98,101,104],{},[28,99,100],{},"Méthode",[28,102,103],{},"Intention",[28,105,106],{},"Idempotente",[35,108,109,122,135,147,159],{},[25,110,111,116,119],{},[40,112,113],{},[46,114,115],{},"GET",[40,117,118],{},"Lire",[40,120,121],{},"Oui",[25,123,124,129,132],{},[40,125,126],{},[46,127,128],{},"POST",[40,130,131],{},"Créer",[40,133,134],{},"Non",[25,136,137,142,145],{},[40,138,139],{},[46,140,141],{},"PUT",[40,143,144],{},"Remplacer",[40,146,121],{},[25,148,149,154,157],{},[40,150,151],{},[46,152,153],{},"PATCH",[40,155,156],{},"Modifier en partie",[40,158,134],{},[25,160,161,166,169],{},[40,162,163],{},[46,164,165],{},"DELETE",[40,167,168],{},"Supprimer",[40,170,121],{},[14,172,174],{"id":173},"codes-de-statut","Codes de statut",[19,176,177,187],{},[22,178,179],{},[25,180,181,184],{},[28,182,183],{},"Code",[28,185,186],{},"Sens",[35,188,189,197,205,213,221,229,237,245,253],{},[25,190,191,194],{},[40,192,193],{},"200",[40,195,196],{},"Réussite",[25,198,199,202],{},[40,200,201],{},"201",[40,203,204],{},"Ressource créée",[25,206,207,210],{},[40,208,209],{},"204",[40,211,212],{},"Réussite, sans contenu",[25,214,215,218],{},[40,216,217],{},"400",[40,219,220],{},"Requête invalide",[25,222,223,226],{},[40,224,225],{},"401",[40,227,228],{},"Non authentifié",[25,230,231,234],{},[40,232,233],{},"403",[40,235,236],{},"Pas le droit",[25,238,239,242],{},[40,240,241],{},"404",[40,243,244],{},"Introuvable",[25,246,247,250],{},[40,248,249],{},"429",[40,251,252],{},"Trop de requêtes",[25,254,255,258],{},[40,256,257],{},"500",[40,259,260],{},"Erreur du serveur",[10,262,81,263,87],{},[83,264,266],{"href":265},"\u002Fapi\u002Fmethodes-et-codes-de-statut","Méthodes et codes de statut",[14,268,270],{"id":269},"appeler-une-api-externe","Appeler une API externe",[272,273,278],"pre",{"className":274,"code":275,"language":276,"meta":277,"style":277},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","const { data } = await useFetch('https:\u002F\u002Fwww.themealdb.com\u002Fapi\u002Fjson\u002Fv1\u002F1\u002Fsearch.php', {\n  query: { s: 'Arrabiata' },\n  transform: reponse => reponse.meals ?? []\n})\n","ts","",[46,279,280,320,332,357],{"__ignoreMap":277},[281,282,285,289,293,297,300,303,306,310,313,317],"span",{"class":283,"line":284},"line",1,[281,286,288],{"class":287},"sOnC1","const",[281,290,292],{"class":291},"scfrF"," { ",[281,294,296],{"class":295},"s5iOY","data",[281,298,299],{"class":291}," } ",[281,301,302],{"class":287},"=",[281,304,305],{"class":287}," await",[281,307,309],{"class":308},"syCW7"," useFetch",[281,311,312],{"class":291},"(",[281,314,316],{"class":315},"shWOn","'https:\u002F\u002Fwww.themealdb.com\u002Fapi\u002Fjson\u002Fv1\u002F1\u002Fsearch.php'",[281,318,319],{"class":291},", {\n",[281,321,323,326,329],{"class":283,"line":322},2,[281,324,325],{"class":291},"  query: { s: ",[281,327,328],{"class":315},"'Arrabiata'",[281,330,331],{"class":291}," },\n",[281,333,335,338,341,345,348,351,354],{"class":283,"line":334},3,[281,336,337],{"class":308},"  transform",[281,339,340],{"class":291},": ",[281,342,344],{"class":343},"sIXEE","reponse",[281,346,347],{"class":287}," =>",[281,349,350],{"class":291}," reponse.meals ",[281,352,353],{"class":287},"??",[281,355,356],{"class":291}," []\n",[281,358,360],{"class":283,"line":359},4,[281,361,362],{"class":291},"})\n",[19,364,365,375],{},[22,366,367],{},[25,368,369,372],{},[28,370,371],{},"Besoin",[28,373,374],{},"Outil",[35,376,377,387,401,412],{},[25,378,379,382],{},[40,380,381],{},"Charger dans une page",[40,383,384],{},[46,385,386],{},"useFetch",[25,388,389,392],{},[40,390,391],{},"Clic ou formulaire",[40,393,394,397,398],{},[46,395,396],{},"$fetch"," avec ",[46,399,400],{},"try\u002Fcatch",[25,402,403,406],{},[40,404,405],{},"Ne garder que l'utile",[40,407,408,409],{},"option ",[46,410,411],{},"transform",[25,413,414,417],{},[40,415,416],{},"Paramètres d'adresse",[40,418,408,419],{},[46,420,421],{},"query",[10,423,81,424,87],{},[83,425,427],{"href":426},"\u002Fapi\u002Fconsommer-une-api-externe","Consommer une API externe",[14,429,431],{"id":430},"cacher-une-clé","Cacher une clé",[272,433,436],{"className":274,"code":434,"filename":435,"language":276,"meta":277,"style":277},"export default defineEventHandler(async (event) => {\n  const config = useRuntimeConfig(event)\n  return await $fetch('https:\u002F\u002Fapi.exemple-photos.test\u002Fplats', {\n    headers: { Authorization: `Bearer ${config.cleExemple}` }\n  })\n})\n","server\u002Fapi\u002Fphotos.get.ts",[46,437,438,463,480,497,519,525],{"__ignoreMap":277},[281,439,440,443,446,449,451,454,457,460],{"class":283,"line":284},[281,441,442],{"class":287},"export",[281,444,445],{"class":287}," default",[281,447,448],{"class":308}," defineEventHandler",[281,450,312],{"class":343},[281,452,453],{"class":287},"async",[281,455,456],{"class":343}," (event) ",[281,458,459],{"class":287},"=>",[281,461,462],{"class":291}," {\n",[281,464,465,468,471,474,477],{"class":283,"line":322},[281,466,467],{"class":287},"  const",[281,469,470],{"class":295}," config",[281,472,473],{"class":287}," =",[281,475,476],{"class":308}," useRuntimeConfig",[281,478,479],{"class":291},"(event)\n",[281,481,482,485,487,490,492,495],{"class":283,"line":334},[281,483,484],{"class":287},"  return",[281,486,305],{"class":287},[281,488,489],{"class":308}," $fetch",[281,491,312],{"class":291},[281,493,494],{"class":315},"'https:\u002F\u002Fapi.exemple-photos.test\u002Fplats'",[281,496,319],{"class":291},[281,498,499,502,505,508,510,513,516],{"class":283,"line":359},[281,500,501],{"class":291},"    headers: { Authorization: ",[281,503,504],{"class":315},"`Bearer ${",[281,506,507],{"class":291},"config",[281,509,87],{"class":315},[281,511,512],{"class":291},"cleExemple",[281,514,515],{"class":315},"}`",[281,517,518],{"class":291}," }\n",[281,520,522],{"class":283,"line":521},5,[281,523,524],{"class":291},"  })\n",[281,526,528,531],{"class":283,"line":527},6,[281,529,530],{"class":291},"}",[281,532,533],{"class":343},")\n",[19,535,536,546],{},[22,537,538],{},[25,539,540,543],{},[28,541,542],{},"Où",[28,544,545],{},"Règle",[35,547,548,562,575],{},[25,549,550,559],{},[40,551,552,555,556],{},[46,553,554],{},"runtimeConfig"," hors ",[46,557,558],{},"public",[40,560,561],{},"Visible côté serveur seulement",[25,563,564,569],{},[40,565,566],{},[46,567,568],{},".env",[40,570,571,574],{},[46,572,573],{},"NUXT_CLE_EXEMPLE=...",", jamais commité",[25,576,577,580],{},[40,578,579],{},"La page",[40,581,582,583,586],{},"Appelle ",[46,584,585],{},"\u002Fapi\u002Fphotos",", jamais le service",[10,588,81,589,87],{},[83,590,592],{"href":591},"\u002Fapi\u002Fcacher-une-cle-d-api","Cacher une clé d'API",[14,594,596],{"id":595},"écrire-une-api","Écrire une API",[19,598,599,609],{},[22,600,601],{},[25,602,603,606],{},[28,604,605],{},"Fichier",[28,607,608],{},"Requête",[35,610,611,623,635,647],{},[25,612,613,618],{},[40,614,615],{},[46,616,617],{},"server\u002Fapi\u002Frecettes\u002Findex.get.ts",[40,619,620],{},[46,621,622],{},"GET \u002Fapi\u002Frecettes",[25,624,625,630],{},[40,626,627],{},[46,628,629],{},"server\u002Fapi\u002Frecettes\u002Findex.post.ts",[40,631,632],{},[46,633,634],{},"POST \u002Fapi\u002Frecettes",[25,636,637,642],{},[40,638,639],{},[46,640,641],{},"server\u002Fapi\u002Frecettes\u002F[id].patch.ts",[40,643,644],{},[46,645,646],{},"PATCH \u002Fapi\u002Frecettes\u002F2",[25,648,649,654],{},[40,650,651],{},[46,652,653],{},"server\u002Fapi\u002Frecettes\u002F[id].delete.ts",[40,655,656],{},[46,657,658],{},"DELETE \u002Fapi\u002Frecettes\u002F2",[272,660,662],{"className":274,"code":661,"language":276,"meta":277,"style":277},"throw createError({ status: 404, statusText: 'Recette introuvable' })\nsetResponseStatus(event, 201)\n",[46,663,664,686],{"__ignoreMap":277},[281,665,666,669,672,675,677,680,683],{"class":283,"line":284},[281,667,668],{"class":287},"throw",[281,670,671],{"class":308}," createError",[281,673,674],{"class":291},"({ status: ",[281,676,241],{"class":295},[281,678,679],{"class":291},", statusText: ",[281,681,682],{"class":315},"'Recette introuvable'",[281,684,685],{"class":291}," })\n",[281,687,688,691,694,696],{"class":283,"line":322},[281,689,690],{"class":308},"setResponseStatus",[281,692,693],{"class":291},"(event, ",[281,695,201],{"class":295},[281,697,533],{"class":291},[19,699,700,710],{},[22,701,702],{},[25,703,704,707],{},[28,705,706],{},"Fonction",[28,708,709],{},"Rôle",[35,711,712,722,732],{},[25,713,714,719],{},[40,715,716],{},[46,717,718],{},"getRouterParam(event, 'id')",[40,720,721],{},"Paramètre d'adresse",[25,723,724,729],{},[40,725,726],{},[46,727,728],{},"getQuery(event)",[40,730,731],{},"Paramètres de requête",[25,733,734,739],{},[40,735,736],{},[46,737,738],{},"readBody(event)",[40,740,741],{},"Corps envoyé",[10,743,81,744,87],{},[83,745,747],{"href":746},"\u002Fapi\u002Fecrire-une-api-complete","Écrire une API complète",[14,749,751],{"id":750},"sécurité","Sécurité",[272,753,756],{"className":274,"code":754,"filename":755,"language":276,"meta":277,"style":277},"export default defineNuxtConfig({\n  routeRules: {\n    '\u002Fapi\u002F**': { cors: true },\n    '\u002Fapi\u002Frecettes': { swr: 60 }\n  }\n})\n","nuxt.config.ts",[46,757,758,770,775,788,801,806],{"__ignoreMap":277},[281,759,760,762,764,767],{"class":283,"line":284},[281,761,442],{"class":287},[281,763,445],{"class":287},[281,765,766],{"class":308}," defineNuxtConfig",[281,768,769],{"class":343},"({\n",[281,771,772],{"class":283,"line":322},[281,773,774],{"class":291},"  routeRules: {\n",[281,776,777,780,783,786],{"class":283,"line":334},[281,778,779],{"class":315},"    '\u002Fapi\u002F**'",[281,781,782],{"class":291},": { cors: ",[281,784,785],{"class":295},"true",[281,787,331],{"class":291},[281,789,790,793,796,799],{"class":283,"line":359},[281,791,792],{"class":315},"    '\u002Fapi\u002Frecettes'",[281,794,795],{"class":291},": { swr: ",[281,797,798],{"class":295},"60",[281,800,518],{"class":291},[281,802,803],{"class":283,"line":521},[281,804,805],{"class":291},"  }\n",[281,807,808],{"class":283,"line":527},[281,809,362],{"class":343},[19,811,812,822],{},[22,813,814],{},[25,815,816,819],{},[28,817,818],{},"Sujet",[28,820,821],{},"Réflexe",[35,823,824,832,840,848,856],{},[25,825,826,829],{},[40,827,828],{},"Entrées",[40,830,831],{},"Toujours valider côté serveur",[25,833,834,837],{},[40,835,836],{},"Accès",[40,838,839],{},"Middleware : 401 sans identité, 403 sans droit",[25,841,842,845],{},[40,843,844],{},"CORS",[40,846,847],{},"Ouvrir seulement à l'origine voulue",[25,849,850,853],{},[40,851,852],{},"Cache",[40,854,855],{},"Jamais de données personnelles",[25,857,858,861],{},[40,859,860],{},"Abus",[40,862,863],{},"Pagination, limitation de débit (429)",[10,865,81,866,87],{},[83,867,869],{"href":868},"\u002Fapi\u002Fsecurite-et-limites","Sécurité et limites",[871,872,873],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}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 .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}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":277,"searchDepth":322,"depth":334,"links":875},[876,877,878,879,880,881,882],{"id":16,"depth":322,"text":17},{"id":90,"depth":322,"text":91},{"id":173,"depth":322,"text":174},{"id":269,"depth":322,"text":270},{"id":430,"depth":322,"text":431},{"id":595,"depth":322,"text":596},{"id":750,"depth":322,"text":751},"Le mémo des API web avec Nuxt : HTTP, méthodes et codes, appels externes, clés secrètes, CRUD, validation et sécurité.","md","api",{},[888,889,5,890,891,386,554,892,844,893],"mémo","aide-mémoire","HTTP","JSON","createError","routeRules",true,"memo","\u002Fapi",null,{"title":5,"description":883},[900,903,906],{"nom":901,"url":902},"Le dossier server de Nuxt (en anglais)","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fserver",{"nom":904,"url":905},"Méthodes de requête HTTP (MDN)","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FMethods",{"nom":907,"url":908},"Codes de statut de réponse HTTP (MDN)","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FStatus","api\u002Findex","enTJayAIBmpbuUT0w_9xaX8e6Kw9mc_xFFxwdk5L2xU",[912,914,916,918,920,922,924],{"path":85,"title":86,"stem":913},"api\u002F01.comprendre-les-api",{"path":265,"title":266,"stem":915},"api\u002F02.methodes-et-codes-de-statut",{"path":426,"title":427,"stem":917},"api\u002F03.consommer-une-api-externe",{"path":591,"title":592,"stem":919},"api\u002F04.cacher-une-cle-d-api",{"path":746,"title":747,"stem":921},"api\u002F05.ecrire-une-api-complete",{"path":868,"title":869,"stem":923},"api\u002F06.securite-et-limites",{"path":896,"title":5,"stem":909},[897,926],{"title":86,"path":85,"stem":913,"description":927,"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.",[],[930,932,933,934,936,937,939],{"path":85,"title":86,"niveau":931,"stem":913},"debutant",{"path":265,"title":266,"niveau":931,"stem":915},{"path":426,"title":427,"niveau":931,"stem":917},{"path":591,"title":592,"niveau":935,"stem":919},"intermediaire",{"path":746,"title":747,"niveau":935,"stem":921},{"path":868,"title":869,"niveau":938,"stem":923},"avance",{"path":896,"title":5,"niveau":895,"stem":909},1794583430608]