Lập trình & Dev23/04/202614 phút đọc

API design 2026: REST vs GraphQL vs tRPC — chọn style nào cho dự án VN nhỏ?

REST vẫn dominant nhưng GraphQL và tRPC đang thay đổi cách build API năm 2026. Bài này so sánh 3 style với focus vào dự án VN nhỏ — khi nào REST đủ, khi nào GraphQL, khi nào tRPC.

TLDR — 3 style, 3 triết lý khác

Chọn theo stack + team
  • Team BE/FE tách biệt, cần public API + 3rd-party integrationREST (OpenAPI 3.1 + Postman). Universal, mature ecosystem.
  • App mobile + web với nhu cầu query linh hoạt + over-fetching concernGraphQL. BFF pattern với Apollo/URQL.
  • Fullstack TypeScript (Next.js/Remix/Nuxt), solo dev hoặc team nhỏ cùng languagetRPC. Type safety end-to-end không code gen.
  • Real-time heavy (chat, live) → WebSocket / Server-Sent Events / GraphQL Subscriptions trên nền REST/GraphQL/tRPC.

Năm 2026, không có câu trả lời 'API style tốt nhất'. Mỗi style fit scenario khác nhau. Quyết định sai có thể mất 2-3 tháng migrate sau này. Bài này giúp bạn chọn đúng từ đầu.

76%
API production 2026 dùng REST
18%
Dùng GraphQL
5%
Dùng tRPC
50%
TS fullstack startup chọn tRPC năm đầu

Quảng cáo tài trợ

REST — đường cong học thấp, ecosystem lớn nhất

REST (Representational State Transfer) là style API phổ biến nhất năm 2026 — ~76% API production theo Postman State of API 2025. Dùng HTTP method + resource URL (GET /users/123, POST /orders).

Ưu điểm: - Universal: mọi ngôn ngữ/framework hỗ trợ HTTP client. Public API mobile/IoT dùng REST chuẩn. - HTTP caching native: ETag, Cache-Control, CDN cache response dễ. Giảm server load rõ rệt. - Debugging dễ: chỉ cần browser DevTools hoặc Postman xem request/response. - OpenAPI 3.1 spec (formerly Swagger): auto-generate docs + client SDK cho 30+ ngôn ngữ. - Security model rõ: OAuth 2.1, JWT, API key, rate limit chuẩn.

Nhược điểm: - Over-fetching / under-fetching: mobile app cần 3 field của User nhưng REST trả full object 20 field. Waste bandwidth. Hoặc cần 3 API call lấy user + orders + addresses. - Versioning pain: breaking change → tạo v2, maintain v1 cho backward compat. Phức tạp. - No type safety end-to-end: frontend dev phải tự sync type với backend (hoặc code gen từ OpenAPI). - Verbose cho CRUD lặp: mỗi resource cần 5 endpoint (GET list, GET one, POST, PATCH, DELETE).

Khi nào chọn REST: - Public API cho 3rd-party integration (Stripe, Shopify, tất cả dùng REST). - Team BE/FE tách biệt, dùng ngôn ngữ khác nhau. - API cần SEO/crawl — Google bot crawl REST endpoints dễ. - Team mới, cần hiring — REST dev dễ tìm nhất. - Legacy integration — ERP, CRM cũ chỉ hỗ trợ REST.

Framework/tool 2026: - Node.js: Express (simple), Fastify (faster), NestJS (opinionated). - Python: FastAPI (auto OpenAPI + async), Django REST Framework. - Go: Gin, Echo, Chi. - Documentation: Swagger UI / Redoc / Scalar (mới 2024, đẹp hơn Swagger). - Test: Postman (xem hướng dẫn).

GraphQL — client query đúng data cần

GraphQL (Facebook, 2015) là query language cho API. Client gửi query mô tả data cần → server trả chính xác data đó, không thừa không thiếu.

