[{"data":1,"prerenderedAt":2199},["ShallowReactive",2],{"$fen922M9aBBBGS7gEr37q12a4sAhxXmwCENBD1e0zskM":3,"\u002Fdocs\u002Fmanual\u002Fdata\u002Fhttp":311,"\u002Fdocs\u002Fmanual\u002Fdata\u002Fhttp-surround":2194},[4,22,110,178,200,300],{"title":5,"titleTemplate":6,"icon":7,"redirect":8,"path":9,"stem":10,"children":11,"page":21},"起步指南",null,"i-lucide:rocket","\u002Fdocs\u002Fguide\u002Fintroduction","\u002Fdocs\u002Fguide","docs\u002F1.guide",[12,16],{"title":13,"path":8,"stem":14,"titleTemplate":6,"icon":15},"介绍","docs\u002F1.guide\u002F01.introduction","i-lucide:bot",{"title":17,"path":18,"stem":19,"titleTemplate":6,"icon":20},"安装","\u002Fdocs\u002Fguide\u002Finstallation","docs\u002F1.guide\u002F02.installation","i-lucide:download",false,{"title":23,"path":24,"stem":25,"children":26,"titleTemplate":6,"icon":29},"使用手册","\u002Fdocs\u002Fmanual","docs\u002F2.manual\u002F00.index",[27,30,35,40,57,78,99],{"title":23,"path":24,"stem":25,"titleTemplate":28,"icon":29},"%s | Oiyo","i-lucide:book-open-check",{"title":31,"path":32,"stem":33,"titleTemplate":6,"icon":34},"工程接入","\u002Fdocs\u002Fmanual\u002Fengineering","docs\u002F2.manual\u002F01.engineering","i-lucide:plug",{"title":36,"path":37,"stem":38,"titleTemplate":6,"icon":39},"配置系统","\u002Fdocs\u002Fmanual\u002Fconfiguration","docs\u002F2.manual\u002F02.configuration","i-lucide:sliders-horizontal",{"title":41,"titleTemplate":6,"defaultOpen":42,"icon":43,"path":44,"stem":45,"children":46,"page":21},"扫描导入",true,"i-lucide:scan-line","\u002Fdocs\u002Fmanual\u002Fscan","docs\u002F2.manual\u002F03.scan",[47,52],{"title":48,"path":49,"stem":50,"titleTemplate":6,"icon":51},"API 导入","\u002Fdocs\u002Fmanual\u002Fscan\u002Fapi","docs\u002F2.manual\u002F03.scan\u002F01.api","i-lucide:import",{"title":53,"path":54,"stem":55,"titleTemplate":6,"icon":56},"组件注册","\u002Fdocs\u002Fmanual\u002Fscan\u002Fcomponents","docs\u002F2.manual\u002F03.scan\u002F02.components","i-lucide:blocks",{"title":58,"titleTemplate":6,"defaultOpen":42,"icon":59,"path":60,"stem":61,"children":62,"page":21},"路由系统","i-lucide:map","\u002Fdocs\u002Fmanual\u002Fpage","docs\u002F2.manual\u002F04.page",[63,68,73],{"title":64,"path":65,"stem":66,"titleTemplate":6,"icon":67},"页面注册","\u002Fdocs\u002Fmanual\u002Fpage\u002Fregister","docs\u002F2.manual\u002F04.page\u002F01.register","i-lucide:file-box",{"title":69,"path":70,"stem":71,"titleTemplate":6,"icon":72},"页面元信息","\u002Fdocs\u002Fmanual\u002Fpage\u002Fmeta","docs\u002F2.manual\u002F04.page\u002F02.meta","i-lucide:file-cog",{"title":74,"path":75,"stem":76,"titleTemplate":6,"icon":77},"全局页面配置","\u002Fdocs\u002Fmanual\u002Fpage\u002Fconfig","docs\u002F2.manual\u002F04.page\u002F03.config","i-lucide:palette",{"title":79,"titleTemplate":6,"defaultOpen":42,"icon":80,"path":81,"stem":82,"children":83,"page":21},"视图结构","i-lucide:panels-top-left","\u002Fdocs\u002Fmanual\u002Fshell","docs\u002F2.manual\u002F05.shell",[84,89,94],{"title":85,"path":86,"stem":87,"titleTemplate":6,"icon":88},"应用骨架","\u002Fdocs\u002Fmanual\u002Fshell\u002Fapp-shell","docs\u002F2.manual\u002F05.shell\u002F01.app-shell","i-lucide:app-window",{"title":90,"path":91,"stem":92,"titleTemplate":6,"icon":93},"根上下文","\u002Fdocs\u002Fmanual\u002Fshell\u002Froot-context","docs\u002F2.manual\u002F05.shell\u002F02.root-context","i-lucide:network",{"title":95,"path":96,"stem":97,"titleTemplate":6,"icon":98},"布局系统","\u002Fdocs\u002Fmanual\u002Fshell\u002Flayout","docs\u002F2.manual\u002F05.shell\u002F03.layout","i-lucide:layout-template",{"title":100,"titleTemplate":6,"defaultOpen":42,"icon":101,"path":102,"stem":103,"children":104,"page":21},"数据获取","i-lucide:arrow-down-up","\u002Fdocs\u002Fmanual\u002Fdata","docs\u002F2.manual\u002F06.data",[105],{"title":106,"path":107,"stem":108,"titleTemplate":6,"icon":109},"网络请求","\u002Fdocs\u002Fmanual\u002Fdata\u002Fhttp","docs\u002F2.manual\u002F06.data\u002F01.http","i-lucide:globe",{"title":111,"path":112,"stem":113,"children":114,"titleTemplate":6,"icon":177},"项目结构","\u002Fdocs\u002Fstructure","docs\u002F3.structure\u002F0.index",[115,117,122,163,167,172],{"title":111,"path":112,"stem":113,"titleTemplate":28,"icon":116},"i-lucide-layers",{"title":118,"path":119,"stem":120,"titleTemplate":6,"icon":121},".oiyo","\u002Fdocs\u002Fstructure\u002Foiyo","docs\u002F3.structure\u002F1.oiyo","i-catppuccin:folder-temp",{"title":123,"titleTemplate":6,"defaultOpen":42,"icon":124,"path":125,"stem":126,"children":127,"page":21},"src","i-catppuccin:folder-src","\u002Fdocs\u002Fstructure\u002Fsrc","docs\u002F3.structure\u002F1.src",[128,133,138,143,148,153,158],{"title":129,"path":130,"stem":131,"titleTemplate":6,"icon":132},"components","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fcomponents","docs\u002F3.structure\u002F1.src\u002F1.components","i-catppuccin:folder-components",{"title":134,"path":135,"stem":136,"titleTemplate":6,"icon":137},"composables","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fcomposables","docs\u002F3.structure\u002F1.src\u002F1.composables","i-catppuccin:folder-composables",{"title":139,"path":140,"stem":141,"titleTemplate":6,"icon":142},"layouts","\u002Fdocs\u002Fstructure\u002Fsrc\u002Flayouts","docs\u002F3.structure\u002F1.src\u002F1.layouts","i-catppuccin:folder-layouts",{"title":144,"path":145,"stem":146,"titleTemplate":6,"icon":147},"packages","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fpackages","docs\u002F3.structure\u002F1.src\u002F1.packages","i-catppuccin:folder-packages",{"title":149,"path":150,"stem":151,"titleTemplate":6,"icon":152},"pages","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fpages","docs\u002F3.structure\u002F1.src\u002F1.pages","i-catppuccin:folder-views",{"title":154,"path":155,"stem":156,"titleTemplate":6,"icon":157},"App.vue","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fapp","docs\u002F3.structure\u002F1.src\u002F2.app","i-catppuccin:vue",{"title":159,"path":160,"stem":161,"titleTemplate":6,"icon":162},"pages.config.ts","\u002Fdocs\u002Fstructure\u002Fsrc\u002Fpages-config","docs\u002F3.structure\u002F1.src\u002F3.pages-config","i-catppuccin:typescript",{"title":164,"path":165,"stem":166,"titleTemplate":6,"icon":162},"oiyo.config.ts","\u002Fdocs\u002Fstructure\u002Foiyo-config","docs\u002F3.structure\u002F3.oiyo-config",{"title":168,"path":169,"stem":170,"titleTemplate":6,"icon":171},"package.json","\u002Fdocs\u002Fstructure\u002Fpackage","docs\u002F3.structure\u002F3.package","i-catppuccin:package-json",{"title":173,"path":174,"stem":175,"titleTemplate":6,"icon":176},"tsconfig.json","\u002Fdocs\u002Fstructure\u002Ftsconfig","docs\u002F3.structure\u002F3.tsconfig","i-catppuccin:typescript-config","i-lucide:layers",{"title":179,"titleTemplate":6,"icon":180,"redirect":181,"path":182,"stem":183,"children":184,"page":21},"核心概念","i-lucide:leaf","\u002Fdocs\u002Fconcept\u002Fapp","\u002Fdocs\u002Fconcept","docs\u002F4.concept",[185,189,193,196],{"title":186,"path":181,"stem":187,"titleTemplate":6,"icon":188},"根部视图","docs\u002F4.concept\u002F01.app","i-lucide:route",{"title":190,"path":191,"stem":192,"titleTemplate":6,"icon":59},"自动路由","\u002Fdocs\u002Fconcept\u002Froute","docs\u002F4.concept\u002F02.route",{"title":95,"path":194,"stem":195,"titleTemplate":6,"icon":98},"\u002Fdocs\u002Fconcept\u002Flayout","docs\u002F4.concept\u002F03.layout",{"title":197,"path":198,"stem":199,"titleTemplate":6,"icon":43},"自动导入","\u002Fdocs\u002Fconcept\u002Fauto-imports","docs\u002F4.concept\u002F04.auto-imports",{"title":201,"path":202,"stem":203,"children":204,"titleTemplate":6,"icon":299},"API","\u002Fdocs\u002Fapi","docs\u002F5.api\u002F00.index",[205,207,221,231,249,267,281],{"title":206,"path":202,"stem":203,"titleTemplate":28},"API 参考",{"title":208,"titleTemplate":6,"defaultOpen":42,"icon":209,"path":210,"stem":211,"children":212,"page":21},"配置","i-lucide:settings","\u002Fdocs\u002Fapi\u002Fconfig","docs\u002F5.api\u002F01.config",[213,217],{"title":214,"path":215,"stem":216,"titleTemplate":6},"defineOiyoConfig","\u002Fdocs\u002Fapi\u002Fconfig\u002Fdefine-oiyo-config","docs\u002F5.api\u002F01.config\u002F01.define-oiyo-config",{"title":218,"path":219,"stem":220,"titleTemplate":6},"definePagesConfig","\u002Fdocs\u002Fapi\u002Fconfig\u002Fdefine-pages-config","docs\u002F5.api\u002F01.config\u002F02.define-pages-config",{"title":222,"titleTemplate":6,"defaultOpen":42,"icon":223,"path":224,"stem":225,"children":226,"page":21},"运行时","i-lucide:shrub","\u002Fdocs\u002Fapi\u002Fruntime","docs\u002F5.api\u002F02.runtime",[227],{"title":228,"path":229,"stem":230,"titleTemplate":6},"Vue \u002F UniApp","\u002Fdocs\u002Fapi\u002Fruntime\u002Freference","docs\u002F5.api\u002F02.runtime\u002F01.reference",{"title":232,"titleTemplate":6,"defaultOpen":42,"icon":233,"path":234,"stem":235,"children":236,"page":21},"实用工具","i-lucide:wrench","\u002Fdocs\u002Fapi\u002Futils","docs\u002F5.api\u002F03.utils",[237,241,245],{"title":238,"path":239,"stem":240,"titleTemplate":6},"http","\u002Fdocs\u002Fapi\u002Futils\u002Fhttp","docs\u002F5.api\u002F03.utils\u002F00.http",{"title":242,"path":243,"stem":244,"titleTemplate":6},"createHttp","\u002Fdocs\u002Fapi\u002Futils\u002Fcreate-http","docs\u002F5.api\u002F03.utils\u002F01.create-http",{"title":246,"path":247,"stem":248,"titleTemplate":6},"createHttpAborter","\u002Fdocs\u002Fapi\u002Futils\u002Fcreate-http-aborter","docs\u002F5.api\u002F03.utils\u002F02.create-http-aborter",{"title":250,"titleTemplate":6,"defaultOpen":42,"icon":251,"path":252,"stem":253,"children":254,"page":21},"宏","i-lucide:wand","\u002Fdocs\u002Fapi\u002Fmacro","docs\u002F5.api\u002F04.macro",[255,259,263],{"title":256,"path":257,"stem":258,"titleTemplate":6},"defineRootContext","\u002Fdocs\u002Fapi\u002Fmacro\u002Fdefine-root-context","docs\u002F5.api\u002F04.macro\u002F01.define-root-context",{"title":260,"path":261,"stem":262,"titleTemplate":6},"useRootContext","\u002Fdocs\u002Fapi\u002Fmacro\u002Fuse-root-context","docs\u002F5.api\u002F04.macro\u002F02.use-root-context",{"title":264,"path":265,"stem":266,"titleTemplate":6},"definePageMeta","\u002Fdocs\u002Fapi\u002Fmacro\u002Fdefine-page-meta","docs\u002F5.api\u002F04.macro\u002F03.define-page-meta",{"title":268,"titleTemplate":6,"defaultOpen":42,"icon":269,"path":270,"stem":271,"children":272,"page":21},"组件","i-lucide:component","\u002Fdocs\u002Fapi\u002Fcomponents","docs\u002F5.api\u002F05.components",[273,277],{"title":274,"path":275,"stem":276,"titleTemplate":6},"\u003COiyoPage>","\u002Fdocs\u002Fapi\u002Fcomponents\u002Foiyo-page","docs\u002F5.api\u002F05.components\u002F01.oiyo-page",{"title":278,"path":279,"stem":280,"titleTemplate":6},"\u003COiyoLayout>","\u002Fdocs\u002Fapi\u002Fcomponents\u002Foiyo-layout","docs\u002F5.api\u002F05.components\u002F02.oiyo-layout",{"title":282,"titleTemplate":6,"defaultOpen":42,"icon":283,"path":284,"stem":285,"children":286,"page":21},"命令","i-lucide:command","\u002Fdocs\u002Fapi\u002Fcli","docs\u002F5.api\u002F06.cli",[287,291,295],{"title":288,"path":289,"stem":290,"titleTemplate":6},"oiyo prepare","\u002Fdocs\u002Fapi\u002Fcli\u002Foiyo-prepare","docs\u002F5.api\u002F06.cli\u002F00.oiyo-prepare",{"title":292,"path":293,"stem":294,"titleTemplate":6},"oiyo dev","\u002Fdocs\u002Fapi\u002Fcli\u002Foiyo-dev","docs\u002F5.api\u002F06.cli\u002F01.oiyo-dev",{"title":296,"path":297,"stem":298,"titleTemplate":6},"oiyo build","\u002Fdocs\u002Fapi\u002Fcli\u002Foiyo-build","docs\u002F5.api\u002F06.cli\u002F02.oiyo-build","i-lucide:braces",{"title":301,"titleTemplate":6,"icon":302,"redirect":303,"path":304,"stem":305,"children":306,"page":21},"沟通交流","i-lucide:message-circle-question","\u002Fdocs\u002Fcommunity\u002Fassist","\u002Fdocs\u002Fcommunity","docs\u002F9.community",[307],{"title":308,"path":303,"stem":309,"titleTemplate":6,"icon":310},"加群互助","docs\u002F9.community\u002F01.assist","i-lucide:scan-qr-code",{"id":312,"title":106,"body":313,"description":2188,"extension":2189,"meta":2190,"navigation":2191,"path":107,"seo":2192,"stem":108,"titleTemplate":6,"__hash__":2193},"docs\u002Fdocs\u002F2.manual\u002F06.data\u002F01.http.md",{"type":314,"value":315,"toc":2171},"minimark",[316,323,327,337,399,406,515,518,528,631,634,661,664,667,685,782,785,809,956,959,971,1079,1082,1085,1096,1178,1184,1187,1190,1400,1403,1406,1413,1493,1496,1703,1706,1712,1733,1746,1831,1837,1840,1851,1982,1985,1988,1999,2154,2160,2167],[317,318,319,322],"p",{},[320,321,238],"code",{}," 是 Oiyo 数据获取模块提供的轻量请求库，内置了配置派生、生命周期钩子、自动重试与请求中断能力。",[324,325,326],"h2",{"id":326},"发起第一个请求",[317,328,329,330,332,333,336],{},"直接使用默认实例 ",[320,331,238],{}," 即可发起请求，无需任何前置配置。默认情况下，请求成功后只会拿到精炼后的 ",[320,334,335],{},"data","。",[338,339,344],"pre",{"className":340,"code":341,"language":342,"meta":343,"style":343},"language-ts shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","\u002F\u002F 默认只返回精炼后的响应体\nconst data = await http.request('https:\u002F\u002Fapi.example.com\u002Fpet\u002F1')\n","ts","",[320,345,346,355],{"__ignoreMap":343},[347,348,351],"span",{"class":349,"line":350},"line",1,[347,352,354],{"class":353},"sWuyu","\u002F\u002F 默认只返回精炼后的响应体\n",[347,356,358,362,366,370,374,377,380,384,387,390,394,396],{"class":349,"line":357},2,[347,359,361],{"class":360},"smZ93","const",[347,363,365],{"class":364},"sZSNi"," data ",[347,367,369],{"class":368},"sDfIl","=",[347,371,373],{"class":372},"s8R28"," await",[347,375,376],{"class":364}," http",[347,378,379],{"class":368},".",[347,381,383],{"class":382},"s3cPz","request",[347,385,386],{"class":364},"(",[347,388,389],{"class":368},"'",[347,391,393],{"class":392},"sGFVr","https:\u002F\u002Fapi.example.com\u002Fpet\u002F1",[347,395,389],{"class":368},[347,397,398],{"class":364},")\n",[317,400,401,402,405],{},"如果需要状态码、响应头等完整信息，传入 ",[320,403,404],{},"raw: true","：",[338,407,409],{"className":340,"code":408,"language":342,"meta":343,"style":343},"const response = await http.request('\u002Fpet\u002F1', { raw: true })\n\nconsole.log(response.statusCode)\nconsole.log(response.header)\nconsole.log(response.data)\n",[320,410,411,459,464,483,499],{"__ignoreMap":343},[347,412,413,415,418,420,422,424,426,428,430,432,435,437,440,443,447,450,454,457],{"class":349,"line":350},[347,414,361],{"class":360},[347,416,417],{"class":364}," response ",[347,419,369],{"class":368},[347,421,373],{"class":372},[347,423,376],{"class":364},[347,425,379],{"class":368},[347,427,383],{"class":382},[347,429,386],{"class":364},[347,431,389],{"class":368},[347,433,434],{"class":392},"\u002Fpet\u002F1",[347,436,389],{"class":368},[347,438,439],{"class":368},",",[347,441,442],{"class":368}," {",[347,444,446],{"class":445},"sRlkE"," raw",[347,448,449],{"class":368},":",[347,451,453],{"class":452},"sbKd-"," true",[347,455,456],{"class":368}," }",[347,458,398],{"class":364},[347,460,461],{"class":349,"line":357},[347,462,463],{"emptyLinePlaceholder":42},"\n",[347,465,467,470,472,475,478,480],{"class":349,"line":466},3,[347,468,469],{"class":364},"console",[347,471,379],{"class":368},[347,473,474],{"class":382},"log",[347,476,477],{"class":364},"(response",[347,479,379],{"class":368},[347,481,482],{"class":364},"statusCode)\n",[347,484,486,488,490,492,494,496],{"class":349,"line":485},4,[347,487,469],{"class":364},[347,489,379],{"class":368},[347,491,474],{"class":382},[347,493,477],{"class":364},[347,495,379],{"class":368},[347,497,498],{"class":364},"header)\n",[347,500,502,504,506,508,510,512],{"class":349,"line":501},5,[347,503,469],{"class":364},[347,505,379],{"class":368},[347,507,474],{"class":382},[347,509,477],{"class":364},[347,511,379],{"class":368},[347,513,514],{"class":364},"data)\n",[324,516,517],{"id":517},"创建实例",[317,519,520,521,523,524,527],{},"真实项目通常不会直接用默认实例发请求，而是先用 ",[320,522,242],{}," 建立带 ",[320,525,526],{},"baseURL","、超时和公共请求头等配置的公共实例。",[338,529,532],{"className":340,"code":530,"filename":531,"language":342,"meta":343,"style":343},"export const api = createHttp({\n  baseURL: 'https:\u002F\u002Fapi.example.com',\n  timeout: 10000,\n  headers: {\n    'Content-Type': 'application\u002Fjson',\n  },\n})\n","src\u002Flibs\u002Fapi.ts",[320,533,534,555,573,586,596,617,623],{"__ignoreMap":343},[347,535,536,539,542,545,547,550,552],{"class":349,"line":350},[347,537,538],{"class":372},"export",[347,540,541],{"class":360}," const",[347,543,544],{"class":364}," api ",[347,546,369],{"class":368},[347,548,549],{"class":382}," createHttp",[347,551,386],{"class":364},[347,553,554],{"class":368},"{\n",[347,556,557,560,562,565,568,570],{"class":349,"line":357},[347,558,559],{"class":445},"  baseURL",[347,561,449],{"class":368},[347,563,564],{"class":368}," '",[347,566,567],{"class":392},"https:\u002F\u002Fapi.example.com",[347,569,389],{"class":368},[347,571,572],{"class":368},",\n",[347,574,575,578,580,584],{"class":349,"line":466},[347,576,577],{"class":445},"  timeout",[347,579,449],{"class":368},[347,581,583],{"class":582},"sYRBq"," 10000",[347,585,572],{"class":368},[347,587,588,591,593],{"class":349,"line":485},[347,589,590],{"class":445},"  headers",[347,592,449],{"class":368},[347,594,595],{"class":368}," {\n",[347,597,598,601,604,606,608,610,613,615],{"class":349,"line":501},[347,599,600],{"class":368},"    '",[347,602,603],{"class":445},"Content-Type",[347,605,389],{"class":368},[347,607,449],{"class":368},[347,609,564],{"class":368},[347,611,612],{"class":392},"application\u002Fjson",[347,614,389],{"class":368},[347,616,572],{"class":368},[347,618,620],{"class":349,"line":619},6,[347,621,622],{"class":368},"  },\n",[347,624,626,629],{"class":349,"line":625},7,[347,627,628],{"class":368},"}",[347,630,398],{"class":364},[317,632,633],{},"之后在业务代码里使用这个实例，资源地址只写相对路径即可：",[338,635,637],{"className":340,"code":636,"language":342,"meta":343,"style":343},"await api.request('\u002Fpet\u002F1')\n",[320,638,639],{"__ignoreMap":343},[347,640,641,644,647,649,651,653,655,657,659],{"class":349,"line":350},[347,642,643],{"class":372},"await",[347,645,646],{"class":364}," api",[347,648,379],{"class":368},[347,650,383],{"class":382},[347,652,386],{"class":364},[347,654,389],{"class":368},[347,656,434],{"class":392},[347,658,389],{"class":368},[347,660,398],{"class":364},[324,662,663],{"id":663},"三大接口",[665,666,383],"h3",{"id":383},[317,668,669,670,673,674,677,678,681,682,684],{},"请求方法通过 ",[320,671,672],{},"method"," 指定，请求体通过 ",[320,675,676],{},"body"," 传入，查询参数通过 ",[320,679,680],{},"query"," 传入，",[320,683,680],{}," 会被自动序列化。",[338,686,688],{"className":340,"code":687,"language":342,"meta":343,"style":343},"await http.request('\u002Fpet', {\n  method: 'POST',\n  body: { name: 'kitty' },\n  query: { source: 'app' },\n})\n",[320,689,690,713,729,753,776],{"__ignoreMap":343},[347,691,692,694,696,698,700,702,704,707,709,711],{"class":349,"line":350},[347,693,643],{"class":372},[347,695,376],{"class":364},[347,697,379],{"class":368},[347,699,383],{"class":382},[347,701,386],{"class":364},[347,703,389],{"class":368},[347,705,706],{"class":392},"\u002Fpet",[347,708,389],{"class":368},[347,710,439],{"class":368},[347,712,595],{"class":368},[347,714,715,718,720,722,725,727],{"class":349,"line":357},[347,716,717],{"class":445},"  method",[347,719,449],{"class":368},[347,721,564],{"class":368},[347,723,724],{"class":392},"POST",[347,726,389],{"class":368},[347,728,572],{"class":368},[347,730,731,734,736,738,741,743,745,748,750],{"class":349,"line":466},[347,732,733],{"class":445},"  body",[347,735,449],{"class":368},[347,737,442],{"class":368},[347,739,740],{"class":445}," name",[347,742,449],{"class":368},[347,744,564],{"class":368},[347,746,747],{"class":392},"kitty",[347,749,389],{"class":368},[347,751,752],{"class":368}," },\n",[347,754,755,758,760,762,765,767,769,772,774],{"class":349,"line":485},[347,756,757],{"class":445},"  query",[347,759,449],{"class":368},[347,761,442],{"class":368},[347,763,764],{"class":445}," source",[347,766,449],{"class":368},[347,768,564],{"class":368},[347,770,771],{"class":392},"app",[347,773,389],{"class":368},[347,775,752],{"class":368},[347,777,778,780],{"class":349,"line":501},[347,779,628],{"class":368},[347,781,398],{"class":364},[665,783,784],{"id":784},"upload",[317,786,787,789,790,792,793,796,797,800,801,804,805,808],{},[320,788,784],{}," 的 ",[320,791,676],{}," 对应 ",[320,794,795],{},"formData","，",[320,798,799],{},"name"," 是文件对应的字段名（默认 ",[320,802,803],{},"'file'","），",[320,806,807],{},"onProgress"," 用于监听上传进度。",[338,810,812],{"className":340,"code":811,"language":342,"meta":343,"style":343},"await http.upload('\u002Fupload', {\n  filePath: tempFilePath,\n  name: 'file',\n  body: { category: 'avatar' }, \u002F\u002F 对应 formData\n  onProgress: ({ progress }) => {\n    console.log(`上传进度 ${progress}%`)\n  },\n})\n",[320,813,814,837,849,865,891,913,945,949],{"__ignoreMap":343},[347,815,816,818,820,822,824,826,828,831,833,835],{"class":349,"line":350},[347,817,643],{"class":372},[347,819,376],{"class":364},[347,821,379],{"class":368},[347,823,784],{"class":382},[347,825,386],{"class":364},[347,827,389],{"class":368},[347,829,830],{"class":392},"\u002Fupload",[347,832,389],{"class":368},[347,834,439],{"class":368},[347,836,595],{"class":368},[347,838,839,842,844,847],{"class":349,"line":357},[347,840,841],{"class":445},"  filePath",[347,843,449],{"class":368},[347,845,846],{"class":364}," tempFilePath",[347,848,572],{"class":368},[347,850,851,854,856,858,861,863],{"class":349,"line":466},[347,852,853],{"class":445},"  name",[347,855,449],{"class":368},[347,857,564],{"class":368},[347,859,860],{"class":392},"file",[347,862,389],{"class":368},[347,864,572],{"class":368},[347,866,867,869,871,873,876,878,880,883,885,888],{"class":349,"line":485},[347,868,733],{"class":445},[347,870,449],{"class":368},[347,872,442],{"class":368},[347,874,875],{"class":445}," category",[347,877,449],{"class":368},[347,879,564],{"class":368},[347,881,882],{"class":392},"avatar",[347,884,389],{"class":368},[347,886,887],{"class":368}," },",[347,889,890],{"class":353}," \u002F\u002F 对应 formData\n",[347,892,893,896,898,901,905,908,911],{"class":349,"line":501},[347,894,895],{"class":382},"  onProgress",[347,897,449],{"class":368},[347,899,900],{"class":368}," ({",[347,902,904],{"class":903},"s1nJG"," progress",[347,906,907],{"class":368}," })",[347,909,910],{"class":360}," =>",[347,912,595],{"class":368},[347,914,915,918,920,922,924,927,930,933,936,938,941,943],{"class":349,"line":619},[347,916,917],{"class":364},"    console",[347,919,379],{"class":368},[347,921,474],{"class":382},[347,923,386],{"class":445},[347,925,926],{"class":368},"`",[347,928,929],{"class":392},"上传进度 ",[347,931,932],{"class":368},"${",[347,934,935],{"class":364},"progress",[347,937,628],{"class":368},[347,939,940],{"class":392},"%",[347,942,926],{"class":368},[347,944,398],{"class":445},[347,946,947],{"class":349,"line":625},[347,948,622],{"class":368},[347,950,952,954],{"class":349,"line":951},8,[347,953,628],{"class":368},[347,955,398],{"class":364},[665,957,958],{"id":958},"download",[317,960,961,963,964,967,968,970],{},[320,962,958],{}," 下载完成后可通过 ",[320,965,966],{},"tempFilePath"," 获取临时文件地址，",[320,969,807],{}," 用于监听下载进度。",[338,972,974],{"className":340,"code":973,"language":342,"meta":343,"style":343},"const { tempFilePath } = await http.download('\u002Ffile\u002Freport.pdf', {\n  onProgress: ({ progress }) => {\n    console.log(`下载进度 ${progress}%`)\n  },\n})\n\nconsole.log(tempFilePath)\n",[320,975,976,1011,1027,1054,1058,1064,1068],{"__ignoreMap":343},[347,977,978,980,982,985,987,990,992,994,996,998,1000,1002,1005,1007,1009],{"class":349,"line":350},[347,979,361],{"class":360},[347,981,442],{"class":368},[347,983,984],{"class":364}," tempFilePath ",[347,986,628],{"class":368},[347,988,989],{"class":368}," =",[347,991,373],{"class":372},[347,993,376],{"class":364},[347,995,379],{"class":368},[347,997,958],{"class":382},[347,999,386],{"class":364},[347,1001,389],{"class":368},[347,1003,1004],{"class":392},"\u002Ffile\u002Freport.pdf",[347,1006,389],{"class":368},[347,1008,439],{"class":368},[347,1010,595],{"class":368},[347,1012,1013,1015,1017,1019,1021,1023,1025],{"class":349,"line":357},[347,1014,895],{"class":382},[347,1016,449],{"class":368},[347,1018,900],{"class":368},[347,1020,904],{"class":903},[347,1022,907],{"class":368},[347,1024,910],{"class":360},[347,1026,595],{"class":368},[347,1028,1029,1031,1033,1035,1037,1039,1042,1044,1046,1048,1050,1052],{"class":349,"line":466},[347,1030,917],{"class":364},[347,1032,379],{"class":368},[347,1034,474],{"class":382},[347,1036,386],{"class":445},[347,1038,926],{"class":368},[347,1040,1041],{"class":392},"下载进度 ",[347,1043,932],{"class":368},[347,1045,935],{"class":364},[347,1047,628],{"class":368},[347,1049,940],{"class":392},[347,1051,926],{"class":368},[347,1053,398],{"class":445},[347,1055,1056],{"class":349,"line":485},[347,1057,622],{"class":368},[347,1059,1060,1062],{"class":349,"line":501},[347,1061,628],{"class":368},[347,1063,398],{"class":364},[347,1065,1066],{"class":349,"line":619},[347,1067,463],{"emptyLinePlaceholder":42},[347,1069,1070,1072,1074,1076],{"class":349,"line":625},[347,1071,469],{"class":364},[347,1073,379],{"class":368},[347,1075,474],{"class":382},[347,1077,1078],{"class":364},"(tempFilePath)\n",[324,1080,1081],{"id":1081},"核心功能",[665,1083,1084],{"id":1084},"派生带鉴权的实例",[317,1086,1087,1088,1091,1092,1095],{},"需要在已有实例基础上追加配置（例如登录后附带 ",[320,1089,1090],{},"Authorization","）时，用 ",[320,1093,1094],{},"create"," 派生一个新实例。派生实例会与上层配置合并，同名钩子按层级顺序串联执行。",[338,1097,1099],{"className":340,"code":1098,"language":342,"meta":343,"style":343},"const authApi = api.create({\n  headers: { Authorization: 'Bearer xxx' },\n})\n\n\u002F\u002F 同时带上 Content-Type 与 Authorization\nawait authApi.request('\u002Fpet\u002F1')\n",[320,1100,1101,1120,1142,1148,1152,1157],{"__ignoreMap":343},[347,1102,1103,1105,1108,1110,1112,1114,1116,1118],{"class":349,"line":350},[347,1104,361],{"class":360},[347,1106,1107],{"class":364}," authApi ",[347,1109,369],{"class":368},[347,1111,646],{"class":364},[347,1113,379],{"class":368},[347,1115,1094],{"class":382},[347,1117,386],{"class":364},[347,1119,554],{"class":368},[347,1121,1122,1124,1126,1128,1131,1133,1135,1138,1140],{"class":349,"line":357},[347,1123,590],{"class":445},[347,1125,449],{"class":368},[347,1127,442],{"class":368},[347,1129,1130],{"class":445}," Authorization",[347,1132,449],{"class":368},[347,1134,564],{"class":368},[347,1136,1137],{"class":392},"Bearer xxx",[347,1139,389],{"class":368},[347,1141,752],{"class":368},[347,1143,1144,1146],{"class":349,"line":466},[347,1145,628],{"class":368},[347,1147,398],{"class":364},[347,1149,1150],{"class":349,"line":485},[347,1151,463],{"emptyLinePlaceholder":42},[347,1153,1154],{"class":349,"line":501},[347,1155,1156],{"class":353},"\u002F\u002F 同时带上 Content-Type 与 Authorization\n",[347,1158,1159,1161,1164,1166,1168,1170,1172,1174,1176],{"class":349,"line":619},[347,1160,643],{"class":372},[347,1162,1163],{"class":364}," authApi",[347,1165,379],{"class":368},[347,1167,383],{"class":382},[347,1169,386],{"class":364},[347,1171,389],{"class":368},[347,1173,434],{"class":392},[347,1175,389],{"class":368},[347,1177,398],{"class":364},[1179,1180,1181],"tip",{},[317,1182,1183],{},"派生适合按“公共实例 → 鉴权实例 → 特定业务实例”的层次组织请求配置，避免在每个请求里重复写相同的头部。",[665,1185,1186],{"id":1186},"拦截请求与响应",[317,1188,1189],{},"通过生命周期钩子在请求前后统一处理逻辑，例如注入 token、打点、统一错误提示。钩子通常声明在实例上，作用于该实例的所有请求。",[338,1191,1193],{"className":340,"code":1192,"language":342,"meta":343,"style":343},"const api = createHttp({\n  onRequest({ options, request }) {\n    console.log('发起请求', request)\n  },\n  onRequestError({ error }) {\n    console.error('请求失败', error)\n  },\n  onResponse({ response }) {\n    console.log('收到响应', response.statusCode)\n  },\n  onResponseError({ response }) {\n    console.error('响应错误', response.statusCode)\n  },\n})\n",[320,1194,1195,1209,1229,1252,1256,1270,1294,1298,1312,1341,1346,1360,1388,1393],{"__ignoreMap":343},[347,1196,1197,1199,1201,1203,1205,1207],{"class":349,"line":350},[347,1198,361],{"class":360},[347,1200,544],{"class":364},[347,1202,369],{"class":368},[347,1204,549],{"class":382},[347,1206,386],{"class":364},[347,1208,554],{"class":368},[347,1210,1211,1214,1217,1220,1222,1225,1227],{"class":349,"line":357},[347,1212,1213],{"class":445},"  onRequest",[347,1215,1216],{"class":368},"({",[347,1218,1219],{"class":903}," options",[347,1221,439],{"class":368},[347,1223,1224],{"class":903}," request",[347,1226,907],{"class":368},[347,1228,595],{"class":368},[347,1230,1231,1233,1235,1237,1239,1241,1244,1246,1248,1250],{"class":349,"line":466},[347,1232,917],{"class":364},[347,1234,379],{"class":368},[347,1236,474],{"class":382},[347,1238,386],{"class":445},[347,1240,389],{"class":368},[347,1242,1243],{"class":392},"发起请求",[347,1245,389],{"class":368},[347,1247,439],{"class":368},[347,1249,1224],{"class":364},[347,1251,398],{"class":445},[347,1253,1254],{"class":349,"line":485},[347,1255,622],{"class":368},[347,1257,1258,1261,1263,1266,1268],{"class":349,"line":501},[347,1259,1260],{"class":445},"  onRequestError",[347,1262,1216],{"class":368},[347,1264,1265],{"class":903}," error",[347,1267,907],{"class":368},[347,1269,595],{"class":368},[347,1271,1272,1274,1276,1279,1281,1283,1286,1288,1290,1292],{"class":349,"line":619},[347,1273,917],{"class":364},[347,1275,379],{"class":368},[347,1277,1278],{"class":382},"error",[347,1280,386],{"class":445},[347,1282,389],{"class":368},[347,1284,1285],{"class":392},"请求失败",[347,1287,389],{"class":368},[347,1289,439],{"class":368},[347,1291,1265],{"class":364},[347,1293,398],{"class":445},[347,1295,1296],{"class":349,"line":625},[347,1297,622],{"class":368},[347,1299,1300,1303,1305,1308,1310],{"class":349,"line":951},[347,1301,1302],{"class":445},"  onResponse",[347,1304,1216],{"class":368},[347,1306,1307],{"class":903}," response",[347,1309,907],{"class":368},[347,1311,595],{"class":368},[347,1313,1315,1317,1319,1321,1323,1325,1328,1330,1332,1334,1336,1339],{"class":349,"line":1314},9,[347,1316,917],{"class":364},[347,1318,379],{"class":368},[347,1320,474],{"class":382},[347,1322,386],{"class":445},[347,1324,389],{"class":368},[347,1326,1327],{"class":392},"收到响应",[347,1329,389],{"class":368},[347,1331,439],{"class":368},[347,1333,1307],{"class":364},[347,1335,379],{"class":368},[347,1337,1338],{"class":364},"statusCode",[347,1340,398],{"class":445},[347,1342,1344],{"class":349,"line":1343},10,[347,1345,622],{"class":368},[347,1347,1349,1352,1354,1356,1358],{"class":349,"line":1348},11,[347,1350,1351],{"class":445},"  onResponseError",[347,1353,1216],{"class":368},[347,1355,1307],{"class":903},[347,1357,907],{"class":368},[347,1359,595],{"class":368},[347,1361,1363,1365,1367,1369,1371,1373,1376,1378,1380,1382,1384,1386],{"class":349,"line":1362},12,[347,1364,917],{"class":364},[347,1366,379],{"class":368},[347,1368,1278],{"class":382},[347,1370,386],{"class":445},[347,1372,389],{"class":368},[347,1374,1375],{"class":392},"响应错误",[347,1377,389],{"class":368},[347,1379,439],{"class":368},[347,1381,1307],{"class":364},[347,1383,379],{"class":368},[347,1385,1338],{"class":364},[347,1387,398],{"class":445},[347,1389,1391],{"class":349,"line":1390},13,[347,1392,622],{"class":368},[347,1394,1396,1398],{"class":349,"line":1395},14,[347,1397,628],{"class":368},[347,1399,398],{"class":364},[317,1401,1402],{},"多层配置（公共 + 派生 + 单次请求）的同名钩子会串联执行，按配置层级顺序依次执行。因此公共实例上的钩子不会被派生实例覆盖，而是与其一同触发。",[665,1404,1405],{"id":1405},"拓展请求配置",[317,1407,1408,1409,1412],{},"可以通过拓展 ",[320,1410,1411],{},"HttpCommonOptions"," 接口实现自定义的 options 属性。",[338,1414,1416],{"className":340,"code":1415,"language":342,"meta":343,"style":343},"\u002F\u002F 可以放在 \u003CsrcDir> 目录中的任意 d.ts\u002Fts 文件中。推荐放在 \u003CsrcDir>\u002Ftypes 目录下\ndeclare module \"@skiyee\u002Foiyo\u002Fruntime\" {\n  interface HttpCommonOptions {\n    \u002F\u002F 自定义属性\n    requiresAuth?: boolean;\n  }\n}\n\nexport {};\n",[320,1417,1418,1423,1442,1453,1458,1472,1477,1482,1486],{"__ignoreMap":343},[347,1419,1420],{"class":349,"line":350},[347,1421,1422],{"class":353},"\u002F\u002F 可以放在 \u003CsrcDir> 目录中的任意 d.ts\u002Fts 文件中。推荐放在 \u003CsrcDir>\u002Ftypes 目录下\n",[347,1424,1425,1428,1431,1434,1437,1440],{"class":349,"line":357},[347,1426,1427],{"class":360},"declare",[347,1429,1430],{"class":360}," module",[347,1432,1433],{"class":368}," \"",[347,1435,1436],{"class":392},"@skiyee\u002Foiyo\u002Fruntime",[347,1438,1439],{"class":368},"\"",[347,1441,595],{"class":368},[347,1443,1444,1447,1451],{"class":349,"line":466},[347,1445,1446],{"class":360},"  interface",[347,1448,1450],{"class":1449},"s52Pk"," HttpCommonOptions",[347,1452,595],{"class":368},[347,1454,1455],{"class":349,"line":485},[347,1456,1457],{"class":353},"    \u002F\u002F 自定义属性\n",[347,1459,1460,1463,1466,1469],{"class":349,"line":501},[347,1461,1462],{"class":445},"    requiresAuth",[347,1464,1465],{"class":368},"?:",[347,1467,1468],{"class":1449}," boolean",[347,1470,1471],{"class":368},";\n",[347,1473,1474],{"class":349,"line":619},[347,1475,1476],{"class":368},"  }\n",[347,1478,1479],{"class":349,"line":625},[347,1480,1481],{"class":368},"}\n",[347,1483,1484],{"class":349,"line":951},[347,1485,463],{"emptyLinePlaceholder":42},[347,1487,1488,1490],{"class":349,"line":1314},[347,1489,538],{"class":372},[347,1491,1492],{"class":368}," {};\n",[317,1494,1495],{},"声明后，你将会在与 http 实例相关的 options 上拿到该属性。",[338,1497,1499],{"className":340,"code":1498,"language":342,"meta":343,"style":343},"const client = createHttp({\n  onRequest: (ctx) => {\n    \u002F\u002F ctx.options.requiresAuth?: boolean\n  }\n})\n\nconst auth = client.create({\n  onRequest: (ctx) => {\n    \u002F\u002F ctx.options.requiresAuth?: boolean\n  }\n})\n\nauth.request('\u002Frequest', { requiresAuth: true })\nauth.upload('\u002Fupload', { requiresAuth: true })\nauth.download('\u002Fdownload', { requiresAuth: true })\n",[320,1500,1501,1516,1535,1540,1544,1550,1554,1574,1590,1594,1598,1604,1608,1641,1671],{"__ignoreMap":343},[347,1502,1503,1505,1508,1510,1512,1514],{"class":349,"line":350},[347,1504,361],{"class":360},[347,1506,1507],{"class":364}," client ",[347,1509,369],{"class":368},[347,1511,549],{"class":382},[347,1513,386],{"class":364},[347,1515,554],{"class":368},[347,1517,1518,1520,1522,1525,1528,1531,1533],{"class":349,"line":357},[347,1519,1213],{"class":382},[347,1521,449],{"class":368},[347,1523,1524],{"class":368}," (",[347,1526,1527],{"class":903},"ctx",[347,1529,1530],{"class":368},")",[347,1532,910],{"class":360},[347,1534,595],{"class":368},[347,1536,1537],{"class":349,"line":466},[347,1538,1539],{"class":353},"    \u002F\u002F ctx.options.requiresAuth?: boolean\n",[347,1541,1542],{"class":349,"line":485},[347,1543,1476],{"class":368},[347,1545,1546,1548],{"class":349,"line":501},[347,1547,628],{"class":368},[347,1549,398],{"class":364},[347,1551,1552],{"class":349,"line":619},[347,1553,463],{"emptyLinePlaceholder":42},[347,1555,1556,1558,1561,1563,1566,1568,1570,1572],{"class":349,"line":625},[347,1557,361],{"class":360},[347,1559,1560],{"class":364}," auth ",[347,1562,369],{"class":368},[347,1564,1565],{"class":364}," client",[347,1567,379],{"class":368},[347,1569,1094],{"class":382},[347,1571,386],{"class":364},[347,1573,554],{"class":368},[347,1575,1576,1578,1580,1582,1584,1586,1588],{"class":349,"line":951},[347,1577,1213],{"class":382},[347,1579,449],{"class":368},[347,1581,1524],{"class":368},[347,1583,1527],{"class":903},[347,1585,1530],{"class":368},[347,1587,910],{"class":360},[347,1589,595],{"class":368},[347,1591,1592],{"class":349,"line":1314},[347,1593,1539],{"class":353},[347,1595,1596],{"class":349,"line":1343},[347,1597,1476],{"class":368},[347,1599,1600,1602],{"class":349,"line":1348},[347,1601,628],{"class":368},[347,1603,398],{"class":364},[347,1605,1606],{"class":349,"line":1362},[347,1607,463],{"emptyLinePlaceholder":42},[347,1609,1610,1613,1615,1617,1619,1621,1624,1626,1628,1630,1633,1635,1637,1639],{"class":349,"line":1390},[347,1611,1612],{"class":364},"auth",[347,1614,379],{"class":368},[347,1616,383],{"class":382},[347,1618,386],{"class":364},[347,1620,389],{"class":368},[347,1622,1623],{"class":392},"\u002Frequest",[347,1625,389],{"class":368},[347,1627,439],{"class":368},[347,1629,442],{"class":368},[347,1631,1632],{"class":445}," requiresAuth",[347,1634,449],{"class":368},[347,1636,453],{"class":452},[347,1638,456],{"class":368},[347,1640,398],{"class":364},[347,1642,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669],{"class":349,"line":1395},[347,1644,1612],{"class":364},[347,1646,379],{"class":368},[347,1648,784],{"class":382},[347,1650,386],{"class":364},[347,1652,389],{"class":368},[347,1654,830],{"class":392},[347,1656,389],{"class":368},[347,1658,439],{"class":368},[347,1660,442],{"class":368},[347,1662,1632],{"class":445},[347,1664,449],{"class":368},[347,1666,453],{"class":452},[347,1668,456],{"class":368},[347,1670,398],{"class":364},[347,1672,1674,1676,1678,1680,1682,1684,1687,1689,1691,1693,1695,1697,1699,1701],{"class":349,"line":1673},15,[347,1675,1612],{"class":364},[347,1677,379],{"class":368},[347,1679,958],{"class":382},[347,1681,386],{"class":364},[347,1683,389],{"class":368},[347,1685,1686],{"class":392},"\u002Fdownload",[347,1688,389],{"class":368},[347,1690,439],{"class":368},[347,1692,442],{"class":368},[347,1694,1632],{"class":445},[347,1696,449],{"class":368},[347,1698,453],{"class":452},[347,1700,456],{"class":368},[347,1702,398],{"class":364},[665,1704,1705],{"id":1705},"失败自动重试",[317,1707,1708,1709,1711],{},"在网络错误或响应命中重试状态码时，",[320,1710,238],{}," 会自动重试。默认策略考虑了幂等性：",[1713,1714,1715,1727],"ul",{},[1716,1717,1718,1719,1723,1724,336],"li",{},"带请求体的方法（POST \u002F PUT \u002F DELETE \u002F PATCH）默认",[1720,1721,1722],"strong",{},"不重试","，其余方法",[1720,1725,1726],{},"重试一次",[1716,1728,1729,1730,336],{},"主动取消",[1720,1731,1732],{},"不参与重试",[317,1734,1735,1736,1739,1740,1739,1743,405],{},"需要更特殊的重试时，可显式配置 ",[320,1737,1738],{},"retry"," \u002F ",[320,1741,1742],{},"retryDelay",[320,1744,1745],{},"retryStatusCodes",[338,1747,1749],{"className":340,"code":1748,"language":342,"meta":343,"style":343},"await http.request('\u002Fpet\u002F1', {\n  retry: 3,\n  retryDelay: 1000,\n  retryStatusCodes: [500, 502, 503],\n})\n",[320,1750,1751,1773,1785,1797,1825],{"__ignoreMap":343},[347,1752,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771],{"class":349,"line":350},[347,1754,643],{"class":372},[347,1756,376],{"class":364},[347,1758,379],{"class":368},[347,1760,383],{"class":382},[347,1762,386],{"class":364},[347,1764,389],{"class":368},[347,1766,434],{"class":392},[347,1768,389],{"class":368},[347,1770,439],{"class":368},[347,1772,595],{"class":368},[347,1774,1775,1778,1780,1783],{"class":349,"line":357},[347,1776,1777],{"class":445},"  retry",[347,1779,449],{"class":368},[347,1781,1782],{"class":582}," 3",[347,1784,572],{"class":368},[347,1786,1787,1790,1792,1795],{"class":349,"line":466},[347,1788,1789],{"class":445},"  retryDelay",[347,1791,449],{"class":368},[347,1793,1794],{"class":582}," 1000",[347,1796,572],{"class":368},[347,1798,1799,1802,1804,1807,1810,1812,1815,1817,1820,1823],{"class":349,"line":485},[347,1800,1801],{"class":445},"  retryStatusCodes",[347,1803,449],{"class":368},[347,1805,1806],{"class":364}," [",[347,1808,1809],{"class":582},"500",[347,1811,439],{"class":368},[347,1813,1814],{"class":582}," 502",[347,1816,439],{"class":368},[347,1818,1819],{"class":582}," 503",[347,1821,1822],{"class":364},"]",[347,1824,572],{"class":368},[347,1826,1827,1829],{"class":349,"line":501},[347,1828,628],{"class":368},[347,1830,398],{"class":364},[1832,1833,1834],"note",{},[317,1835,1836],{},"每次重试都会重新走一遍完整流程（包含钩子）。",[665,1838,1839],{"id":1839},"中断进行中的请求",[317,1841,1842,1843,1846,1847,1850],{},"通过 ",[320,1844,1845],{},"createHttpAborter()"," 创建中断信号，把 ",[320,1848,1849],{},"signal"," 传入请求，就能控制在响应前的任意时刻中断。",[338,1852,1854],{"className":340,"code":1853,"language":342,"meta":343,"style":343},"const aborter = createHttpAborter()\n\nconst promise = http.request('\u002Fpet\u002F1', { signal: aborter.signal })\n\n\u002F\u002F 任意时刻中断\naborter.abort()\n\ntry {\n  await promise\n}\ncatch (error) {\n  \u002F\u002F 中断错误 error.name === 'AbortError'\n}\n",[320,1855,1856,1871,1875,1919,1923,1928,1940,1944,1951,1959,1963,1973,1978],{"__ignoreMap":343},[347,1857,1858,1860,1863,1865,1868],{"class":349,"line":350},[347,1859,361],{"class":360},[347,1861,1862],{"class":364}," aborter ",[347,1864,369],{"class":368},[347,1866,1867],{"class":382}," createHttpAborter",[347,1869,1870],{"class":364},"()\n",[347,1872,1873],{"class":349,"line":357},[347,1874,463],{"emptyLinePlaceholder":42},[347,1876,1877,1879,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1905,1907,1910,1912,1915,1917],{"class":349,"line":466},[347,1878,361],{"class":360},[347,1880,1881],{"class":364}," promise ",[347,1883,369],{"class":368},[347,1885,376],{"class":364},[347,1887,379],{"class":368},[347,1889,383],{"class":382},[347,1891,386],{"class":364},[347,1893,389],{"class":368},[347,1895,434],{"class":392},[347,1897,389],{"class":368},[347,1899,439],{"class":368},[347,1901,442],{"class":368},[347,1903,1904],{"class":445}," signal",[347,1906,449],{"class":368},[347,1908,1909],{"class":364}," aborter",[347,1911,379],{"class":368},[347,1913,1914],{"class":364},"signal ",[347,1916,628],{"class":368},[347,1918,398],{"class":364},[347,1920,1921],{"class":349,"line":485},[347,1922,463],{"emptyLinePlaceholder":42},[347,1924,1925],{"class":349,"line":501},[347,1926,1927],{"class":353},"\u002F\u002F 任意时刻中断\n",[347,1929,1930,1933,1935,1938],{"class":349,"line":619},[347,1931,1932],{"class":364},"aborter",[347,1934,379],{"class":368},[347,1936,1937],{"class":382},"abort",[347,1939,1870],{"class":364},[347,1941,1942],{"class":349,"line":625},[347,1943,463],{"emptyLinePlaceholder":42},[347,1945,1946,1949],{"class":349,"line":951},[347,1947,1948],{"class":372},"try",[347,1950,595],{"class":368},[347,1952,1953,1956],{"class":349,"line":1314},[347,1954,1955],{"class":372},"  await",[347,1957,1958],{"class":364}," promise\n",[347,1960,1961],{"class":349,"line":1343},[347,1962,1481],{"class":368},[347,1964,1965,1968,1971],{"class":349,"line":1348},[347,1966,1967],{"class":372},"catch",[347,1969,1970],{"class":364}," (error) ",[347,1972,554],{"class":368},[347,1974,1975],{"class":349,"line":1362},[347,1976,1977],{"class":353},"  \u002F\u002F 中断错误 error.name === 'AbortError'\n",[347,1979,1980],{"class":349,"line":1390},[347,1981,1481],{"class":368},[317,1983,1984],{},"中断会覆盖钩子阶段与请求进行中的阶段：信号触发后会立即 reject。",[665,1986,1987],{"id":1987},"处理请求错误",[317,1989,1990,1991,1994,1995,1998],{},"非 2xx 响应（且未开启 ",[320,1992,1993],{},"ignoreResponseError","）会抛出 ",[320,1996,1997],{},"HttpError","，其中携带完整的请求上下文，便于统一处理。",[338,2000,2002],{"className":340,"code":2001,"language":342,"meta":343,"style":343},"try {\n  await http.request('\u002Fpet\u002F999')\n}\ncatch (e) {\n  const error = e as HttpError\n  console.log(error.request) \u002F\u002F 请求资源\n  console.log(error.options) \u002F\u002F 请求配置\n  console.log(error.response) \u002F\u002F 完整响应\n  console.log(error.data) \u002F\u002F 响应体\n}\n",[320,2003,2004,2010,2031,2035,2044,2062,2085,2107,2129,2150],{"__ignoreMap":343},[347,2005,2006,2008],{"class":349,"line":350},[347,2007,1948],{"class":372},[347,2009,595],{"class":368},[347,2011,2012,2014,2016,2018,2020,2022,2024,2027,2029],{"class":349,"line":357},[347,2013,1955],{"class":372},[347,2015,376],{"class":364},[347,2017,379],{"class":368},[347,2019,383],{"class":382},[347,2021,386],{"class":445},[347,2023,389],{"class":368},[347,2025,2026],{"class":392},"\u002Fpet\u002F999",[347,2028,389],{"class":368},[347,2030,398],{"class":445},[347,2032,2033],{"class":349,"line":466},[347,2034,1481],{"class":368},[347,2036,2037,2039,2042],{"class":349,"line":485},[347,2038,1967],{"class":372},[347,2040,2041],{"class":364}," (e) ",[347,2043,554],{"class":368},[347,2045,2046,2049,2051,2053,2056,2059],{"class":349,"line":501},[347,2047,2048],{"class":360},"  const",[347,2050,1265],{"class":364},[347,2052,989],{"class":368},[347,2054,2055],{"class":364}," e",[347,2057,2058],{"class":372}," as",[347,2060,2061],{"class":1449}," HttpError\n",[347,2063,2064,2067,2069,2071,2073,2075,2077,2079,2082],{"class":349,"line":619},[347,2065,2066],{"class":364},"  console",[347,2068,379],{"class":368},[347,2070,474],{"class":382},[347,2072,386],{"class":445},[347,2074,1278],{"class":364},[347,2076,379],{"class":368},[347,2078,383],{"class":364},[347,2080,2081],{"class":445},") ",[347,2083,2084],{"class":353},"\u002F\u002F 请求资源\n",[347,2086,2087,2089,2091,2093,2095,2097,2099,2102,2104],{"class":349,"line":625},[347,2088,2066],{"class":364},[347,2090,379],{"class":368},[347,2092,474],{"class":382},[347,2094,386],{"class":445},[347,2096,1278],{"class":364},[347,2098,379],{"class":368},[347,2100,2101],{"class":364},"options",[347,2103,2081],{"class":445},[347,2105,2106],{"class":353},"\u002F\u002F 请求配置\n",[347,2108,2109,2111,2113,2115,2117,2119,2121,2124,2126],{"class":349,"line":951},[347,2110,2066],{"class":364},[347,2112,379],{"class":368},[347,2114,474],{"class":382},[347,2116,386],{"class":445},[347,2118,1278],{"class":364},[347,2120,379],{"class":368},[347,2122,2123],{"class":364},"response",[347,2125,2081],{"class":445},[347,2127,2128],{"class":353},"\u002F\u002F 完整响应\n",[347,2130,2131,2133,2135,2137,2139,2141,2143,2145,2147],{"class":349,"line":1314},[347,2132,2066],{"class":364},[347,2134,379],{"class":368},[347,2136,474],{"class":382},[347,2138,386],{"class":445},[347,2140,1278],{"class":364},[347,2142,379],{"class":368},[347,2144,335],{"class":364},[347,2146,2081],{"class":445},[347,2148,2149],{"class":353},"\u002F\u002F 响应体\n",[347,2151,2152],{"class":349,"line":1343},[347,2153,1481],{"class":368},[317,2155,2156,2157,336],{},"如果希望非 2xx 响应不抛错、由业务自行判断，可开启 ",[320,2158,2159],{},"ignoreResponseError: true",[2161,2162,2164],"callout",{"color":2163,"icon":299,"to":243},"neutral",[317,2165,2166],{},"查看 createHttp API 参考：配置项信息",[2168,2169,2170],"style",{},"html pre.shiki code .sWuyu, html code.shiki .sWuyu{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .smZ93, html code.shiki .smZ93{--shiki-light:#9C3EDA;--shiki-default:#9C3EDA;--shiki-dark:#C792EA}html pre.shiki code .sZSNi, html code.shiki .sZSNi{--shiki-light:#90A4AE;--shiki-default:#90A4AE;--shiki-dark:#BABED8}html pre.shiki code .sDfIl, html code.shiki .sDfIl{--shiki-light:#39ADB5;--shiki-default:#39ADB5;--shiki-dark:#89DDFF}html pre.shiki code .s8R28, html code.shiki .s8R28{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#39ADB5;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s3cPz, html code.shiki .s3cPz{--shiki-light:#6182B8;--shiki-default:#6182B8;--shiki-dark:#82AAFF}html pre.shiki code .sGFVr, html code.shiki .sGFVr{--shiki-light:#91B859;--shiki-default:#91B859;--shiki-dark:#C3E88D}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);}html pre.shiki code .sRlkE, html code.shiki .sRlkE{--shiki-light:#E53935;--shiki-default:#E53935;--shiki-dark:#F07178}html pre.shiki code .sbKd-, html code.shiki .sbKd-{--shiki-light:#FF5370;--shiki-default:#FF5370;--shiki-dark:#FF9CAC}html pre.shiki code .sYRBq, html code.shiki .sYRBq{--shiki-light:#F76D47;--shiki-default:#F76D47;--shiki-dark:#F78C6C}html pre.shiki code .s1nJG, html code.shiki .s1nJG{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s52Pk, html code.shiki .s52Pk{--shiki-light:#E2931D;--shiki-default:#E2931D;--shiki-dark:#FFCB6B}",{"title":343,"searchDepth":357,"depth":357,"links":2172},[2173,2174,2175,2180],{"id":326,"depth":357,"text":326},{"id":517,"depth":357,"text":517},{"id":663,"depth":357,"text":663,"children":2176},[2177,2178,2179],{"id":383,"depth":466,"text":383},{"id":784,"depth":466,"text":784},{"id":958,"depth":466,"text":958},{"id":1081,"depth":357,"text":1081,"children":2181},[2182,2183,2184,2185,2186,2187],{"id":1084,"depth":466,"text":1084},{"id":1186,"depth":466,"text":1186},{"id":1405,"depth":466,"text":1405},{"id":1705,"depth":466,"text":1705},{"id":1839,"depth":466,"text":1839},{"id":1987,"depth":466,"text":1987},"使用 http 模块完成请求、上传、下载与统一的响应处理","md",{},{"icon":109},{"title":106,"description":2188},"oGfyAV_sfMF2a6-XpQ4JFhHAJLfIdTk-DKlvLHsoY3A",[2195,2197],{"title":95,"path":96,"stem":97,"description":2196,"icon":98,"children":-1},"实现页面内容分离与页面外壳",{"title":111,"path":112,"stem":113,"description":2198,"icon":116,"children":-1},"了解 Oiyo 应用每一个关键文件的使用和目录的职责",1784021207391]