【Svelte】第十三节:HTTP 请求与 API 调用

第13节:HTTP 请求与 API 调用

—— 掌握 SvelteKit 中的数据请求机制,实现前后端数据交互


👋 引言:连接前端与后端的桥梁 —— HTTP 数据请求

在现代 Web 应用中,前后端分离架构已成为主流。前端需要通过 HTTP 请求 从服务器获取或提交数据,如文章内容、用户信息、订单状态等。

SvelteKit 提供了强大的 服务端与客户端数据加载能力,支持:

  • +page.server.js 中使用 load() 函数预取数据(SSR/SSG);
  • 在客户端组件中使用 fetch() 发起请求;
  • 使用 $app/stores 获取页面上下文;
  • 配置 API 路由实现本地接口模拟;

本节课老曹将系统讲解如何在 SvelteKit 中进行 HTTP 请求和 API 调用,并通过实战练习构建一个支持远程数据获取的博客系统。


📚 课程目标

  • 理解 SvelteKit 的数据加载流程与生命周期
  • 掌握在服务端 (+page.server.js) 和客户端发起 HTTP 请求的方法
  • 学会使用 fetch() 获取远程数据并渲染页面
  • 能够创建本地 API 路由(+server.js)用于开发环境接口模拟
  • 实战练习:构建一个支持远程数据加载的博客列表页与详情页

🧱 一、SvelteKit 数据加载机制概述

SvelteKit 提供了两种主要方式来加载数据:

方式位置特点
load() 函数+page.server.js / +layout.server.js支持 SSR/SSG,可访问数据库,返回值传递给客户端
fetch() 方法客户端 .svelte 文件客户端发起异步请求,适合 SPA 场景

✅ 示例:使用 load() 加载静态数据

// src/routes/blog/+page.server.js
export function load() {
  return {
    posts: [
      { slug: 'hello-world', title: '你好,世界' },
      { slug: 'my-journey', title: '我的旅程' }
    ]
  };
}
<!-- src/routes/blog/+page.svelte -->
<script>
  export let data;
</script>

