如何在 Next.js 应用程序中正确调用 API

问题描述 投票:0回答:1

我一直在尝试了解从 Next.js 应用程序调用外部 API 的正确方法是什么,因为我习惯于开发 MERN 堆栈应用程序,我通常使用 axios 进行 API 调用并在 useEffect 中使用它。尝试学习 Next.js 并接受所有信息,我感到困惑,特别是服务器组件之类的,我尝试执行以下操作,它似乎有效,但问题是:这真的是正确的方法吗?

我的下一个应用程序>应用程序>api>你好>route.ts

import axios from "axios";

export async function GET() {
  const response = await axios.get("http://localhost:5000");

  return Response.json(response.data);
}

我的下一个应用程序>你好>page.tsx

"use client";

import axios from "axios";
import * as React from "react";

export default function page() {
  const [msg, setMsg] = React.useState("");

  React.useEffect(() => {
    axios.get("api/hello").then((res) => {
      // { msg: "Hello World!" }
      setMsg(res.data.msg);
    });
  }, []);

  return <div>{msg}</div>;
}
typescript next.js axios mern
1个回答
0
投票

在此示例中,您可以让客户端直接调用该 API。它不需要秘密令牌,并且数据不与其他服务器端数据结合。所以服务器实际上并没有在中间做任何事情。

但是假设您必须使用只有您的服务器知道的秘密令牌来针对此 API 进行身份验证。

现在你的服务器路由看起来更像是:

const secret = 'abcd1234'

export async function GET() {
  const response = await axios.get(`http://externalhost.com?secret=${secret}`);
  return Response.json(response.data);
}

现在假设您想要从此响应中删除您的用户可能无权访问的所有项目。所以你必须做一些过滤:

const secret = 'abcd1234'

export async function GET() {
  const response = await axios.get(`http://externalhost.com?secret=${secret}`);
  const data = response.data.filter(item => !item.hasSensitiveData)
  return Response.json(data);
}

现在情况更加复杂,如果暴露给您的用户,至少有 2 种数据会危及您的安全。

关键是,在大多数实际应用程序中,服务器必须拥有该外部接口,因为服务器拥有客户端没有的数据,让客户端这样做是非常不安全的。


是的,看起来不错。

© www.soinside.com 2019 - 2024. All rights reserved.