📜  使用 fetch 使用 GraphQL API – React 客户端

📅  最后修改于: 2022-05-13 01:56:45.513000             🧑  作者: Mango

使用 fetch 使用 GraphQL API – React 客户端

在本文中,我们将学习开发一个 React 应用程序,该应用程序将使用 Fetch 从公共 GraphQL API 获取数据。我们将使用电影数据库包装器 (TMDB) API 使用名称/关键字获取可用的节目。您可以在本文末尾找到 API 参考和源代码链接。

在进入开发部分之前,要初始化一个简单的 React 应用程序,您可以按照以下步骤操作:

第 1 步:创建 React 应用程序。

npx create-react-app foldername

第二步:进入项目文件夹。

cd foldername

第 3 步:创建一个组件文件夹,现在项目结构将如下所示:

项目结构

这基本上是我们应用程序所需的初始设置。现在让我们分别看一下每个组件。自定义组件位于 components 文件夹中,所有内容都放在 MainComponent.jsx 中,我们将把这个组件放在 App.js 中,它本身位于“根”DOM 节点下,该节点内的所有内容都将由 React DOM 管理.

我们将开发三个组件:

  • 主要组件:负责应用程序中的获取操作和状态更改。
  • 搜索栏:用于获取用户输入的节目名称/关键字的搜索栏。
  • ShowInfoCard:显示节目信息的可重用组件。

第 4 步:MainComponent.jsx组件中,我们有一个状态变量,数据将保存 GraphQL API 的响应。

const [data, setData] = useState(Object);

为了获取信息,我们调用apiEndpoint,但首先让我们将 GraphQL查询分开,一般来说,要形成查询,您必须在字段中指定字段,直到这些字段解析为实际数据。通过这种方式,您请求对象的特定字段并准确返回您所要求的内容。任何 GraphQL 查询的结构如下所示:

query {
    JSON objects to retrieve
}

使用我们的查询变量,我们尝试使用名称/关键字获取所有可用的节目,该名称/关键字作为$term 的参数传递。

MainComponent.jsx (query part)
const apiEndpoint = "https://tmdb.apps.quintero.io/";
const query = `
    query FetchData($term: String!){
        tv{
            search(term:$term){
              edges{
                node{
                    id
                    originalName
                }
              }
           }
        }
     }
`;


MainComponent.jsx (request part)
const getData = (term) => {
       fetch(apiEndpoint, {
           method: "POST",
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({
               query,
               variables: { term }
           })
       })
           .then(res => res.json())
           .then((data) => setData(data))
           .catch(console.error);
 };


MainComponent.jsx
import React, { useState } from "react";
import SearchBar from "./SearchBar";
import ShowInfoCard from "./ShowInfoCard";
  
function Main() {
    const [data, setData] = useState(Object);
    const apiEndpoint = "https://tmdb.apps.quintero.io/";
    const query = `
        query FetchData($term: String!){
            tv{
                search(term:$term){
                  edges{
                    node{
                        id
                        originalName
                    }
                  }
                }
              }
        }
    `;
  
    const getData = (term) => {
        fetch(apiEndpoint, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
                query,
                variables: { term }
            })
        })
            .then(res => res.json())
            .then((data) => setData(data))
            .catch(console.error);
    };
    // console.log(data)
    return (
        
                         {data.data ? data.data.tv.search.edges.map(({ node }) => (                              )) :
            }         
    );    }    export default Main;


SearchBar.jsx
import React, { useState } from "react";
  
function SearchBar({getData}){
    const [term, setTerm] = useState("");
    const onChange = (e) =>{
        setTerm(e.target.value)
    }
    const onSearch = () =>{
        getData(term)
    }
    return(
        
         {onChange(event)}}             onKeyUp={(event) => {onChange(event)}}             onPaste={(event) => {onChange(event)}}         />                  
    ); }    export default SearchBar;


ShowInfoCard.jsx
import React from "react";
  
function ShowInfoCard({ node }) {
    return (
        
            
              Name : {node.originalName}             
        
    ); }    export default ShowInfoCard;


App.js
import './App.css';
import React from "react";
import Main from './components/MainComponent';
  
function App() {
  return (
    
      
        

Consuming a GraphQL API

      
      
    
  ); }    export default App;


为了使用 Fetch API 发出请求,我们将 GraphQL查询变量作为 JSON 对象发送到端点。 GraphQL 端点期望请求的主体是包含查询和变量参数的字符串化 JSON 对象。当请求完成时,promise 将通过响应对象解析。该对象基本上是各种响应格式的通用占位符。 response.json() 用于从响应中提取 JSON 对象,它返回一个 Promise,再次解析并更新数据
MainComponent.jsx(请求部分)

MainComponent.jsx(请求部分)

const getData = (term) => {
       fetch(apiEndpoint, {
           method: "POST",
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({
               query,
               variables: { term }
           })
       })
           .then(res => res.json())
           .then((data) => setData(data))
           .catch(console.error);
 };

所以最后我们的MainComponent.jsx看起来像:

主要组件.jsx

import React, { useState } from "react";
import SearchBar from "./SearchBar";
import ShowInfoCard from "./ShowInfoCard";
  
function Main() {
    const [data, setData] = useState(Object);
    const apiEndpoint = "https://tmdb.apps.quintero.io/";
    const query = `
        query FetchData($term: String!){
            tv{
                search(term:$term){
                  edges{
                    node{
                        id
                        originalName
                    }
                  }
                }
              }
        }
    `;
  
    const getData = (term) => {
        fetch(apiEndpoint, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
                query,
                variables: { term }
            })
        })
            .then(res => res.json())
            .then((data) => setData(data))
            .catch(console.error);
    };
    // console.log(data)
    return (
        
                         {data.data ? data.data.tv.search.edges.map(({ node }) => (                              )) :
            }         
    );    }    export default Main;

第 5 步:现在,转到 SearchBar 组件,该组件用于接收用户输入的名称/关键字。它是一个简单的组件,带有一个文本类型的输入字段和一个用于发出搜索请求的按钮。状态变量term is updated 保存来自用户的输入,并在用户发出搜索请求时作为参数传递给getData()

搜索栏.jsx

import React, { useState } from "react";
  
function SearchBar({getData}){
    const [term, setTerm] = useState("");
    const onChange = (e) =>{
        setTerm(e.target.value)
    }
    const onSearch = () =>{
        getData(term)
    }
    return(
        
         {onChange(event)}}             onKeyUp={(event) => {onChange(event)}}             onPaste={(event) => {onChange(event)}}         />                  
    ); }    export default SearchBar;

第 6 步:我们的最后一个组件是一个可重用的 UI 组件,它基本上是一个卡片组件,它接收节点(包含显示信息)作为道具,并以任何选择的格式显示它。您可以调整 App.css 文件以了解各个设计方面。

ShowInfoCard.jsx

import React from "react";
  
function ShowInfoCard({ node }) {
    return (
        
            
              Name : {node.originalName}             
        
    ); }    export default ShowInfoCard;

第 7 步:最后,我们需要在App.js文件中包含 MainComponent:

应用程序.js

import './App.css';
import React from "react";
import Main from './components/MainComponent';
  
function App() {
  return (
    
      
        

Consuming a GraphQL API

      
      
    
  ); }    export default App;

运行应用程序的步骤:要在您的系统上运行应用程序,请运行以下命令:

输出:

GraphQL API:https://github.com/nerdsupremacist/tmdb

获取 API:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API