Example: ```graphql query { user(id: "123") { name email orders(last: 5) { total status } } } ``` Server trả JSON đúng structure trên. Không cần nhiều request.

Ưu điểm: - Giải quyết over-fetching: client specify fields, API trả đúng. Mobile app tiết kiệm bandwidth. - Single endpoint: /graphql handle tất cả query/mutation. Đơn giản hơn nhiều REST endpoint. - Strongly typed schema: tool như GraphQL Codegen generate TypeScript types tự động. - Fragments reusable: component share UI fragment query, composable. - Subscriptions real-time: built-in WebSocket support cho real-time data. - Multi-data-source aggregation: 1 GraphQL query fetch data từ nhiều service backend (REST + DB + 3rd-party).

Nhược điểm: - HTTP caching phức tạp: mọi query POST /graphql → browser/CDN khó cache. Cần Apollo Client cache hoặc GraphQL-specific CDN. - N+1 query problem: resolver nested (User → Orders → Items) có thể gây hàng trăm query DB. Cần DataLoader pattern. - Learning curve cao: schema, resolver, federation, cache — mất 2-4 tuần onboarding. - Authorization phức tạp: mỗi field có thể cần permission check riêng. - File upload awkward: native GraphQL không support, phải dùng multipart spec extension.

Khi nào chọn GraphQL: - Mobile app với nhiều view khác nhau — mỗi view query data khác. - Backend aggregate nhiều microservice — GraphQL gateway đứng trước cluster service. - Team có frontend heavy, muốn tự control data fetching. - Iteration rapid — thêm field không cần version API.

Framework 2026: - Node.js: Apollo Server, GraphQL Yoga, Mercurius (Fastify-based). - Python: Strawberry, Graphene. - Go: gqlgen. - Client: Apollo Client (React), URQL (lightweight), Relay (Meta). - Schema-first vs code-first: 2026 hầu hết dùng code-first (schema generate từ code).

tRPC — type safety end-to-end cho TypeScript fullstack

tRPC (Alex Johansson, 2020) là RPC framework cho TypeScript — không có schema definition riêng, type suy ra từ code TypeScript. Call API y hệt call function.

Example: ```ts // server/routers/user.ts export const userRouter = t.router({ getById: t.procedure .input(z.object({ id: z.string() })) .query(async ({ input }) => { return await db.user.findUnique({ where: { id: input.id } }); }), }); // client const user = await trpc.user.getById.query({ id: "123" }); // user fully typed, autocomplete, type error at compile time ```

Ưu điểm: - Type safety end-to-end: rename field trong DB → TypeScript báo lỗi tất cả client code dùng field đó. Zero runtime type error. - Zero code gen: không cần chạy npm run codegen sau thay đổi schema. - DX xuất sắc: autocomplete API ngay trong IDE như gọi function local. - Integrate với React Query: caching, optimistic update, retry built-in. - Small bundle size: ~8KB client, không có overhead GraphQL runtime. - Subscription support real-time qua WebSocket.

Nhược điểm: - TypeScript only: server + client cùng TypeScript mono/shared repo. Không dùng được cho Python/Go backend. - Không public API friendly: tRPC không fit cho expose API ra ngoài 3rd-party (không OpenAPI spec natively). - Mobile native (Swift/Kotlin) không dùng được — cần wrap REST. - Monorepo required hoặc share types qua npm package — setup non-trivial. - Ecosystem nhỏ hơn REST/GraphQL — community 2026 growing nhưng chưa mature.

Khi nào chọn tRPC: - Fullstack TypeScript: Next.js + API routes, Remix, Nuxt Nitro, Astro. - Solo dev hoặc team nhỏ < 10 người cùng TypeScript. - Startup MVP ship fast — tRPC tiết kiệm 30-50% thời gian dev API. - Không cần public API — dùng internal FE + BE.

