GraphQL Và Những Điểm Vượt Trội So Với REST API
- Published on

- GraphQL là gì?
- Cách thức hoạt động của GraphQL
- So sánh giữa GraphQL và REST API
- Cấu trúc và cách thức yêu cầu dữ liệu
- Quản lý dữ liệu
- Khả năng mở rộng và quản lý phiên bản API
- Bảng so sánh tổng quan
- Những tính năng vượt trội của GraphQL so với REST API
- Những trường hợp nên sử dụng GraphQL và REST API
- Khi nào nên sử dụng GraphQL?
- Khi nào nên sử dụng REST API?
- Tương lai của GraphQL
- Sự phát triển mạnh mẽ của hệ sinh thái GraphQL
- Tăng cường hỗ trợ cho các nền tảng đa dạng
- Cải tiến về bảo mật và khả năng kiểm soát truy cập
- Tích hợp với các công nghệ mới
- Phổ biến trong các dự án đa nền tảng
- Kết luận
GraphQL là gì?
GraphQL là một ngôn ngữ truy vấn API mạnh mẽ và linh hoạt, được phát triển bởi Facebook vào năm 2012 và trở thành mã nguồn mở vào năm 2015. Với GraphQL, bạn có thể truy vấn dữ liệu một cách chính xác và hiệu quả hơn so với các API truyền thống như REST API.

