API mở cung cấp dữ liệu công cộng Việt Nam

Dạo này tình hình dịch bệnh nghiêm trọng, phải ở nhà cả ngày nên mình tranh thủ làm một bộ API HTTP giúp truy cập dữ liệu mở, công cộng của Việt Nam.

Sản phẩm đầu tiên là API cung cấp dữ liệu tỉnh thành Việt Nam tại provinces.open-api.vn, ra mắt vào tháng trước:

Province API

API này dựa trên một thư viện Python, VietnamProvinces, mà mình đã xây dựng hồi còn làm việc tại SunshineTech.

Về stack công nghệ thì API được viết bằng ngôn ngữ Python, theo framework FastAPI. Nó cũng có một trang landing để giới thiệu. Trang landing này thì chỉ là file HTML tĩnh, soạn thảo từ HTML thuần kết hợp với Markdown và dùng công cụ Zola để kết tập. Hệ thống API này được cho chạy trên nền tảng của Vercel để mình không phải tốn chi phí server.

Lí do cho những lựa chọn:

  • Ngôn ngữ Python: Cái này thì chắc khỏi cần giải thích. Viết nhiều bài về Python là đủ thấy mình ưng ý cỡ nào với ngôn ngữ này rồi.
  • Framework FastAPI: Vì bộ API này là một ứng dụng siêu nhỏ, không cần đến cả hệ cơ sở dữ liệu luôn, nên dùng một microframework là phù hợp. Trong các microframework của Python thì mình ưu tiên FastAPI vì nó hiện đại, chạy kiểu bất đồng bộ, tận dụng tính năng chú thích kiểu (type annotation) của Python. Mặc dù làm việc trên một ngôn ngữ kiểu động (dynamic type) như Python nhưng mình lại thích viết code theo lối có định kiểu.
  • Công cụ sinh trang web tĩnh Zola: Đây hẳn là một cái tên xa lạ với nhiều người. Bên thể loại phần mềm này thì mọi người hay nghe Jekyll, Hugo hơn. Lựa chọn này đơn giản vì mình thích chơi đồ độc, lạ, mới, chỉ cần vừa đủ tính năng mình cần. Thêm nữa vì Zola được viết bằng Rust, mà lại sử dụng cú pháp template y hệt Jinja của Python, toàn những cái tên yêu thích.
  • Nền tảng Vercel: Vì bộ API này cho dùng miễn phí, nên mình cần cắt giảm chi phí vận hành, API này cũng là một ứng dụng siêu nhỏ nên cho chạy trên một nền tảng Cloud Function nào đó miễn phí là tốt nhất, đỡ được tiền thuê server. Mình biết đến Vercel hồi Tết năm ngoái, lúc nó còn tên cũ là Zeit Now, khi mình cần triển khai một ứng dụng API khác là CurliPie. Hồi ấy mình đã trải qua, và so sánh với dịch vụ tương tự (cloud function) của các nhà cung cấp khác như Google Cloud, Amazon Web Service, Azure nhưng không ưng ý. Hồi ấy, trớ trêu thay là tất cả các tên tuổi lớn ấy đều không hỗ trợ chạy ứng dụng Python viết theo asyncio/ASGI. CurliPie được thiết kế thành hai thành phần: API backend (FastAPI) và frontend (VueJS) nhưng Google Cloud, Azure thì không hỗ trợ chạy đồng thời hai thành phần đó. Với AWS thì có thể dùng "API Gateway" để có chức năng tương tự, cấu trúc của AWS thì cực kì rườm rà không đáng (không chỉ "API Gateway" đã có cách cấu hình rườm rà mà nó lại lôi thêm Cloud Formation vào cho rối thêm). Thế là lúc ấy chỉ có một tên tuổi bé nhỏ Zeit Now (nay là Vercel) đáp ứng được nhu cầu của mình. Để tưởng thưởng cho tinh thần đó nên bây giờ mình vẫn lại chọn Vercel. Hồi đó mình thậm chí còn đóng góp code sửa lỗi cho Vercel.

API tỉnh thành đi vào hoạt động được một tháng thì hôm nay mình mới làm trang chủ, portal.open-api.vn để làm cổng danh mục các bộ API cho dự án. Dự án này có tên là "Vietnam Open API" và sẽ cung cấp nhiều đầu API cho nhiều thể loại dữ liệu khác nhau. Sau tỉnh thành sẽ là gì thì... chưa biết.

--- Cập nhật ---

Do bị người khác phá hoại nên API này tạm thời không hoạt động. Xem thêm thông tin ở đây.