Framework 2026: - tRPC v11 (2025): performance tốt hơn, better error handling, experimental HTTP streaming. - Adapter: Next.js App Router, Fastify, Express, AWS Lambda. - Alternative: Hono RPC (lighter, Hono framework), Bun's elysia RPC.

tRPC + Prisma + Next.js = t3 stack

Combo phổ biến 2024-2026 cho solo dev VN làm SaaS: Next.js + tRPC + Prisma + Tailwind + shadcn/ui. Có template create-t3-app — scaffold dự án full-stack typed trong 5 phút. 40% indie dev VN dùng combo này để build MVP.

Quảng cáo tài trợ

Bảng so sánh chi tiết — REST vs GraphQL vs tRPC

Tiêu chíRESTGraphQLtRPC
Năm ra đời200020152020
TransportHTTP methodsHTTP POST /graphqlHTTP POST + batch
Type safety E2E❌ (cần codegen OpenAPI)⚠️ (cần codegen)✅ Native
HTTP cache✅ Xuất sắc⚠️ Cần Apollo Client⚠️ React Query
Over-fetching⚠️ Có✅ Không✅ Không
N+1 problemÍt⚠️ Hay gặpÍt
Learning curve⭐ Dễ⭐⭐⭐ Khó⭐⭐ Medium
Public API fit✅ Best✅ Good❌ Bad
Mobile native
Subscriptions real-time❌ (cần WS riêng)✅ Built-in✅ Built-in
File upload✅ Simple⚠️ Multipart extension✅ Simple
Bundle client sizeSmallLarge (Apollo ~40KB)Tiny (~8KB)
Ecosystem⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Team multi-language

Use case theo loại dự án VN

SaaS B2B internal tools + dashboard: - Solo/team nhỏ TS fullstack → tRPC + Next.js. - Team BE/FE split → REST OpenAPI + React + Tanstack Query.

E-commerce + mobile app (iOS + Android + Web): - GraphQL qua Apollo Server — mobile app fetch đúng data cho từng screen. - Alternative: REST + BFF (Backend-for-Frontend pattern) — fit nếu team không quen GraphQL.

Public API cho partner/3rd-party: - REST bắt buộc. OpenAPI 3.1 spec + Postman collection. - GraphQL/tRPC không phù hợp — partner dev không dùng được universally.

Real-time chat / collaboration app: - GraphQL Subscriptions hoặc tRPC Subscriptions cho typing indicator. - Plus WebSocket (Socket.IO, native ws) cho message delivery.

Microservice backend với multiple frontend (web + mobile + admin panel): - GraphQL Federation — Apollo Federation/Hasura stitching nhiều service thành 1 schema. - Alternative: REST + API Gateway (Kong, Tyk) pattern.

Startup MVP 1-2 người dev: - tRPC + Next.js — ship MVP 2-4 tuần thay vì 2-3 tháng. - Switch sang REST sau khi có traction + cần public API.

Case study VN

Một team 2 người VN build MVP SaaS quản lý kho cho shop Shopee (2025): dùng tRPC + Next.js 16 + Prisma + Supabase. Ship MVP 5 tuần, 300 user paying sau 3 tháng. Lý do chọn tRPC: type safety giúp không có bug runtime, dev solo không lo API contract. Sau 6 tháng scale, thêm REST API cho webhook Shopee mà vẫn giữ tRPC cho internal.

Migration + coexistence — không phải all-in-one

Không bắt buộc chọn 1 style duy nhất. Nhiều dự án dùng kết hợp:

Pattern 1: REST + GraphQL: - REST cho public API (Stripe-style). - GraphQL gateway cho internal mobile app aggregate data.

Pattern 2: tRPC + REST: - tRPC cho internal app (admin dashboard, web app) — solo dev ship fast. - REST cho webhook inbound + mobile app — universal.

Pattern 3: GraphQL + REST: - GraphQL primary cho frontend. - REST fallback cho file upload, server-sent events, 3rd-party integration.

