GraphQL 教學:C# 與 React 實戰範例

1. 什麼是 GraphQL?

GraphQL 是一種 API 查詢語言,由 Facebook 推出,支援客製化查詢、單一端點、型別安全,適合現代前後端分離開發。

2. C# 後端:HotChocolate 快速入門

安裝 HotChocolate

# 建立專案
 dotnet new web -n GraphQLDemo
 cd GraphQLDemo
# 安裝 HotChocolate
 dotnet add package HotChocolate.AspNetCore

定義資料模型與查詢

public class Book {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
}

public class Query {
    public List<Book> GetBooks() => new() {
        new Book { Id = 1, Title = "GraphQL 入門", Author = "Mars" },
        new Book { Id = 2, Title = "C# 實戰", Author = "John" }
    };
}

註冊 GraphQL 服務

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

builder.Services
    .AddGraphQLServer()
    .AddQueryType<Query>();

app.MapGraphQL();
app.Run();

啟動後,瀏覽 http://localhost:5000/graphql 可用 Banana Cake Pop 測試查詢:

query {
  books {
    id
    title
    author
  }
}

3. React 前端:Apollo Client 基本用法

安裝 Apollo Client

npm install @apollo/client graphql

設定 ApolloProvider

import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';

const client = new ApolloClient({
  uri: 'http://localhost:5000/graphql',
  cache: new InMemoryCache(),
});

function App() {
  return (
    <ApolloProvider client={client}>
      <BookList />
    </ApolloProvider>
  );
}

撰寫查詢與元件

import { useQuery, gql } from '@apollo/client';

const GET_BOOKS = gql`
  query {
    books {
      id
      title
      author
    }
  }
`;

function BookList() {
  const { loading, error, data } = useQuery(GET_BOOKS);
  if (loading) return <p>載入中...</p>;
  if (error) return <p>錯誤: {error.message}</p>;
  return (
    <ul>
      {data.books.map(book => (
        <li key={book.id}>{book.title} - {book.author}</li>
      ))}
    </ul>
  );
}

4. 進階:Mutation 範例

C# Mutation

public class Mutation {
    public Book AddBook(string title, string author) =>
        new Book { Id = 3, Title = title, Author = author };
}
// 註冊 Mutation
builder.Services.AddGraphQLServer()
    .AddQueryType<Query>()
    .AddMutationType<Mutation>();

React Mutation

import { useMutation, gql } from '@apollo/client';

const ADD_BOOK = gql`
  mutation($title: String!, $author: String!) {
    addBook(title: $title, author: $author) {
      id
      title
      author
    }
  }
`;

function AddBookForm() {
  const [addBook, { data }] = useMutation(ADD_BOOK);
  // ...表單處理略
}

本文涵蓋 GraphQL 基礎、C# HotChocolate 與 React Apollo Client 實戰,適合全端開發者快速上手!