Khác với REST, nơi bạn phải thực hiện nhiều yêu cầu HTTP để lấy dữ liệu từ các endpoints khác nhau, GraphQL cho phép client (người sử dụng ứng dụng hoặc website) chỉ yêu cầu đúng những dữ liệu mình cần trong một yêu cầu duy nhất. Điều này giúp giảm thiểu vấn đề over-fetching (lấy dữ liệu thừa) và under-fetching (lấy thiếu dữ liệu) – những vấn đề thường gặp khi làm việc với REST API.
Với GraphQL, bạn có thể truy vấn nhiều nguồn dữ liệu từ một endpoint duy nhất, thay vì phải quản lý nhiều URL khác nhau như trong REST API. Điều này giúp tiết kiệm thời gian và băng thông, tối ưu hóa hiệu suất và trải nghiệm người dùng.
“GraphQL là một sự đổi mới lớn trong cách thức phát triển API, giúp bạn tối ưu hóa việc truy vấn và nhận dữ liệu một cách chính xác mà không gặp phải sự phức tạp của API truyền thống.”
Cách thức hoạt động của GraphQL
GraphQL là một query language (ngôn ngữ truy vấn) cho API, được phát triển bởi Facebook vào năm 2012 và công khai vào năm 2015. Nó cung cấp một cách thức linh hoạt và hiệu quả để client có thể yêu cầu và nhận dữ liệu từ server. GraphQL không sử dụng các phương thức HTTP truyền thống như GET, POST, PUT, DELETE mà thay vào đó, toàn bộ quá trình tương tác diễn ra qua một endpoint duy nhất.
Một trong những đặc điểm nổi bật của GraphQL là khả năng cho phép client yêu cầu chính xác các dữ liệu mà họ cần, thay vì phải nhận tất cả dữ liệu từ server như trong REST API. Khi client gửi một truy vấn (query) đến server, nó sẽ chỉ nhận về dữ liệu mà nó yêu cầu, giúp tiết kiệm băng thông và tối ưu hiệu suất.
Ví dụ, trong một ứng dụng blog, thay vì phải gửi nhiều yêu cầu đến các endpoint khác nhau để lấy thông tin về người dùng và bài viết của họ, với GraphQL, bạn có thể thực hiện một truy vấn duy nhất để lấy cả hai loại dữ liệu trong một lần yêu cầu.
{
user(id: 1) {
name
email
}
posts(userId: 1) {
title
content
}
}
Truy vấn trên sẽ trả về dữ liệu theo yêu cầu của client, với tên và email của người dùng cùng với danh sách các bài viết của họ. GraphQL cũng hỗ trợ các thao tác như mutation (để thay đổi dữ liệu) và subscription (để lắng nghe các sự kiện thay đổi dữ liệu theo thời gian thực).
Một điểm mạnh khác của GraphQL là tính năng schema và type system. Server định nghĩa một schema chi tiết về các loại dữ liệu mà client có thể yêu cầu, cùng với các truy vấn và thao tác hợp lệ. Điều này giúp client có thể dễ dàng khám phá API và yêu cầu dữ liệu mà không cần phải hiểu cấu trúc của server.
So sánh giữa GraphQL và REST API
Khi so sánh GraphQL và REST API, có một số điểm quan trọng mà bạn cần chú ý để hiểu rõ sự khác biệt và chọn phương thức phù hợp cho dự án của mình.
Cấu trúc và cách thức yêu cầu dữ liệu
REST API thường tổ chức các tài nguyên (resources) dưới dạng các endpoint riêng biệt. Mỗi endpoint đại diện cho một tài nguyên, ví dụ như /users
, /posts
, hoặc /comments
. Client phải thực hiện nhiều yêu cầu HTTP để truy xuất các tài nguyên khác nhau hoặc các phần khác nhau của dữ liệu. Ví dụ, để lấy thông tin về người dùng và các bài viết của họ, client phải gửi một yêu cầu đến endpoint /users
và sau đó gửi một yêu cầu nữa đến endpoint /posts
.
GraphQL, ngược lại, sử dụng một endpoint duy nhất để thực hiện tất cả các truy vấn và thay đổi dữ liệu. Client có thể chỉ định chính xác những gì nó cần trong một truy vấn duy nhất, giúp giảm thiểu số lượng yêu cầu và tối ưu băng thông.
Quản lý dữ liệu
Một trong những vấn đề mà REST API gặp phải là over-fetching (lấy dữ liệu thừa) hoặc under-fetching (lấy thiếu dữ liệu). Với REST, khi bạn gọi một endpoint, server sẽ trả về một tập hợp dữ liệu cố định, có thể là nhiều hơn hoặc ít hơn so với những gì bạn cần. Ví dụ, khi yêu cầu thông tin của một người dùng, bạn có thể nhận được một lượng dữ liệu không cần thiết như thông tin về các bài viết của họ, mặc dù bạn chỉ cần tên và email của người dùng.
GraphQL giải quyết vấn đề này bằng cách cho phép client yêu cầu chính xác dữ liệu mình cần, giảm thiểu việc over-fetching và under-fetching. Bạn có thể chỉ định những trường dữ liệu cụ thể trong truy vấn, giúp server trả về chỉ những gì bạn yêu cầu.
Khả năng mở rộng và quản lý phiên bản API
Với REST API, khi cần thay đổi hoặc thêm các tính năng mới, đôi khi bạn phải tạo các phiên bản mới của API (versioning) như /v1/users
, /v2/users
. Điều này có thể dẫn đến việc quản lý nhiều phiên bản API và làm phức tạp quá trình duy trì ứng dụng.
GraphQL không yêu cầu phiên bản API vì schema của nó có thể linh hoạt thay đổi. Khi có thêm các trường hoặc kiểu dữ liệu mới, client chỉ cần cập nhật truy vấn của mình mà không làm ảnh hưởng đến các ứng dụng khác đang sử dụng API. Điều này giúp GraphQL dễ dàng mở rộng và bảo trì hơn khi so với REST API.
Bảng so sánh tổng quan
Đặc điểm | REST API | GraphQL |
---|---|---|
Cấu trúc và cách thức yêu cầu dữ liệu | REST API sử dụng nhiều endpoint riêng biệt cho mỗi tài nguyên (ví dụ: /users, /posts, /comments). | GraphQL sử dụng một endpoint duy nhất cho tất cả các truy vấn và thay đổi dữ liệu. |
Quản lý dữ liệu | REST API có thể gặp phải vấn đề over-fetching (lấy thừa dữ liệu) hoặc under-fetching (lấy thiếu dữ liệu). | GraphQL cho phép client yêu cầu chính xác các trường dữ liệu cần thiết, giúp giảm thiểu over-fetching và under-fetching. |
Khả năng mở rộng và quản lý phiên bản API | REST API yêu cầu quản lý nhiều phiên bản API (ví dụ: /v1, /v2), dễ làm phức tạp quá trình duy trì. | GraphQL không cần phiên bản API, schema có thể thay đổi linh hoạt mà không ảnh hưởng đến các client khác. |
Những tính năng vượt trội của GraphQL so với REST API
GraphQL sở hữu nhiều tính năng vượt trội so với REST API, giúp việc phát triển ứng dụng trở nên linh hoạt và hiệu quả hơn. Dưới đây là một số tính năng nổi bật mà GraphQL mang lại:
-
Linh hoạt trong việc truy vấn dữ liệu
Một trong những điểm mạnh lớn nhất của GraphQL là khả năng cho phép client yêu cầu chính xác những gì họ cần, thay vì nhận tất cả dữ liệu từ một endpoint như trong REST API. Điều này giúp giảm thiểu over-fetching (lấy dữ liệu thừa) và under-fetching (lấy dữ liệu thiếu), đảm bảo ứng dụng chỉ nhận đúng thông tin cần thiết. -
Chỉ sử dụng một endpoint duy nhất
Trong REST API, mỗi tài nguyên như người dùng, bài viết, hoặc bình luận sẽ có endpoint riêng biệt. Điều này có thể tạo ra sự phức tạp trong việc quản lý và duy trì nhiều endpoint khác nhau. Với GraphQL, chỉ cần một endpoint duy nhất cho tất cả các loại yêu cầu, từ đó giảm bớt sự phức tạp khi giao tiếp với server. -
Khả năng mở rộng mà không cần thay đổi phiên bản API
GraphQL không yêu cầu tạo ra các phiên bản API mới mỗi khi có sự thay đổi trong dữ liệu. Với GraphQL, bạn có thể mở rộng schema bằng cách thêm các loại truy vấn mới mà không làm gián đoạn các yêu cầu hiện tại từ client. Điều này cực kỳ hữu ích trong các ứng dụng lớn, giúp duy trì sự ổn định trong khi vẫn phát triển và cải tiến hệ thống. -
Tăng cường hiệu suất và giảm số lượng yêu cầu
Trong REST API, để lấy dữ liệu liên quan từ nhiều tài nguyên, client phải thực hiện nhiều yêu cầu HTTP (ví dụ, một yêu cầu để lấy thông tin người dùng, một yêu cầu khác để lấy các bài viết của người đó). Trong GraphQL, client có thể thực hiện một truy vấn duy nhất để lấy tất cả dữ liệu cần thiết từ nhiều tài nguyên cùng lúc, giúp giảm bớt số lượng yêu cầu HTTP và cải thiện hiệu suất của ứng dụng. -
Cung cấp công cụ mạnh mẽ cho developer
GraphQL đi kèm với các công cụ phát triển như GraphiQL (trình duyệt GraphQL) giúp người dùng dễ dàng xây dựng và thử nghiệm các truy vấn, đồng thời khám phá schema của API. Điều này giúp các lập trình viên dễ dàng tương tác và kiểm tra dữ liệu trong quá trình phát triển mà không gặp khó khăn khi sử dụng API.
Với những tính năng vượt trội này, GraphQL đang dần trở thành một sự lựa chọn phổ biến cho việc xây dựng các API hiện đại, đặc biệt là đối với các ứng dụng cần tối ưu hóa tốc độ và hiệu suất.
Những trường hợp nên sử dụng GraphQL và REST API
Mặc dù GraphQL mang lại nhiều lợi ích vượt trội so với REST API, không phải lúc nào GraphQL cũng là sự lựa chọn tốt nhất. Việc lựa chọn giữa GraphQL và REST API phụ thuộc vào yêu cầu cụ thể của dự án và đặc thù của ứng dụng. Dưới đây là một số trường hợp nên sử dụng GraphQL và khi nào REST API là sự lựa chọn hợp lý:
Khi nào nên sử dụng GraphQL?
-
Ứng dụng cần truy vấn dữ liệu từ nhiều nguồn khác nhau
Nếu ứng dụng của bạn yêu cầu truy vấn dữ liệu từ nhiều tài nguyên hoặc dịch vụ khác nhau trong một lần, GraphQL là sự lựa chọn lý tưởng. Với khả năng thực hiện nhiều truy vấn trong một yêu cầu duy nhất, GraphQL giúp giảm số lượng yêu cầu và tối ưu hóa tốc độ tải trang. Ví dụ, trong các ứng dụng có nhiều dữ liệu liên quan, như các mạng xã hội hoặc các nền tảng thương mại điện tử, GraphQL sẽ giúp bạn dễ dàng truy vấn dữ liệu từ nhiều loại tài nguyên (người dùng, sản phẩm, đơn hàng) chỉ trong một lần. -
Dự án có nhiều client với yêu cầu dữ liệu khác nhau
Với GraphQL, mỗi client có thể yêu cầu chính xác dữ liệu mà nó cần, giúp tiết kiệm băng thông và tài nguyên hệ thống. Điều này đặc biệt hữu ích trong các dự án có nhiều ứng dụng frontend (ví dụ: website, mobile app) với các yêu cầu khác nhau. Khi client có thể chủ động lựa chọn các trường dữ liệu mà mình cần, việc giảm thiểu over-fetching và under-fetching là rất quan trọng. -
Ứng dụng cần sự mở rộng dễ dàng mà không ảnh hưởng đến client
Nếu bạn đang phát triển một hệ thống mà có thể thay đổi, bổ sung các tính năng mới mà không làm gián đoạn hoạt động của người dùng, GraphQL là một lựa chọn tuyệt vời. Việc mở rộng hoặc thay đổi schema trong GraphQL không yêu cầu thay đổi phiên bản của API, giúp bạn dễ dàng duy trì và phát triển hệ thống mà không ảnh hưởng đến các client hiện tại.
Khi nào nên sử dụng REST API?
-
Ứng dụng có kiến trúc đơn giản, ít thay đổi
REST API rất phù hợp cho những ứng dụng đơn giản, không yêu cầu quá nhiều sự linh hoạt trong việc truy vấn dữ liệu. Nếu ứng dụng của bạn có một số ít các tài nguyên với mối quan hệ rõ ràng và ít thay đổi, sử dụng REST API là đủ và dễ quản lý. Ví dụ, các trang web đơn giản, các dịch vụ CRUD cơ bản, hoặc những hệ thống không yêu cầu truy vấn dữ liệu phức tạp từ nhiều nguồn sẽ dễ dàng sử dụng REST API. -
Khi API không yêu cầu tính linh hoạt cao
REST API vẫn là sự lựa chọn tốt nếu ứng dụng của bạn không yêu cầu tính linh hoạt cao trong việc truy vấn dữ liệu. Nếu yêu cầu của bạn chỉ đơn giản là thực hiện các thao tác CRUD với các tài nguyên độc lập, REST sẽ dễ sử dụng và triển khai hơn. -
Hệ thống có yêu cầu bảo mật chặt chẽ
REST API có thể dễ dàng tích hợp các cơ chế bảo mật như OAuth, JWT, hoặc các phương thức xác thực đơn giản như Basic Authentication. Việc triển khai bảo mật trong GraphQL có thể phức tạp hơn, đặc biệt khi bạn cần kiểm soát chi tiết từng trường dữ liệu mà client có thể truy cập. Vì vậy, nếu bảo mật là yếu tố quan trọng và bạn chỉ cần truy cập vào các tài nguyên hạn chế, REST API có thể là lựa chọn phù hợp.
Việc lựa chọn GraphQL hay REST API không phải lúc nào cũng đơn giản. Tuy nhiên, hiểu được các ưu điểm và trường hợp ứng dụng của từng công nghệ sẽ giúp bạn đưa ra quyết định đúng đắn cho dự án của mình.
Tương lai của GraphQL
Trong những năm qua, GraphQL đã nhanh chóng chiếm lĩnh thị trường và trở thành một trong những công nghệ phổ biến nhất trong lĩnh vực API. Tuy nhiên, dù có nhiều ưu điểm vượt trội, tương lai của GraphQL vẫn sẽ phụ thuộc vào nhiều yếu tố, bao gồm sự phát triển của các công nghệ cạnh tranh, nhu cầu thị trường và sự thay đổi trong cách tiếp cận kiến trúc ứng dụng. Dưới đây là một số xu hướng và dự đoán về tương lai của GraphQL:
Sự phát triển mạnh mẽ của hệ sinh thái GraphQL
Một trong những yếu tố quan trọng giúp GraphQL duy trì và phát triển trong tương lai chính là sự mở rộng và phát triển mạnh mẽ của hệ sinh thái xung quanh nó. Các công cụ như Apollo Server, Relay và GraphQL.js đã giúp việc tích hợp và sử dụng GraphQL trở nên dễ dàng hơn bao giờ hết. Ngoài ra, việc phát triển các thư viện hỗ trợ client như Apollo Client và urql giúp tối ưu hóa quá trình làm việc với GraphQL.
Việc có một cộng đồng mạnh mẽ và các công cụ hỗ trợ sẽ tiếp tục thúc đẩy GraphQL phát triển mạnh mẽ trong các dự án lớn, đặc biệt là các hệ thống phức tạp với yêu cầu truy vấn dữ liệu đa dạng và phong phú.
Tăng cường hỗ trợ cho các nền tảng đa dạng
GraphQL hiện đang nhận được sự chú ý từ các công ty lớn và nền tảng công nghệ như GitHub, Facebook, và Shopify, tất cả đều đã sử dụng GraphQL cho các API của họ. Các dịch vụ này không chỉ nâng cao khả năng truy vấn dữ liệu mà còn cải thiện hiệu suất và trải nghiệm người dùng.
Với sự gia tăng của các công ty và nền tảng sử dụng GraphQL, khả năng hỗ trợ của nó cho nhiều loại hình ứng dụng sẽ tiếp tục được mở rộng. GraphQL sẽ không chỉ giới hạn trong các dự án frontend, mà còn có thể phát triển mạnh mẽ trong các ứng dụng backend, giúp các hệ thống lưu trữ và xử lý dữ liệu trở nên linh hoạt hơn.
Cải tiến về bảo mật và khả năng kiểm soát truy cập
Mặc dù GraphQL có thể gặp một số thách thức về bảo mật, như khả năng lộ lọt dữ liệu hoặc truy vấn quá mức, nhưng trong tương lai, việc cải tiến bảo mật sẽ là một phần quan trọng để giúp GraphQL phát triển. Các công cụ và phương thức kiểm soát truy cập sẽ trở nên mạnh mẽ hơn, giúp các nhà phát triển dễ dàng quản lý và bảo vệ dữ liệu của người dùng.
Một trong những vấn đề cần giải quyết là việc kiểm soát quyền truy cập vào từng trường trong schema. GraphQL sẽ tiếp tục phát triển với các cơ chế bảo mật và quyền truy cập chi tiết hơn, giúp đảm bảo rằng người dùng chỉ có thể truy vấn dữ liệu mà họ có quyền truy cập.
Tích hợp với các công nghệ mới
GraphQL không chỉ phát triển trong môi trường backend mà còn được tích hợp với các công nghệ mới như serverless, microservices và edge computing. Trong tương lai, GraphQL có thể đóng vai trò quan trọng trong việc kết nối các dịch vụ và chức năng nhỏ gọn, đồng thời tối ưu hóa việc truy xuất dữ liệu từ nhiều nguồn khác nhau, từ các dịch vụ serverless đến các hệ thống phân tán.
Việc kết hợp GraphQL với các công nghệ mới này sẽ giúp tăng cường khả năng mở rộng và linh hoạt, mở ra những cơ hội mới cho việc phát triển ứng dụng và dịch vụ web.
Phổ biến trong các dự án đa nền tảng
Với khả năng hỗ trợ nhiều nền tảng (mobile, web, desktop), GraphQL sẽ ngày càng trở nên phổ biến trong các dự án đa nền tảng, nơi mà việc duy trì một API chung cho tất cả các thiết bị là rất quan trọng. Các công ty và tổ chức có thể tận dụng GraphQL để giảm thiểu việc phải viết lại API cho từng nền tảng riêng biệt, đồng thời tối ưu hóa quá trình giao tiếp giữa client và server.
Nhìn chung, GraphQL có một tương lai sáng sủa và tiếp tục phát triển mạnh mẽ trong các lĩnh vực API và ứng dụng web. Việc hiểu rõ về các lợi ích và tính năng của GraphQL, cũng như sự phù hợp của nó với các dự án cụ thể, sẽ giúp các nhà phát triển và doanh nghiệp đưa ra lựa chọn phù hợp cho hệ thống của mình. Dù GraphQL sẽ không thay thế hoàn toàn REST API trong mọi tình huống, nhưng sự linh hoạt và khả năng truy vấn dữ liệu mạnh mẽ của nó chắc chắn sẽ giúp nó tiếp tục trở thành một công cụ quan trọng trong thế giới phát triển phần mềm.
Kết luận
Như đã trình bày, GraphQL đang chứng tỏ mình là một công nghệ mạnh mẽ, thay thế nhiều hạn chế mà các API truyền thống như REST API gặp phải. GraphQL giúp tối ưu hóa việc truy vấn dữ liệu, cải thiện hiệu suất, giảm thiểu số lần gọi API và đặc biệt là mang đến trải nghiệm người dùng mượt mà hơn. Những tính năng như khả năng lấy dữ liệu theo yêu cầu, hỗ trợ mạnh mẽ cho các ứng dụng di động, và sự linh hoạt trong việc xử lý dữ liệu sẽ tiếp tục thúc đẩy GraphQL phát triển trong tương lai.
Tuy nhiên, điều quan trọng là các nhà phát triển và doanh nghiệp cần phải hiểu rõ các ưu điểm và nhược điểm của GraphQL khi so với REST API để có thể đưa ra lựa chọn phù hợp cho dự án của mình. Mặc dù GraphQL rất mạnh mẽ, nhưng không phải trong mọi tình huống nó đều là lựa chọn tối ưu. Đối với các ứng dụng đơn giản, REST API vẫn là một giải pháp đáng tin cậy và dễ triển khai hơn.
Trong khi GraphQL sẽ tiếp tục phát triển và trở nên phổ biến hơn, việc tích hợp nó vào các ứng dụng hiện tại hay mới cũng sẽ cần thời gian và công sức để đảm bảo tính tương thích và bảo mật. Tuy nhiên, với sự phát triển mạnh mẽ của cộng đồng, các công cụ hỗ trợ, và cải tiến về bảo mật, GraphQL sẽ ngày càng chiếm lĩnh thị trường API trong tương lai, trở thành một phần không thể thiếu trong các hệ thống web hiện đại.
Nếu bạn là một nhà phát triển, việc làm quen và thành thạo GraphQL sẽ là một lợi thế lớn trong sự nghiệp của mình, khi nhu cầu về các API linh hoạt, hiệu quả đang ngày càng tăng cao.
Bài viết mới nhất
Bài 26. Cách Sử Dụng break, continue và return Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách sử dụng câu lệnh break, continue và return trong Java để kiểm soát vòng lặp và luồng thực thi chương trình hiệu quả.
Bài 25. Vòng Lặp do-while Trong Java | Tự Học Java Căn Bản
Hướng dẫn chi tiết về vòng lặp do-while trong Java, cách sử dụng, cú pháp, ví dụ minh họa và so sánh với vòng lặp while.
Bài 24. Cách Chuyển Đổi Số Từ Thập Phân Sang Nhị Phân Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách chuyển đổi số từ hệ thập phân sang hệ nhị phân trong Java bằng nhiều phương pháp khác nhau, kèm theo ví dụ minh họa.
Bài 23. Cách Sử Dụng Vòng Lặp While Trong Java | Tự Học Java Căn Bản
Tìm hiểu cách sử dụng vòng lặp while trong Java với cú pháp, ví dụ thực tế và ứng dụng trong lập trình Java.
Bài viết liên quan
REST API là gì? Kiến Thức Từ A-Z Về REST API
REST API là một trong những khái niệm quan trọng mà mọi lập trình viên backend cần hiểu rõ. Bài viết này sẽ cung cấp kiến thức từ A-Z về REST API, bao gồm định nghĩa, nguyên tắc hoạt động, và cách xây dựng một RESTful API chuẩn.
HATEOAS Là Gì? Cách Xây Dựng API Sử Dụng HATEOAS
Tìm hiểu về HATEOAS, một khái niệm quan trọng trong phát triển API, và cách thức xây dựng API sử dụng HATEOAS để cải thiện khả năng tương tác và mở rộng.
XSS Là Gì? Dấu Hiệu Nhận Biết Và Cách Ngăn Chặn Hiệu Quả
Tìm hiểu về XSS, dấu hiệu nhận biết và các phương pháp ngăn chặn hiệu quả tấn công XSS trong website.
CSS Là Gì? Tại Sao Cần CSS Trong Thiết Kế Giao Diện Website
Tìm hiểu khái niệm CSS và lý do CSS là yếu tố không thể thiếu trong việc thiết kế và tối ưu giao diện website.