Migration REST → GraphQL thường khó (rewrite resolver + client queries). Migration REST → tRPC còn khó hơn (cần rewrite tất cả handler với context TypeScript). Migration tRPC → REST dễ nhất — tRPC có OpenAPI adapter (trpc-openapi) generate REST endpoint từ tRPC router, phục vụ public API trong khi vẫn giữ tRPC cho internal.

Để test API bất kỳ style nào (REST, GraphQL qua HTTP), dùng Postman — tool phổ biến nhất cho API testing, hỗ trợ automation + collaboration. Xem hướng dẫn Postman chi tiết trong bài /phan-mem/postman.

Câu hỏi thường gặp

REST chết chưa? Startup mới nên học GraphQL/tRPC?

REST chưa chết — 76% API production 2026 vẫn REST. Học REST trước là must-have (mọi dev cần biết). Sau đó học thêm GraphQL (nếu work với mobile/microservice) hoặc tRPC (nếu TypeScript fullstack). Không học 'hot tool' đầu tiên mà bỏ qua REST.

tRPC có scale được cho startup lớn không?

Có nhưng trade-off. Airbnb, Uber không dùng tRPC vì team multi-language + public API. Nhưng Cal.com (open-source 100K+ user), Vercel production apps, Hashnode dùng tRPC scale OK. Key: monorepo + TypeScript toàn công ty. Nếu team > 50 dev TS mono → tRPC vẫn fit. Nếu polyglot → REST/GraphQL.

GraphQL N+1 problem xử lý thế nào?

Dùng DataLoader pattern: batch + cache DB queries trong 1 request. Ví dụ: query 100 User + orders → thay vì 100 DB query lấy orders từng user, DataLoader gom thành 1 query SELECT * FROM orders WHERE user_id IN (1..100). Apollo Server, Mercurius có DataLoader helper built-in. Ngoài ra dùng persisted queries + query complexity analysis để limit abuse.

gRPC có phải lựa chọn tốt không?

gRPC (Google, Protobuf) tốt cho internal service-to-service communication (microservice backend). Không fit cho browser client (browser không support HTTP/2 streams native, phải dùng gRPC-Web proxy). Team VN nhỏ hiếm dùng gRPC — overkill cho < 10 service. Fit khi có > 20 microservice + cần performance cực cao.

Nên dùng BFF (Backend-for-Frontend) pattern không?

BFF fit khi có nhiều client type (web + iOS + Android + smart TV). Mỗi client có BFF riêng để aggregate/transform data phù hợp. Team 2-5 người thường chưa cần BFF — 1 API phục vụ web + mobile đủ. Consider BFF khi team > 10 dev và có > 2 platform khác biệt lớn.

Authentication ở REST vs GraphQL vs tRPC khác nhau thế nào?

REST: mỗi endpoint check auth middleware. OAuth 2.1 / JWT header standard. GraphQL: middleware ở resolver level, field-level auth (user A xem field X nhưng không xem Y). Phức tạp hơn. tRPC: middleware trên router/procedure, context-based auth — tương tự REST nhưng type-safe. Với JWT, tất cả đều tương tự: validate token trong middleware, decode claims vào context.

Versioning API như thế nào?

REST: URL versioning /v1/users, /v2/users (phổ biến nhất, explicit). Hoặc header version (cleaner URL nhưng khó debug). GraphQL: không version — evolve schema bằng deprecation field marker (@deprecated), add new field thay thế. Non-breaking. tRPC: tương tự GraphQL, deprecate procedure bằng type + JSDoc. Deploy BE-FE đồng thời (monorepo) → không version issue.

Nguồn tham khảo chính thức

Quảng cáo tài trợ

Công cụ liên quan

Sau khi đọc xong, bạn có thể chuyển sang đúng công cụ liên quan để thử ngay trong bối cảnh thực tế.

Hướng dẫn Postman