【问题标题】:React Fetch not working for one link but works for anotherReact Fetch 不适用于一个链接,但适用于另一个链接
【发布时间】:2021-09-22 19:52:09
【问题描述】:

我正在尝试使用 react 来获取 api 信息(见下文),但它没有返回任何值,但当我使用不同的链接时它可以工作。不确定第二个链接的问题是什么。如何使第二个链接工作或有不同的方法?

import React, { useState, useEffect } from "react";
import axios from "axios";
export default function App() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  useEffect(() => {
    getData()
}, []);

async function getData() {
  // await axios("https://randomuser.me/api")             // <----- this works
  await axios("https://api.sampleapis.com/wines/reds")    // <----- this does not work
  .then((response) => {
    setData(response.data);
    console.error("No Error fetching data: fds");
  })
  .catch((error) => {
    console.error("Error fetching data: ", error);
    setError(error);
  })
  .finally(() => {
    setLoading(false);
  });
}
if (loading) return "Loading...";
if (error) return "Error!"; //dfdsaf
return ( <>
    {/* <img src={data.results[0].picture.medium} alt="random user" /> */}
    <pre>{JSON.stringify(data, null, 2)}</pre>
  </>
); }

【问题讨论】:

  • 请更详细地描述究竟是什么不起作用。直接点击这两个 URL 我会看到数据,所以我怀疑您没有正确处理响应值。
  • 与您的问题无关但只是让您知道,您正在使用 await 使您的代码同步,您不需要“then”块。改为这样做: const wineData = await axios("api.sampleapis.com/wines/reds"); setData(wineData.data)
  • 嗨,是的,我对反应和获取数据非常陌生。这是我找到的一些在线代码,我只是输入了一个新网址。如何进行调试并查看您看到的数据?
  • 在浏览器 (Chrome) 中,我只是突出显示了 URL,右键单击,然后选择“转到 'https:// .........'”,然后 JSON 在新窗口/标签。您还可以在 axios 行上放置一个调试器并检查它,或使用控制台日志。

标签: javascript reactjs fetch


【解决方案1】:

各个API返回数据的结构各不相同。

https://randomuser.me/api -> returns {"results":[{"gender"...

https://api.sampleapis.com/wines/reds -> returns [{"winery":"Maselva","wine"...

显然,仅仅更改 URL 是行不通的。您必须根据返回数据的结构相应地更改代码才能正确访问它们。

【讨论】:

  • 嗨,是的,我对反应和获取数据非常陌生。这是我找到的一些在线代码,我只是输入了一个新网址。我该如何调试和查看您看到的数据以及如何进行相应调整?
  • 在执行任何操作之前将响应记录到控制台会使事情变得更容易 -> console.log(response)
  • @YuanL 在这种情况下,另一种选择是访问 Web 浏览器中的 URL。大多数流行的浏览器都有一个特殊的交互式 JSON 视图,您可以在其中检查结构。
【解决方案2】:

响应结构不同,您可能不需要使用.then.catch,因为您已经使用了Async/Await

这是codesandbox 中的一个工作示例

<script type="text/babel">
// import React, { useState, useEffect } from "react";
// import axios from "axios";
const { useState, useEffect } = React;

function App() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [randomUserData, setRandomUserData] = useState(null);
  const [randomUserLoading, setRandomUserLoading] = useState(true);
  const [randomUserError, setRandomUserError] = useState(null);
  useEffect(() => {
    getRandomUserData();
    getSampleApiData();
  }, []);

  async function getSampleApiData() {
    try {
      const response = await axios("https://api.sampleapis.com/wines/reds");
      setData(response.data);
      console.error("No Error fetching data: fds");
    } catch (error) {
      console.error("Error fetching data: ", error);
      setError(error);
    }
    setLoading(false);
  }

  async function getRandomUserData() {
    try {
      const response = await axios("https://randomuser.me/api");
      setRandomUserData(response.data);
      console.error("No Error fetching data: fds");
    } catch (error) {
      console.error("Error fetching data: ", error);
      setRandomUserError(error);
    }
    setRandomUserLoading(false);
  }

  if (loading || randomUserLoading) return "Loading...";
  if (error || randomUserError) return "Error!";
  return (
    <div
      style={{
        display: "grid",
        gridTemplateColumns: "repeat(2, 1fr)",
        width: "100%"
      }}
    >
      <div>
        <pre>{JSON.stringify(data, null, 2)}</pre>
      </div>
      <div>
        <pre>{JSON.stringify(randomUserData, null, 2)}</pre>
      </div>
    </div>
  );
}

// export default App;
ReactDOM.render(<App />, document.querySelector("#app"));
</script>

<div id="app"></div>

<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/axios@0/dist/axios.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone@7/babel.js"></script>

【讨论】:

  • 感谢分享。您提到响应结构不同,但是您在代码中的哪个位置解释了它?对我来说看起来一样,但这可能只是我不知道在哪里看
  • 响应与response.data内部的响应不同。正如@rukshan 所述,API 返回数据如下。 randomuser.me/api 返回 {"results":[{"gender"... api.sampleapis.com/wines/reds -> 返回 [{"winery":"Maselva","wine"...
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 2016-02-06
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
相关资源
最近更新 更多