Building a RESTful API with Firebase and Golang

Gerardo Lopez Falcón
Google Cloud - Community
3 min readSep 27, 2023

Building a RESTful API is a fundamental skill for modern web and mobile app development. In this tutorial, we'll explore how to create a robust and scalable API using Firebase as the backend database and Golang (Go) as the programming language. Firebase offers real-time database and authentication services, while Golang provides the flexibility and performance needed for API development.

Prerequisites

Before we dive in, make sure you have the following prerequisites in place:

  1. A Firebase project (Create one at Firebase Console).
  2. Golang installed on your development machine (Download it from the official website).

Setting up Firebase

  1. Create a Firebase Project:
  2. Log in to the Firebase Console.
  3. Click "Add Project" and follow the prompts to create your project.

Enable Firebase Authentication

  1. In your Firebase project dashboard, navigate to "Authentication" and enable the sign-in method (e.g., Email/Password, Google, etc.) you want to use for your API.
  2. Set Up Firestore: In your Firebase project dashboard, click on "Firestore" and create a Firestore database.

Creating the Golang API

In this example, we'll create a simple API to manage a collection of books.

Initialize a New Golang Project:

mkdir firebase-golang-api 
cd firebase-golang-api go
mod init firebase-golang-api

We need the Firebase Admin SDK to interact with Firebase services:

go get firebase.google.com/go

Create the API Code

Here's a simple example of a Golang API to manage books. Create a main.go file with the following code:

package main

import (
"context"
"fmt"
"log"
"net/http"

"firebase.google.com/go"
"firebase.google.com/go/db"
"github.com/gorilla/mux"
"google.golang.org/api/option"
)

const (
firebaseConfigFile = "path/to/your/firebaseConfig.json"
firebaseDBURL = "https://your-firebase-project.firebaseio.com"
)

var (
ctx context.Context
app *firebase.App
)

func main() {
// Initialize Firebase
ctx = context.Background()
opt := option.WithCredentialsFile(firebaseConfigFile)
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
log.Fatalf("Firebase initialization error: %v\n", err)
}

// Initialize Firestore
client, err := app.DatabaseWithURL(ctx, firebaseDBURL)
if err != nil {
log.Fatalf("Firestore initialization error: %v\n", err)
}

// Initialize the Router
router := mux.NewRouter()

// Define API routes (e.g., /api/books)
router.HandleFunc("/api/books", getBooks).Methods("GET")
router.HandleFunc("/api/books/{id}", getBook).Methods("GET")
router.HandleFunc("/api/books", createBook).Methods("POST")
router.HandleFunc("/api/books/{id}", updateBook).Methods("PUT")
router.HandleFunc("/api/books/{id}", deleteBook).Methods("DELETE")

// Start the API server
port := ":8080"
fmt.Printf("Server is running on port %s...\n", port)
log.Fatal(http.ListenAndServe(port, router))
}

// Define API handlers (getBooks, getBook, createBook, updateBook, deleteBook)

Run the API

go run main.go

Your API should now be running locally at http://localhost:8080.

Example API Endpoints

  1. GET /api/books: Retrieve a list of all books.
  2. GET /api/books/{id}: Retrieve a specific book by ID.
  3. POST /api/books: Create a new book.
  4. PUT /api/books/{id}: Update an existing book.
  5. DELETE /api/books/{id}: Delete a book by ID.

Conclusion:

In this tutorial, we've shown you how to create a RESTful API using Firebase as the backend database and Golang for the server-side logic. You can extend this example to build more complex APIs, add authentication, and implement additional features for your web or mobile applications. Combining Firebase's real-time capabilities with Golang's performance and flexibility provides a solid foundation for building scalable and reliable APIs.

Happy coding!

--

--

Gerardo Lopez Falcón
Google Cloud - Community

Google Developer Expert & Sr Software Engineer & DevOps &. Soccer Fan