<h2>文章列表</h2>
<ul>
  {#each $data.posts as post}
    <li><a href="/blog/{post.slug}">{post.title}</a></li>
  {/each}
</ul>

🔁 二、在服务端调用远程 API

✅ 示例:从远程 API 获取文章列表

// src/routes/blog/+page.server.js
export async function load({ fetch }) {
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();

  return { posts };
}

💡 注意:fetch 是封装后的函数,支持 SSR 并自动处理 CORS。


🔄 三、在客户端使用 fetch() 发起请求

当不需要 SSR 或希望按需加载时,可以直接在 .svelte 文件中使用 fetch()

<!-- src/routes/blog/+page.svelte -->
<script>
  import { onMount } from 'svelte';
  import { page } from '$app/stores';

  let posts = [];

  onMount(async () => {
    const res = await fetch('/api/posts');
    posts = await res.json();
  });
</script>

<h2>文章列表</h2>
<ul>
  {#each posts as post}
    <li><a href="/blog/{post.slug}">{post.title}</a></li>
  {/each}
</ul>

🧩 四、创建本地 API 路由(+server.js

SvelteKit 允许你创建本地 API 接口,便于开发调试或构建全栈应用。

✅ 示例:创建 /api/posts 接口

// src/routes/api/posts/+server.js
import { json } from '@sveltejs/kit';

export async function GET() {
  const posts = [
    { slug: 'hello-world', title: '你好,世界' },
    { slug: 'my-journey', title: '我的旅程' }
  ];

  return json(posts);
}

现在你可以通过 /api/posts 获取 JSON 数据。


🧠 五、动态路由数据加载

✅ 示例:加载单篇文章内容

// src/routes/blog/[slug]/+page.server.js
export async function load({ params, fetch }) {
  const res = await fetch(`/api/posts/${params.slug}`);
  const post = await res.json();

  if (!post) {
    throw error(404, '文章未找到');
  }

  return { post };
}
<!-- src/routes/blog/[slug]/+page.svelte -->
<script>
  export let data;
</script>

<h1>{$data.post.title}</h1>
<p>{$data.post.content}</p>

💡 六、课堂实战练习

🎯 实战任务:构建一个完整的远程数据驱动博客系统

功能要求:
  • 主页显示欢迎信息;
  • 博客列表页从远程 API 获取文章列表;
  • 博客详情页根据 slug 加载具体文章内容;
  • 创建本地 /api/posts 接口用于开发环境数据模拟;
  • 处理 404 错误情况;
示例代码:
src/routes/api/posts/+server.js
import { json } from '@sveltejs/kit';

export async function GET() {
  const posts = [
    { slug: 'hello-world', title: '你好,世界', content: '这是第一篇文章' },
    { slug: 'my-journey', title: '我的旅程', content: '讲述我的开发之旅' }
  ];

  return json(posts);
}
src/routes/blog/+page.server.js
export async function load({ fetch }) {
  const res = await fetch('/api/posts');
  return { posts: await res.json() };
}
src/routes/blog/+page.svelte
<script>
  export let data;
</script>

<h2>文章列表</h2>
<ul>
  {#each $data.posts as post}
    <li><a href="/blog/{post.slug}">{post.title}</a></li>
  {/each}
</ul>
src/routes/blog/[slug]/+page.server.js
export async function load({ params, fetch }) {
  const res = await fetch(`/api/posts/${params.slug}`);
  const post = await res.json();

  if (!post) {
    throw error(404, '文章未找到');
  }

  return { post };
}
src/routes/blog/[slug]/+page.svelte
<script>
  export let data;
</script>

<h1>{$data.post.title}</h1>
<p>{$data.post.content}</p>

📝 七、总结

本节课我们系统掌握了:

  • SvelteKit 中的数据加载机制与生命周期
  • 如何在服务端 (+page.server.js) 和客户端发起 HTTP 请求
  • 使用 fetch() 获取远程数据并渲染页面
  • 创建本地 API 路由(+server.js)用于开发环境接口模拟
  • 实战构建了一个完整的远程数据驱动博客系统

这些知识是构建真实项目、实现前后端通信的核心技能。下一讲我们将进入 动画与过渡效果 使用 svelte/animate 实现组件进入/离开动画 的学习,进一步提升svelte操作能力。


📘 附录资源推荐


🎯 课后作业

  1. /api/posts 接口改为从远程 API 获取数据。
  2. 在博客详情页添加“上一篇 / 下一篇”导航按钮。
  3. 创建一个 /api/comments/[slug] 接口,模拟评论数据。

🤖 10大高频面试题(含答案)

Q1: SvelteKit 中如何加载页面数据?

答:
使用 load() 函数定义在 +page.server.js+layout.server.js 中,在服务端或客户端加载数据。


Q2: load()fetch() 的区别是什么?

答:

  • load():用于服务端或客户端预加载,数据自动注入到页面;
  • fetch():用于客户端手动发起请求,适用于 SPA 场景;

Q3: 如何在服务端调用远程 API?

答:
+page.server.js 中使用封装的 fetch()

const res = await fetch('https://api.example.com/data');
const data = await res.json();

Q4: 如何创建本地 API 接口?

答:
创建 +server.js 文件,导出 GET, POST 等方法即可:

export function GET() {
  return json(data);
}

Q5: 如何处理 API 请求错误?

答:
使用 try/catch 捕获异常,并抛出 error()

if (!res.ok) throw error(500, '请求失败');

Q6: 如何在客户端获取当前页面参数?

答:
使用 $page.params

<script>
  import { page } from '$app/stores';
</script>

<p>当前文章 slug: {$page.params.slug}</p>

Q7: 如何优化数据加载性能?

答:

  • 使用 preloadData 提前加载目标页面数据;
  • 使用 +page.server.js 实现 SSR 加速首屏;
  • 对常用接口做缓存处理;

Q8: 如何防止重复请求?

答:
可以使用响应式变量缓存结果,避免多次调用相同接口。


Q9: 如何测试本地 API 接口?

答:
直接访问对应路径,如 /api/posts,浏览器会返回 JSON 数据。


Q10: 如何区分服务端与客户端代码?

答:

  • +page.server.js 只运行在服务端;
  • .svelte 文件中的 onMount 只运行在客户端;

🎯 总结:
这些问题覆盖了 SvelteKit 的数据加载机制、HTTP 请求方式、API 接口创建、错误处理、性能优化等核心知识点,适合用于大家应对初级到中级前端岗位的面试准备。掌握这些内容将帮助你构建出具备完整数据交互能力的 Svelte 应用,并为进一步学习表单提交、状态持久化、部署上线等进阶技能打下坚实基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈前端老曹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值